【问题标题】:C++: browse filenames in Windows which have dots inside the namesC ++:在Windows中浏览名称中带有点的文件名
【发布时间】:2020-10-16 23:04:18
【问题描述】:

我们以以下文件名为例:abc.def.txt。我使用FindFirstFileA()FindNextFileA() 来浏览目录。函数如下所示:

std::vector<std::string>* readDir(std::string pattern) {
    auto v = new std::vector<std::string>;
    pattern.append("\\*");
    WIN32_FIND_DATAA data;
    HANDLE hFind;
    if ((hFind = FindFirstFileA(pattern.c_str(), &data)) != INVALID_HANDLE_VALUE) {
        do {
            v->push_back(data.cFileName);
        } while (FindNextFileA(hFind, &data) != 0);
        FindClose(hFind);
    }
    return v;
}

问题是前面提到的文件名会显示为abcdef.txtabc def.txt。如何获取带有点的文件名?

【问题讨论】:

  • throw new NotFoundException。这不是你在 C++ 中的做法,我们只是使用 throw NotFoundException。返回类型也是一个没有充分理由的指针。
  • 事实上,我们也不使用异常来控制流。如果您没有找到任何文件,只需返回一个空向量。甚至没有讨论你是如何左右泄漏内存的。或者您打算如何将 Unicode 文件名放入 ANSI 编码的字符串中。
  • 我编辑了问题,以便人们可以专注于主要问题
  • 如果你想让人们专注于问题,把所有的C++代码都拿出来。如果您坚持使用 C++,至少放弃不再使用的部分(原始指针和operator new)。
  • 不知道你是如何测试的,但我无法用这段代码重现。 PS:使用unicode版本。忘记 Windows 上的 ansi API(但这不是这里的问题)

标签: c++ windows file winapi directory


【解决方案1】:

您似乎找到了旧的 8.3 名称。你会想要FindFirstFileExFindExInfoBasic 级别。这会忽略 8.3 名称。

【讨论】:

  • 否,代码显示引用了cFileName。除非两者碰巧相同,否则这绝不是 8.3 的简称。 8.3 名称在cAlternateFileName 字段中返回。
  • 此外,短名称永远不会像“abc def.txt”中那样包含空格。即使通过SetFileShortName手动设置也是不允许的,这将作为无效参数失败。
猜你喜欢
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多