2012-12-31 6 views
19

GetFiles 메서드의 문서화되지 않은 동작이 발생했습니다. ,이 방법은 C:\Users\ft1\nul 또는 D:\aux 같은 존재하지 않는 파일의 이름을 포함하는 배열을 반환 등 "nul.*" 또는 "aux.bmp"로 메서드에 전달 된 searchPattern 매개 변수가 예약 된 Windows 장치 이름을 포함 할 때마다Directory.GetFiles가 존재하지 않는 파일을 찾습니다.

, 등

I 그 장치 이름이 "."과 같은 컨텍스트를 특별한 의미로 갖는 지 궁금해 할 것입니다. 또는 ".."또는 이것이 일종의 버그 일 경우. 어쨌든, 여전히 이상하게 보입니다. 예를 들어, C#에서이 코드 :

string[] fileNames = Directory.GetFiles(@"C:\D:\..\..\...\", "con.txt"); 
foreach (string fileName in fileNames) Console.WriteLine(fileName); 

인쇄

C:\D:\..\..\...\con 

모든 단서는?

답변

28

이것은 알려져 있습니다. 그것은 관한 운영 체제 디자인 Naming Files, Paths, and Namespaces (Windows)

발췌 : CON, COM4 PRN, AUX, NUL, COM1, COM2, COM3 :

이 파일의 이름은 다음 예약 된 이름을 사용하지 마십시오 , COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 및 LPT9. 또한이 이름 뒤에 확장자가 오는 것을 피하십시오. 예를 들어, NUL.txt는 권장되지 않습니다. 자세한 내용은 네임 스페이스를 참조하십시오.

기본적으로 파일 이름 별칭 (네임 스페이스)이므로 항상 모든 폴더에 전체적으로 존재합니다. 열거하려고하면 존재하기 때문에 다시 가져올 것입니다.

+1

당신은 알고 계십니까? –

+6

좋은 질문입니다, 아마도 실제 SO 질문으로 물어 보는 것이 좋을 것입니다. 그러나 [Windows에서 주어진 문자열이 합법적 인 (허용 된) 파일 이름인지 확인하는 방법] 질문 [http://stackoverflow.com]/questions/62771/given-string-of-legal-allowed-file-name-under-windows)에 대한 요청이 이미 있으면, 나는 당신에게 링크를 줄 것이다. –

+0

에릭 감사합니다. –

10

이들은 MSDOS/NTFS에서 reserved words입니다.

Wikipedia에서

: 또한

는 Windows와 DOS 유틸리티에서, 일부 단어는 예약 할 수 있으며 파일 이름으로 사용할 수 없습니다. 예를 들어, DOS 장치 파일 :

CON, PRN, AUX, CLOCK$, NUL 
COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9 
LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9. 

시스템이 제한이 다른 파일 시스템과 호환성 문제가 발생합니다. 예를 들어, Windows는 이러한 합법적 인 UNIX 파일 이름 인 aux.c, q "uote"s.txt 또는 NUL.txt를 처리하거나 오류 보고서를 작성하지 못합니다. 내부적으로 사용되는

NTFS 파일 이름은 다음과 같습니다 .NET 프레임 워크는 예약 된 이름의 기본 목록이있는 경우

$Mft, $MftMirr, $LogFile, $Volume, $AttrDef, $Bitmap, $Boot, $BadClus, $Secure, 
$Upcase, $Extend, $Quota, $ObjId and $Reparse 
+0

감사합니다. 예약 된 MSDOS 이름을 알고 있지만 내부 NTFS 파일 이름은 새로운 것입니다. 나는 그들이 내 응용 프로그램에서 문제를 일으킬 수 있다고 생각하는 것처럼 그들에게 보여줘야 할 것입니다. –