我正在尝试使用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。

如果filename是LPCTSTR,谁能告诉我如何获取文件信息?或如何将LPCTSTR转换为LPCSTR

为什么此类型转换不起作用?我相信这应该有用。

最佳答案

解决您当前问题的方法是将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 ...
    }
}

10-07 16:19