長いファイルパスを処理するために、私のWINAPI呼び出しの何が問題になっているのですか?

StackOverflow https://stackoverflow.com/questions/542720

  •  23-08-2019
  •  | 
  •  

質問

私は深いパス(ファイル、robocopyをは問題外ですので、ないフォルダ)をWindowsでファイルをコピーするための最良の方法を把握しようとしてきました。最善の解決策は、私は自分のソリューションを書いている思い付くことができました。私は、万本のキャラクタディープスパスをリストするディレクトリを処理するコードを記述することができましたが、同じアプローチを使用すると、実際にファイルをコピーするために動作していないようです。私は疲れて\?\パスの前に付け、それが動作するようには思えませんでしたと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;
}
役に立ちましたか?

解決

のCopyFile(ないあなたの過負荷、P /呼び出し宣言)への呼び出しは、私がWin32Exceptionを投げるだろうfalseを返す場合:

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

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

Win32Exceptionクラスのデフォルトコンストラクタは、GetLastError関数への呼び出しを行うと、操作が失敗した理由をあなたはより詳細なエラー情報を提供します。

他のヒント

あなたの代わりにCopyFileW関数を呼び出す必要がありますか?最後にWを注意してください。あなたがUNCパスを使用している場合にも、私は知りません。もしそうなら、あなたは接頭辞する必要があります "\\?\ UNC \" の代わります。

これは

取り扱い長いパスのために良い記事です

<のhref = "http://blogs.msdn.com/bclteam/archive/2007/02/13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx" rel = "nofollowをnoreferrer"> http://blogs.msdn.com/bclteam/archive/2007/02/13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top