ファイルのリストを選択的にコピーし、それらのディレクトリ構造を保持できるようにしたいと考えています。問題は、パスが 256 文字を超えるファイルがかなりあることです。この問題は通常どのように処理されますか?
編集:フォルダーではなくファイルを選択的にコピーしたいだけであることを明確にする必要があります。個々のファイルを効率的にコピーするために robocopy を使用できるとは思わず、それは効果的なフォルダー構造です。
Windows Resource Kitの一部である Robocopy は、このようなケースを処理するように設計されています。
自分でコピー手順を実装しますか? その場合、UNC パスを試しましたか? 私はそれらを使用する必要はありませんでしたが、この MSDN 記事 で説明されているように、プレフィックスを使用すると、パスは MAX_PATH よりもはるかに長くなる可能性があります。
subst
特定のしきい値に達するとすぐに、パスの長さをチェックして を呼び出す VBscript を作成しました。これらの呼び出しは相互に積み重ねられているため、再帰の途中で次のレイアウトが存在します。
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 の各レベルで、より短いパスが生成されます。また、コピー コマンドを発行する前に、長いパスを確認できるように、フォルダーを順番にコピーする必要があることも意味します。
フォルダー内のすべてのファイルがコピーされると、再帰によって 1 レベル戻り ( subst /d
)、ドライブ文字が 1 つ解放されます。
4 ~ 5 個のドライブ文字を使用して、パスが深くなると相互に置き換えます。長さが MAX_PATH の制限を超えるパスをコピーすることができました。
編集
これは、subst でそれを行う一般的な手順を説明しています。どのようにそれを行うかは、ニーズによって異なります。私は常に、「この単一の問題を解決する」という最小限の方法でその小さなサブトリックを使用しました。
たとえば、同じ深さのターゲット パスにコピーするということは、置換されたドライブ文字の別のスタックが必要であることを意味します。
1 つの深くネストされたディレクトリ構造内ですべての .zip ファイルを解凍するには、スタック上でのみ必要になる場合がありますが、.zip 内のフォルダーなどを考慮して、しきい値を少し短くする必要があります。
昔からのハックは、ディレクトリの一部にドライブ文字を割り当てることです。
1 つのオプションは SUBST コマンドです。これにより、ドライブ文字とパスの組み合わせをドライブ文字で置き換えることができます。ディレクトリの短いバージョンを取得するために、インストールパッケージでこれが行われるのを見てきました。
または、共有フォルダーを使用してドライブ文字にマップすることもできます。または、管理共有を使用できます。
しかし、実際に実行できるコードがある場合は、そこで処理する方がこれらのハッキングよりもはるかに優れています。
Sören が提案したように、Robocopy を試してください。
robocopy empty_dir base_nested_dir /purge