【问题标题】:Special Characters in File Paths on Windows (c++)Windows 上文件路径中的特殊字符 (c++)
【发布时间】:2014-11-22 15:48:47
【问题描述】:

我似乎卡在 Windows 文件路径中的特殊字符(如 äöü)上。它们是文件夹的合法名称(用户可以设置它们)。

我的程序的一部分必须能够遍历文件系统。尝试输入名为“öö”(测试用例)的子文件夹时,出现目录不存在的错误。

我很确定问题出在这条“线”上:

wstring newPath = oldPath + ffd.cFileName + L"\\";

来自

void reevaluateJob(wstring newPath) {
    WIN32_FIND_DATA ffd;
    HANDLE findFileHandle = FindFirstFile((newPath + L"\*").c_str(), &ffd);
    //skipping invalid case handling and loop
    if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
        if ((wcscmp(ffd.cFileName, L".") != 0) && (wcscmp(ffd.cFileName, L"..") != 0))
            reevaluateJob(newPath + ffd.cFileName + L"\\");  //<=== new path here
    } else {
        //skipping file part
    }
}

因为打印新路径(或 ffd.cFileName 作为 wstring)会产生不同的字符。有没有其他数据类型没有这个问题?

编辑: 只要文件夹名称不包含特殊字符(如 äöü 等),这完全可以正常工作。

【问题讨论】:

  • L"\*" 看起来不像真正的代码。此外,它表示newPath 不是反斜杠终止的。这很可能是这里的基本错误。此外,您可能通过“打印”“wstring”引入了对数据的误解。
  • L 在字符串用于扩展字符集之前。 stackoverflow.com/questions/6384118/…
  • 我会随机猜测 newPath + ffd.cFileName 缺少反斜杠。调试器应该会有所帮助。
  • 您是否尝试过使用#define UNICODE
  • @Cheersandhth.-Alf 使用 wstring 会破坏像 üöä 这样的字符吗?我使用 wcout

标签: c++ windows directory


【解决方案1】:

正如@ArnonZilca 所指出的,#define UNICODE 解决了一半的问题。遗憾的是,并非所有 Windows 功能都遵守该规则。有些人还想要#define _UNICODE

在尝试解决问题的过程中,我还将整个代码更改为使用 WCHAR* 而不是 wstring。我假设(但不能 100% 确定)这不会产生影响。

【讨论】:

  • 我刚刚改回旧版本的代码。使用 wstring 也可以,只要顶部有 #define _UNICODE 和 #define UNICODE。
  • 嗯。通常,我希望编译器为您定义这些。也许您的构建设置有误?
  • 我在 5 天前开始使用 c++。所以它只是一个带有 Windows 控制台 c++ 项目的全新 Visual Studio 2013。
  • 在“配置属性”的“常规”下,“字符集”是什么意思? C/C++ 预处理器下的“预处理器定义”呢? C/C++ 命令行向您显示编译器的命令行;是否包括/D "_UNICODE"/D "UNICODE"
猜你喜欢
  • 2016-10-10
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 2011-10-06
  • 1970-01-01
  • 2016-08-11
相关资源
最近更新 更多