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