LPCTSTR到LPCSTR的转换

时间:2013-12-30 06:11:45

标签: c++ string winapi file-handling

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

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

3 个答案:

答案 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 *)。