我正在尝试使用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
。
为什么这种类型转换不起作用?我相信这应该有用。
答案 0 :(得分:4)
只是转换指针不会将指向的实际数据(即文件名)更改为8位字符。
阅读the docs at MSDN建议使用CreateFile
来处理LPCTSTR文件名。
答案 1 :(得分:3)
解决您当前问题的方法是将OpenFile()
替换为CreateFile()
,就像OpenFile()
documentation所说的那样:
注意此功能功能有限,不建议使用。对于新的应用程序开发,请使用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 ...
}
}
答案 2 :(得分:0)
查看项目属性/配置属性/常规/字符集。这通常设置为UNICODE。它可以更改为MBCS。
如果设置为MBCS,则不需要修改代码。
如果设置为Unicode,我怀疑它不会问这个问题,请使用widechartomultibyte将其从LPCTSTR(const wchar_t *)转换为LPSTR(const char *)。