2015-01-26 2 views
0

예를 들어 ZipArchive이라고 가정 해보십시오. 이 클래스를 사용하면 실제 파일 시스템에 첨부되지 않은 파일 시스템을 처리합니다. 가상 파일 시스템에 대한 경로 식 정규화

아카이브는 다음과 같은 구조를 가지고 말 :

. 
├── Foo 
│ └── File1 
└── Bar 
      └── File2 

이제 하나가 File1를 읽을 수 있습니다. File1File2에 대한 상대 참조가 있으면 ../Bar/File2으로 기록됩니다.

문제는 하나의 결과가합니다 (ZipArchive는 절대 경로와 상대의 조합을 처리 할 수 ​​없습니다) Bar/File2되도록 경로 ../Bar/File2으로 File1 (Foo/)의 디렉토리를 결합 할 수있는 방법입니다. (dirrel)와

시도 솔루션 :

  • Path.Combine(dir,rel)에만 따라서 항목이 해결 될 수없는, 둘 사이에 /을 배치;
  • newDirectoryInfo(Path.Combine(dir,rel)).FullName은 현재 디렉토리 (cd)가 포함 된 파트를 생성합니다. 및
  • Path.GetFullPath(Path.Combine(dir,rel)).FullName는 않습니다 같은 하나는 상대 경로를 정상화 할 수 있습니까

? 물론 정규화 알고리즘을 작성할 수는 있지만 알고리즘이 사양의 일부가 부족할 확률이 높습니다.

답변

0

해결 방법 : 첫 번째 파일 앞에 /을 추가하면 Path.GetFullPath은 첫 번째 파일이 루트에서 비롯된 것임을 알 수 있습니다.

string fullpath = Path.GetFullPath ((Path.Combine ("/",dir,rel))).Substring (1); 

나중에 슬래시를 제거하려면 .Substring을 수행해야합니다. 그러나 이는 지속 가능한 해결책이 아니며, 리눅스 파일 시스템을 사용한다고 가정하고 슬래시를 제거해도 안전하지 않습니다.