我希望能够有选择地复制文件列表并保留它们的目录结构。问题是有不少文件的路径超过 256 个字符。这个问题一般是怎么处理的?
编辑:我应该明确表示我只想选择性地复制文件,而不是文件夹。我认为 robocopy 不能有效地用于复制单个文件及其文件夹结构。
Robocopy 是Windows Resource Kit的一部分,旨在处理此类情况。
您想自己实施复制过程吗?如果是这样,您是否尝试过 UNC 路径?我从来不需要使用它们,但是简单地说,您使用前缀并且路径可以比 MAX_PATH 长得多,如MSDN 文章中所述。
我写了一个 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 命令。这将允许您用驱动器号替换驱动器号和路径组合。我已经在安装包中看到了这一点,以获得更短版本的目录。
Alternativly you can use a shared folder and map it to a drive letter. Or you can use the an administrative share.
But really if you have code that you can run, then handling it there is much better that these hacks.
As Sören suggested, try Robocopy:
robocopy empty_dir base_nested_dir /purge