首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LPCTSTR到LPCSTR转换

LPCTSTR到LPCSTR转换
EN

Stack Overflow用户
提问于 2013-12-30 06:11:44
回答 3查看 2.5K关注 0票数 0

我正在尝试使用GetFileInformationByHandle()获取现有文件的信息。执行所需任务的函数接收LPCTSTR Filename作为参数。以下是代码:

代码语言:javascript
复制
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);
}

如果我声明FilenameLPCSTR,那么上面的代码工作得很好,但根据函数的要求,我在LPCTSTR中接收文件名,所以如果使用类型转换,openfile()将找不到指定的文件并返回-1。

如果文件名是LPCTSTR,有人能告诉我如何获取文件信息吗?或者如何将LPCTSTR转换为LPCSTR

为什么这种类型转换不起作用?我认为这是可行的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-30 09:52:23

解决当前问题的方法是用OpenFile()替换CreateFile(),就像文档说的那样:

Note此函数功能有限,不建议使用。对于新的应用程序开发,请使用CreateFile函数。

例如:

代码语言:javascript
复制
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()获得:

代码语言:javascript
复制
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 ...
    }
}
票数 3
EN

Stack Overflow用户

发布于 2013-12-30 06:16:41

仅转换指针并不会改变被指向8位字符的实际数据(即文件名)。

读取MSDN的文档建议使用CreateFile,它处理LPCTSTR文件名。

票数 4
EN

Stack Overflow用户

发布于 2013-12-30 09:44:55

查看Properties/Configuration /General/字符集。这通常设置为UNICODE。它可以改为MBCS。

如果将其设置为MBCS,则不需要修改代码。

如果它被设置为Unicode,否则您不会问这个问题,那么使用Widechartomulti字节将其从LPCTSTR (const wchar_t*)转换为LPSTR (const char*)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20834289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档