【问题标题】:Program to Create and Move a Pathname with more than 260 characters in Windows在 Windows 中创建和移动超过 260 个字符的路径名的程序
【发布时间】:2015-10-29 18:08:30
【问题描述】:

目的是使用该函数在 C++ 中编写实用程序:

BOOL WINAPI CreateDirectoryW(_In_ LPCTSTR lpPathName, _In_opt_LPSECURITY_ATTRIBUTES lpSecurityAttributes)

目前发现的唯一成功尝试似乎是在Perl script 中,但获得that to work 是另一个问题。此脚本试用前缀

my $path = '\\\\?\\' 

但在其他地方观察到使用“\\?\UNC\”更可靠。 欢迎任何代码块。

编辑:此外,如原始问题标题所示,问题是将文件夹移动到另一个位置(相对路径除外)。这个路径可以用MoveFileEx移动吗?

【问题讨论】:

  • UNC 表格用于网络驱动器。是的,MoveFileEx 应该接受长文件名(前提是您使用的是宽字符版本)。
  • Wrename 可能是更好的选择,因为它适用于另一个驱动器上的操作。
  • 也许不是。那么,如何跨驱动器/文件系统移动 Unicode 目录?
  • 内核不提供在文件系统之间移动目录树的任何函数。 shell API,例如,IFileOperation::MoveItem,也许可以这样做,但我不确定。

标签: c++ c windows pathname


【解决方案1】:

以下内容来自 CreateDirectory function 上的 MSDN 文档。

路径的默认字符串大小限制为 248 个字符。此限制与 CreateDirectory 函数如何解析路径有关。

要将此限制扩展到 32,767 个宽字符,请调用函数的 Unicode 版本并在路径前添加“\?\”。欲了解更多信息,请参阅Naming a File.

请注意,在 C++ 中,与在 Perl 中一样,除非您使用原始字符串文字,否则必须对源代码中的 \ 字符进行转义。因此它将是 “\\?\” 在源代码中。

这里有一个简单的例子来说明如何做到这一点。

BOOL CreatDirWithVeryLongName()
{
    BOOL ret = ::CreateDirectoryW(L"\\\\?\\C:\\This is an example directory that has an extreemly long name that is more than 248 characters in length to serve as an example of how to go beyond the normal limit - Note that you will not be able to see it in Windows Explorer due to the fact that it is limited to displaying files with fewer than 260 characters in the name", NULL);
    return ret;
}

【讨论】:

  • 感谢您的提醒(或提醒),但任何代码块都会很有用。 (稍微编辑问题)
  • MSDN 文档为您提供所需的一切。如果您以前曾经使用过创建目录,那也没什么不同。只需在字符串前面加上前缀即可。
  • 好的,所以我只需要MSDN's attributes code 之类的东西来修改,对吧?
  • 作为参考,我认为代码实际上不会像发布的那样工作 - 使用 \\?\ 前缀允许总路径长度最多为 32,767 个字符,但仍有一个限制 ( 255 个字符?)到路径中每个单独组件的长度。
  • 奇怪的是,在 C 中的 Unicode 构建中,FindNextFileW 使用 L"\\\\?\\C:*" 拾取 C 驱动器上的所有第一级目录,然后就没有办法了判断刚刚使用 L"\\\\?\\C:\\" 创建的嵌套文件夹字符串的第一个文件夹是否是“长”路径,而不是其长度。
【解决方案2】:

This 创建和删除嵌套的长路径,但不移动它们。
移动本质上意味着创建一个新树,其中主要的编码挑战是处理具有不同权限或属性的路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 2018-07-02
    相关资源
    最近更新 更多