我正在尝试使用GetFileInformationByHandle()获取现有文件的信息。执行所需任务的函数接收LPCTSTR Filename作为参数。以下是代码:
getfileinfo(LPCTSTR Filename)
{
OFSTRUCT oo;
BY_HANDLE_FILE_INFORMATION lpFileInformation;
HFILE hfile=OpenFile((LPCSTR)Filename,&oo,OF_READ);
int err=GetLastError();
GetFileInfomationByHandle((HANDLE)hfile,&lpFileInformation);
}如果我声明Filename为LPCSTR,那么上面的代码工作得很好,但根据函数的要求,我在LPCTSTR中接收文件名,所以如果使用类型转换,openfile()将找不到指定的文件并返回-1。
如果文件名是LPCTSTR,有人能告诉我如何获取文件信息吗?或者如何将LPCTSTR转换为LPCSTR。
为什么这种类型转换不起作用?我认为这是可行的。
发布于 2013-12-30 09:52:23
解决当前问题的方法是用OpenFile()替换CreateFile(),就像文档说的那样:
Note此函数功能有限,不建议使用。对于新的应用程序开发,请使用CreateFile函数。
例如:
getfileinfo(LPCTSTR Filename)
{
HANDLE hFile = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
int err = GetLastError();
// handle error as needed ...
}
else
{
BY_HANDLE_FILE_INFORMATION FileInfo = {0};
BOOL ok = GetFileInformationByHandle(hFile, &FileInfo);
int err = GetLastError();
CloseHandle(hFile);
if (!ok)
{
// handle error as needed ...
}
else
{
// use FileInfo as needed...
}
}
}尽管如此,更好的解决方案是根本不打开文件。GetFileInformationByHandle()返回的大部分信息可以使用FindFirstFile()获得:
getfileinfo(LPCTSTR Filename)
{
WIN32_FIND_DATA FileData = {0};
HANDLE hFile = FindFirstFile(Filename, &FileData);
if (hFile == INVALID_HANDLE_VALUE)
{
int err = GetLastError();
// handle error as needed ...
}
else
{
FindClose(hFile);
// use FileData as needed ...
}
}发布于 2013-12-30 06:16:41
仅转换指针并不会改变被指向8位字符的实际数据(即文件名)。
读取MSDN的文档建议使用CreateFile,它处理LPCTSTR文件名。
发布于 2013-12-30 09:44:55
查看Properties/Configuration /General/字符集。这通常设置为UNICODE。它可以改为MBCS。
如果将其设置为MBCS,则不需要修改代码。
如果它被设置为Unicode,否则您不会问这个问题,那么使用Widechartomulti字节将其从LPCTSTR (const wchar_t*)转换为LPSTR (const char*)。
https://stackoverflow.com/questions/20834289
复制相似问题