2013-07-08 2 views
1

파일 경로에서 파일 이름을 가져 오는 방법은 다른 OSX 또는 Windows에서 파일을 업로드 할 수 있습니다. 달성하기 위해 노력하고 무엇을 도전하고 무엇
은 다음과 같습니다 :파일 경로에서 파일 이름을 가져 오는 중 문제가 발생했습니다.

  • 내 목표는 어떤 잘못된 문자가있는 경우 파일 이름을 소독하는 것입니다. 예 : OSX는 \이며 Windows 파일 시스템에서 허용하지 않는 다른 문자는 거의 허용하지 않습니다. alg는 \_으로 바꿉니다.
  • 때때로 일부 브라우저 (IE)는 전체 경로를 파일 이름으로 내 코드로 보냅니다. 내가 창에서 네트워크에서 공유 파일을 업로드 할 경우에 따라서, IE는 \\\\servername\\folder\\filenmae.txt

로 이름을 전송 - 내가 OSX에서 나오는 파일 이름은 |, > 같은 잘못된 문자를 가질 수 있기 때문에, FILEINFO 또는 경로 사용할 수 없습니다, <이고 Mac OSX에서 파일 이름이 \\path\ex\file이라면 fileinfo 나 path는 전체 이름 대신 파일 이름으로 "file"을 제공합니다.

- 지금 파일 이름이있는 경우, :를 \ 경로에, 나는 쉽게 filename.Substring(filename.LastIndexOf(@"\") + 1)
을 사용하여 파일 이름을 추출 할 수 있습니다 -하지만 창에 전체 경로 패턴 파일을 공유하기 때문에 내 문제는 공유 파일입니다 수 OSX에서 파일 이름이되어야합니다.

전체 이름은 어떻게 얻을 수 있습니까?
제안 사항을 보내 주시면 감사하겠습니다.

+3

'\\ a \ b \ c.txt'는 Windows의 전체 경로인지 아니면 * nix의 비정상적인 파일 이름인지 알 길이 없습니다. – SLaks

+0

OSX에서 파일 이름에 적용되는 규칙은 무엇입니까? –

+0

google please !, 나는 알고있다 :-) – din

답변

0

@Dour High Arch에 대한 감사의 말에 감사드립니다. 마침내 해결책을 찾아 냈습니다. fileInfo 클래스를 사용하면 Path를 사용하여 수행 할 수 있지만 아직 테스트하지는 않습니다.

try 
{ 
    FileInfo fileInformation = new FileInfo(tempFileName); 
    String directory = fileInformation.DirectoryName; 
    if (tempFileName.StartsWith(directory)) 
    { 
    filename = fileInformation.Name; 
    } 
} 
catch (Exception arugmentException) 
{ 
    if (!((arugmentException is ArgumentException) || 
    (arugmentException is NotSupportedException))) throw; 
} 
2

난 당신이 Path의 정적 인 방법을 사용하려는 생각 : 다른 사람들이 지적했듯이

Path.GetFileName(string);Path.GetDirectoryName(string);

+1

은 OSX에서 작동하지 않습니다. osx에있는 파일의 예제 파일 이름은 test <>/\. txt이며, 예외가 발생합니다. 둘째, 파일 이름이 OSX에서 true 경로 인 경우 두 번째로 예외가 발생합니다. – din

1

을; 이것은 작동하지 않습니다. 모든 OS에서 작동하는 파일 이름이나 단일 OS의 모든 파일 시스템에서 작동하는 파일 이름을 작성할 수 없습니다. Windows에서 ISO 9660 드라이브로 NTFS 파일을 복사하려고하면이 문제가 발생합니다.

파일 이름을 "sanitize"하지 마십시오. 규칙은 너무 신뢰할 수없고 파일 시스템 전반에 걸쳐 충돌합니다. OS의 API를 사용하여 System.IO.Path.GetTempFileName 또는 System.Windows.Controls.OpenFileDialog과 같은 파일을 생성하십시오. 프로그래밍 방식으로 파일 이름을 구성하려는 경우 "MyFile"과 시퀀스 번호 또는 16 진수 GUID와 같은 모든 클라이언트 파일 시스템에서 사용할 수있는 이름을 API에 전달하고 그렇지 않은 경우 파일 시스템 예외에 대비하십시오. 작업.

파일 시스템간에 파일을 복사하는 경우 원래 파일 이름을 저장하여 사용자에게 표시하고 파일 저장 대화 상자 등의 기본값으로 사용하는 것이 좋습니다. 그러나 다시 작성하지 마십시오. 그 (것)들에 의지하기 위하여 프로그램.

+0

나는 누군가가 OS X에서 파일 이름 텍스트 <>/\. txt로 파일을 업로드하고 다른 사람이 창에서 다운로드하려고하면 어떻게되는지 이해합니다. (나는 그것을 어떻게 저장할지 무시한다.) – din

+0

UI에 "text <>/\. txt"라는 이름을 보여준다. Windows에 저장하려고하면이 파일이 던져 지므로 사용자가 다시 시도하거나 자신의 이름을 만들어야합니다. 그러나 이는 사용자의 모든 파일 이름에서 발생할 수 있습니다. 그 이름이 다른 파일 시스템에서 왔는지는 관계가 없습니다. –

+0

좋은 생각이지만, 내 작업은 이러한 파일의 이름을 바꾸는 것입니다. 지금은 일시적인 해결책으로 try {filename = path.getFileName (fileName)} catch (Exception e) {if (! (e is ArgumentException) throw;} filename = renameFileName (fileName); – din

관련 문제