긴 파일 경로를 처리하기 위해 Winapi 호출에 어떤 문제가 있습니까?

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

  •  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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top