【问题标题】:What happens when "file_with_invalid_chars:<?>.txt" is passed to the MFC CFile class?将“file_with_invalid_chars:<?>.txt”传递给 MFC CFile 类时会发生什么?
【发布时间】:2011-04-05 10:53:13
【问题描述】:

注意:需要编辑标题和问题,因为最初我认为问题出在::CreateFile[W] - 但事实证明,该错误仅在我使用 MFC 的 Cfile 类时发生在 XP 上。

当我将文件名 file_with_invalid_chars:&lt;?&gt;.txt 传递给此函数以请求创建文件时,CFile::Open(...)(在 Win7/64 位上)的行为让我有些困惑。

在我的 Windows XP 机器上,调用失败。

在我的 Win7/64 机器上,调用成功,创建了一个名为 file_with_invalid_chars 的文件。

发生了什么事?

【问题讨论】:

    标签: windows winapi visual-c++ windows-7 mfc


    【解决方案1】:

    我猜它正在创建一个alternate data stream。不过,它在 XP 上会失败似乎很奇怪。文档说对于文件名合法的字符对于流名也是合法的,尽管我猜这并不一定意味着反之亦然。也许 Windows 7 在流名称中支持 而 Windows XP 不支持。

    【讨论】:

    • 是的,问题与 ADS 有关。但事实证明它只适用于 MFC Cfile,而不是一般的 CreateFileW。
    【解决方案2】:

    事实证明这是由于 shlwapi.dll 中的错误修复(?) -

    MFC 的CFile 类对文件名做了一些内部处理,并且恰好调用了PathStripToRoot Function

    此函数驻留在 Shlwapi.dll 中,Win7 附带比 Windows XP 更新的版本。

    Windows XP 中的版本显然不适用于包含 ADS 冒号分隔的流名称的文件路径。

    例子:

    • 在 XP 上 PathStripToRoot(L"C:\\temp\\file.txt:stream");yield 字符串 C:\temp\file.txt: 不正确并导致从 CFile::Open 返回错误
    • 在 Win7 上,相同的调用会产生实际的根 C:\

    【讨论】:

      猜你喜欢
      • 2017-04-19
      • 1970-01-01
      • 2015-09-21
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多