2010-04-30 8 views
6

어떻게 든 파일이 내 디렉토리 중 하나에 나타나고 확장자 끝에 공백이 있습니다. 이름은 "test.txt"입니다. 이상한 점은 Directory.GetFiles()이이 파일의 경로를 반환하지만 FileInfo 클래스로 파일 정보를 검색 할 수 없다는 것입니다.파일 확장자 뒤에 공백이 있음 -> 이상한 FileInfo 동작

오류는 여기 명단 :

DirectoryInfo di = new DirectoryInfo("c:\\somedir"); 
FileInfo fi = di.GetFileSystemInfos("test*")[0] as FileInfo; 
//correctly fi.FullName is "c:\somedir\test.txt " 
//but fi.Exists==false (!) 

가에서는 FileInfo 클래스가 고장인가? 어떻게 든이 파일에 대한 정보를 검색 할 수 있습니까? 필자는 파일 시스템에이 파일이 어떻게 나타나는지 모릅니다. 그 중 일부 파일을 다시 만들 수는 없습니다.

이 유형의 확장 프로그램으로 새 파일을 만들려고했지만 내 프로그램이 실패했습니다. 그러나 지금은 내 프로그램이 encouch 할 때 충돌이 발생합니다. 파일을 찾을 때 예외를 쉽게 처리 할 수 ​​있지만 소년은 내가 궁금합니다. 이것에 대해 궁금합니다!

+0

OS 디스크 검사기를 실행하여 손상되지 않은 파일인지 확인 했습니까? Windows 기반이라고 가정하는 것이 맞습니까? 그렇다면 어떤 버전입니까? – ChrisBD

+0

Windows Vista Business x86,하지만 필자는 일년 전에, 필자가 직접 파일을 만들었습니다. – Axarydax

답변

5

공백이있는 파일 이름은 잘못된 아이디어로 문서화됩니다. MSDN "Naming Files, Paths, and Namespaces (Windows)"에서

:

  • 는 공백이나 마침표 파일이나 디렉토리 이름을 종료하지 마십시오. 기본 파일 시스템이 이러한 이름을 지원할 수 있지만 Windows 셸 및 사용자 인터페이스는 지원하지 않습니다.

또한, KB 기사 "INFO: Filenames Ending with Space or Period Not Supported"는 : Macintosh 클라이언트가 Windows NT 서버에있는 파일을 만들 때

문제가 발생할 수 있습니다. 후행 공백 및 마침표를 제거하는 코드는 수행되지 않으며 Macintosh 사용자는 정확한 문장 부호로 된 파일 이름을 가져옵니다. Win32 API FindFirstFile()FindNextFile()은 공백이나 마침표로 끝나는 파일 이름을 반환합니다. 그러나 Win32 API를 사용하여 파일을 만들거나 열 수있는 방법은 없습니다.

DirectoryInfo은 아마 FindFirstFile() 및 친구를 사용하여 디렉토리 목록을 생성합니다. File.ExistsGetFileAttributes()을 통해 구현 될 가능성이 높으며 이는 CreateFile()과 같은 문제가 발생하며 존재하지 않는 파일을보고합니다.

따라서 .NET에서는 특별히 문제가 아니지만 Windows 자체에서는 문제가 없습니다.

4

예 이러한 파일에 대해 알고 있습니다. 나도 그런 짐승 한 번 먹었어. 그것을 없애기 위해 C#에서 프로그래밍 방식에 대해 알지는 못하지만 오래된 명령 줄은 친구입니다.

주어진 폴더에서 콘솔 창을 열거 나 cmd을 실행하고 cd 명령). 이제 dir /x을 입력하여이 디렉토리에있는 파일의 짧은 이름을 검색하십시오. 이 이름을 사용하여 del 또는 ren 명령을 사용하여 파일을 삭제하거나 이름을 바꿉니다.

+0

감사합니다, Oliver. 그 dir/x 트릭 않았다. 나는 동일한 문제가 있었고 전체 이름 + 확장명을 사용하여 파일을 삭제하려고 시도했지만 파일을 찾을 수 없다고 들었습니다. 그러나 나는 마침내 짧은 이름을 사용하여 그것을 삭제할 수있었습니다. –

+0

Win32 API를 우회하여 이러한 파일을 조작 할 수 있습니다. 즉, POSIX 서브 시스템 ('mv' 및'touch'와 같은'cygwin' 명령은이 파일 이름을 기꺼이 조작 할 것입니다) 또는 L " \? \ "(Win32 API의 특성을 무시할 가능성이 있습니다.) – vladr