긴 파일 경로를 처리하기 위해 Winapi 호출에 어떤 문제가 있습니까?
-
23-08-2019 - |
문제
깊은 경로가있는 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;
}
해결책
CopyFile (오버로드가 아닌 P/호출 선언)에 대한 호출이 거짓을 반환하면 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를 호출하고 작업에 실패한 이유에 대한 자세한 오류 정보를 제공합니다.
다른 팁
대신 함수 CopyFileW를 호출해야합니까? 끝에 w를 기록하십시오. 또한 UNC 경로를 사용하고 있는지 모르겠습니다. 그렇다면 대신 "? unc "로 접두사해야합니다.
이것은 긴 경로 처리를위한 좋은 기사입니다
http://blogs.msdn.com/bclteam/archive/2007/02/13/long-pathss-in-net-part-1-of-3-kim-hamilton.aspx
제휴하지 않습니다 StackOverflow