2

Windows で深いパス (フォルダーではなくファイルであるため、robocopy は問題外) を使用してファイルをコピーする最良の方法を見つけようとしています。私が思いついた最善の解決策は、私自身の解決策を書くことです。10,000 文字の深いパスを持つディレクトリの一覧表示を処理するコードを作成できましたが、同じアプローチを使用しても、実際にファイルをコピーすることはできないようです。パスの前に \?\ を付けて System.IO ライブラリを使用するのに疲れましたが、うまくいかないようでした。

[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CopyFile(string lpExistingFileName, string lpNewFileName,
   bool bFailIfExists);

public static bool CopyFile(string source, string dest)
{
    source = fixPathForLong(source);
    dest = fixPathForLong(dest);

    return CopyFile(source, dest, false);
}

private static string fixPathForLong(String path)
{
    if (!path.StartsWith(@"\\?\"))
        path = @"\\?\" + path;
    return path;
}
4

2 に答える 2

3

代わりに関数 CopyFileW を呼び出す必要がありますか? 末尾の W に注意してください。また、UNC パスを使用しているかどうかもわかりません。その場合は、代わりに「\\?\UNC\」を前に付ける必要があります。

これは、長いパスを処理するための良い記事です

http://blogs.msdn.com/bclteam/archive/2007/02/13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx

于 2009-09-29T21:42:27.113 に答える
2

CopyFile への呼び出し (オーバーロードではなく、P/Invoke 宣言) が false を返した場合、Win32Exception がスローされます。

public static void CopyFile(string source, string dest)
{
    source = fixPathForLong(source);
    dest = fixPathForLong(dest);

    if (!CopyFile(source, dest, false))
    {
        throw new Win32Exception();
    }
}

Win32Exception クラスの既定のコンストラクターは GetLastError を呼び出し、操作が失敗した理由に関する詳細なエラー情報を提供します。

于 2009-02-12T18:54:58.767 に答える