gpt4 book ai didi

c++ - 检查 fopen 不支持的文件名

转载 作者:行者123 更新时间:2023-11-30 02:58:57 25 4
gpt4 key购买 nike

我正在尝试打开一个文件以便稍后处理。我的问题是,如果我的文件名不是 ANSI(阿拉伯语、印地语...) fopen_sfopen 拒绝打开它并给我一个 Invalid argument 错误。我不能使用 CreateFile() 来做到这一点,所以我想检查一下我的文件名是否受 fopen 支持(尝试打开它)并创建一个临时文件改为文件:

QString fileN=QString::fromWCharArray(fname); 
QFileInfo file(DIRPath+"/"+fileN);
bool Supported=true;
if(file.exists()) {
QString temp;
char* Fname=(char*)malloc(260*sizeof(char));
strcpy(Fname,(QString(DIRPath+"/"+fileN).toStdString()).c_str());
FILE* Filedesc;
errno_t err=fopen_s(&Filedesc,Fname,"rb");
if(Filedesc!=NULL) {
qDebug()<<"\nfile opened ";
fclose(Filedesc);
} else if(err==22) {
qDebug()<<"\nfail to open file error 22: Invalid argument";
temp=QString(DIRPath+"/Temp"+QString::number(nb));
Supported=false;
} else qDebug()<<"\nfail to open file error"<<GetLastError()<<"errno"<<errno<<"strerrno"<<strerror(errno);
Fname=NULL;
free(Fname);
...

我的问题是:任何人都可以为我澄清 UNICODE/ANSI 混淆吗?到目前为止我安全吗?还是有更多的预防措施需要考虑?有没有更安全的方法来检查给定名称是否不是 ANSI?

在此先感谢您,我们将不胜感激。

编辑 1

我尝试了这个但没有成功:CreateFile() 返回一个 INVALID_HANDLE_VALUEGetLastError() 返回 0

//WCHAR fname[]=L"D:/أحدالأنشطة.txt";
char* name="D:/أحدالأنشطة.txt";
wchar_t* nameW=(wchar_t*)malloc(sizeof(wchar_t)*17);
qDebug()<<"s :"<<mbstowcs(nameW,name,17);
//QString path=QString::fromWCharArray(fname,17);
//QString path=QString::fromLatin1(name,17);

HANDLE fileHandle = CreateFile( nameW, // file to open
GENERIC_READ, // open for reading
FILE_SHARE_READ, // share for reading
NULL, // default security
OPEN_EXISTING, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL);

if (fileHandle == INVALID_HANDLE_VALUE)
{
qDebug()<<"CreateFile failed!\n"<<GetLastError();
nameW=NULL;
free(nameW);
return 2;
}else
qDebug()<<"CreateFile succeeded!\n";

int fd = _open_osfhandle((intptr_t) fileHandle, _O_RDONLY);
FILE* fstr = _fdopen(fd, "r");
QFile indirect;
if (!indirect.open(fstr, QIODevice::ReadOnly))
qDebug()<<"QFile open against file descriptor failed!\n";
else
{
qDebug()<<"QFile open against file descriptor succeeded!\n";
indirect.close();
}

// This will fail
QFile direct(path);
if (!direct.open(QIODevice::ReadOnly))
qDebug()<<"QFile open of filename directly failed!\n";
else
{
qDebug()<<"QFile open of filename directly succeeded!\n";
direct.close();
}
nameW=NULL;
free(nameW);

编辑 2

QString fname(QFile::decodeName("D:/أحدالأنشطة.txt"));
QFile qFile(fname);

bool b=qFile.open(QIODevice::ReadOnly);
if(b)
{
FILE* filedesc = fdopen(qFile.handle(), "rb");
if(filedesc!=NULL)
{
char* nb=(char*)malloc(2*sizeof(char));
qDebug()<<"opened ";
size_t size=fread(nb,sizeof(char),2,filedesc);
fclose(filedesc);
qDebug()<<"filedesc closed size "<<size<<"nb "<<QString::fromAscii(nb,2);
nb=NULL;
free(nb);

}else qDebug()<<"filedesc failed error"<<strerror(errno);


}else
qDebug()<<"qFile failed error"<<strerror(errno);

最佳答案

您可能应该使用 QFile 打开文件,然后将 QFile::handle() 传递给您的 C 函数。在 C 代码中,您将使用 fdopen()FILE* 流关联到文件描述符。请注意,您在 fdopen() 中使用的模式应该与您在 QFile::open() 中使用的模式兼容。例如:

void c_func(int fd)
{
FILE* file = fdopen(fd, "rb");
// ...
}

关于c++ - 检查 fopen 不支持的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13357880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com