【发布时间】:2010-09-19 04:32:06
【问题描述】:
我希望能够选择性地复制文件列表并保留其目录结构。问题是有不少文件的路径超过 256 个字符。这个问题一般是怎么处理的?
编辑: 我应该明确表示我只想选择性地复制文件,而不是文件夹。我认为 robocopy 不能有效地用于复制单个文件及其文件夹结构。
【问题讨论】:
我希望能够选择性地复制文件列表并保留其目录结构。问题是有不少文件的路径超过 256 个字符。这个问题一般是怎么处理的?
编辑: 我应该明确表示我只想选择性地复制文件,而不是文件夹。我认为 robocopy 不能有效地用于复制单个文件及其文件夹结构。
【问题讨论】:
Robocopy 是Windows Resource Kit 的一部分,旨在处理此类情况。
【讨论】:
您想自己实现复制过程吗?如果是这样,您是否尝试过 UNC 路径?我从来不需要和他们一起工作,但简单地说,你使用前缀并且路径可以比 MAX_PATH 长得多,如 in this MSDN article 所述。
【讨论】:
我编写了一个 VBscript,它检查路径长度并在达到某个阈值时调用subst。这些调用相互堆叠,因此在递归中间,存在这种布局:
C:\a\very\long\path
subst K: "C:\a\very\long\path"
K:\another\very\long\path
subst L: "K:\another\very\long\path"
L:\yet\another\very\long\path
subst M: "L:\yet\another\very\long\path"
xcopy M:\*.* "D:\target"
这样每一层的 subst 都会生成一个更短的路径。这也意味着,您必须按顺序复制文件夹,以便在发出复制命令之前能够检查长路径。
复制文件夹中的所有文件后,递归会跳回一级 (subst /d),从而释放一个驱动器号。
使用 4-5 个驱动器号,当路径变深时,它们相互替代,我能够复制长度超过 MAX_PATH 限制的路径。
编辑
这描述了使用 subst 执行此操作的一般过程。你怎么做取决于你的需要,我总是以最小的“解决这个单一问题”的方式使用这个小技巧。
例如,复制到同样深的目标路径意味着您需要另一堆替换的驱动器号。
在一个深度嵌套的目录结构中解压缩所有 .zip 文件可能只需要在堆栈上,但您需要稍微缩短阈值以考虑 .zip 中的文件夹等。
【讨论】:
过去的一个技巧是为目录的一部分分配一个驱动器号。
一个选项是 SUBST 命令。这将允许您用驱动器号替换驱动器号和路径组合。我已经在安装包中看到了这一点,以获得更短版本的目录。
或者,您可以使用共享文件夹并将其映射到驱动器号。或者您可以使用管理共享。
但实际上,如果您有可以运行的代码,那么处理它要比这些 hack 好得多。
【讨论】:
按照 Sören 的建议,试试 Robocopy:
robocopy empty_dir base_nested_dir /purge
【讨论】: