문제

배경

.NET 버전 2.0을 최고로 사용하여 도구를 작성해야합니다 (선반에서 무언가를 사용하는 것은이 클라이언트가 정치적, 상업 및 기밀성/신뢰 이유를위한 옵션이 아닙니다)를 네트워크를 통해 한 서버에서 다른 서버로 마이그레이션합니다. 서버는 로컬 팀의 파일 서버이며, 특정 팀 폴더는 재구성을 용이하게하기 위해 다른 서버로 마이그레이션해야합니다. 기본 아이디어는 각 파일을 읽고 몇 시간 만에 네트워크를 통해 스트리밍하고 며칠 후에 데이터가 마이그레이션됩니다. 파일 권한을 보존해야합니다. 여기에는 며칠이 걸리므로 (일부 팀의 경우 여러 기가 바이트의 데이터에 대해 이야기하고 있습니다) 매일 밤 파일을 반복하고 수정 날짜를 비교하고 변경된 날짜를 업데이트해야합니다. 이론은 결국 새 서버에 최신 파일 사본이 있고 사용자는 새 서버로 전환 할 수 있다는 것입니다. 물론 이것은 단순하지는 않지만 우리는 우리가 작동해야한다고 생각하는 디자인이 있습니다 :)

문제

이론적으로 우리는 파일을 열고 네트워크를 통해 스트리밍하고 다른 쪽 끝에 작성하십시오. :)

불행히도 서버 자체에서 파일 공유는 다음과 같은 폴더 경로에서 작성되었습니다.

D : Data Team Shares Division Department Team의 이름 - 상당히 길 수 있습니다

각 사용자의 경우이 경로는 드라이브에 매핑됩니다. 예를 들어 Server TeamName으로 공유되고 T : 드라이브에 매핑됩니다.

이로 인해 T : 드라이브에서 보이는 파일이 MAX_PATH 그러나 제한 사항이지만 서버 자체에서 로컬로 볼 때 그 이상으로 이동합니다. 이 도구가 일반이어야하기 때문에 네트워크 공유를 사용하여 파일에 액세스 할 수없고, 수백 개의 서버에서 실행되기 위해서는 우리가 이동 해야하는 파일 공유가 어떤 파일 공유인지 알 수있는 표준 방법이 없습니다. 명명 컨벤션 표준이 없습니다. 또한 때때로 다른 주식의 하위 공유가 있으므로 우리는 MAX_PATH 두 번 제한하십시오!

"? "접두사를 사용하여 경로를 지정하여 경로를 UNC 경로로 취급하고 이론적 인 최대 32k 문자를 허용하는 해결 방법을 알고 있습니다.

이 해결 방법은 Win32 API 레벨에서 구현되며 System.io 네임 스페이스는 기본적으로 기본적으로 기본 Win32 API 기능을 중심으로 얇은 래퍼이지만 Microsoft . 이 경우 .NET 프레임 워크는 '?'라고 주장하기 때문에 경로를 거부하고 있습니다. 유효하지 않은 경로 문자입니다.

그래서 내 질문은 ... 거의 전체 시스템을 완전히 다시 작성하지 않고도이 문제를 해결할 수 없을 것이라고 생각한 방법이 있습니까? 이 성가신 검증을 제거 하시겠습니까?

도움이 되었습니까?

해결책

BCL 팀은 이러한 선택이 왜 이루어 졌는지와 주변의 작업이 무엇인지 정확히 3 부 시리즈를 수행했습니다. 당신이 아직 읽지 않았다면, 나는 그것이 주제에 대한 훌륭한 정보 소스이기 때문에 당신이 할 것을 제안합니다.

다른 팁

도움이 될 수있는 하나의 타사 솔루션을 만났습니다. 알파프.

소프트웨어가 필요한 권한이 있다고 가정 할 때 약간의 플랫폼 호출 로이 제한 사항을 해결하는 것이 매우 쉽습니다.

[DllImport("kernel32.dll", SetLastError = true)]
static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess,
  uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition,
  uint dwFlagsAndAttributes, IntPtr hTemplateFile);

// Must close/dispose handle separately from FileStream since it's not owned by
// that object when passed to constructor.
using (SafeFileHandle h = CreateFile(longUncPath, GENERIC_WRITE, 0, IntPtr.Zero, 
       OPEN_EXISTING, 0, IntPtr.Zero))
{
    using (var fs = new FileStream(h, FileAccess.Read))
    {
        // operations with FileStream object
    }
}

subs.exe (또는 내부적으로 사용하는 API)를 사용하여 상위 디렉토리를 매핑하여 경로를 단축 할 수 있습니다.

http://www.makeuseof.com/tag/how-to-map-a-local-windows-folder-to-drive-letter/

이상적으로 당신은 가능한 한 길을 따라 가면됩니다.

아래 작은 스크립트를 사용하여 디렉토리 구조를 성공적으로 삭제했습니다. Pushd는 UNC 형식을 사용하여 260 제한 대신 32k를 제공합니다.

set "folder=\\SERVER\SHARE\DIVISION\DEPARTMENT\NAME OF TEAM - COULD BE FAIRLY LONG\" 
pushd "%folder%"
for /d %%i in ("*") do rmdir "%%i" /s /q
popd
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top