2012-12-31 45 views
19

Tôi vừa tình cờ gặp một hành vi không có giấy tờ của các phương pháp GetFiles trong System.IO.Directory.Directory.GetFiles tìm các tệp không tồn tại

Bất cứ khi nào các tham số searchPattern truyền cho phương pháp này có chứa một tên thiết bị Windows dành riêng, chẳng hạn như "nul.*" hoặc "aux.bmp", phương thức trả về một mảng chứa tên của một tập tin nonexisting, như C:\Users\ft1\nul hoặc D:\aux vv

tôi tự hỏi liệu những tên thiết bị đó có ý nghĩa đặc biệt trong bối cảnh đó, như "." hoặc ".." hoặc nếu đây chỉ là một loại lỗi. Dù sao, điều đó vẫn có vẻ khá lạ. Ví dụ, đoạn mã này trong C#:

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

in

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

Bất kỳ manh mối?

Trả lời

28

Điều này được biết. Nó là một thiết kế hệ điều hành liên quan đến Naming Files, Paths, and Namespaces (Windows)

Trích:

Không sử dụng tên dành riêng sau cho tên của một tập tin: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4 , COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 và LPT9. Cũng nên tránh những tên này theo sau bởi một phần mở rộng; ví dụ, NUL.txt không được khuyến cáo. Để biết thêm thông tin, hãy xem Không gian tên.

Đây là các bí danh tên tệp cơ bản (không gian tên), vì vậy chúng luôn tồn tại trên toàn cầu (trong mỗi thư mục). Nếu bạn cố liệt kê chúng, bạn sẽ lấy lại chúng vì chúng tồn tại.

+1

Bạn có biết nếu .NET Framework có bất kỳ built-in danh sách tên reserved như vậy? –

+6

Đó là một câu hỏi hay, có thể sẽ tốt hơn nếu bạn hỏi đó là câu hỏi SO thực tế, nhưng vì câu hỏi [Kiểm tra xem chuỗi đã cho là tên tệp hợp pháp (được phép) trong Windows?] (Http://stackoverflow.com/question/62771/how-check-if-given-string-là-hợp pháp-cho phép-file-name-under-windows) đã được yêu cầu, tôi sẽ cung cấp cho bạn liên kết. –

+0

Cảm ơn bạn rất nhiều Erik! –

10

Đây là reserved words bởi MSDOS/NTFS.

Từ Wikipedia:

Bên cạnh đó, trong các tiện ích Windows và DOS, một số từ có thể cũng được dự trữ và không thể được sử dụng như tên tập tin. Ví dụ: tệp thiết bị 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. 

Hệ thống có những hạn chế này gây ra sự không tương thích với một số hệ thống tệp khác. Ví dụ: Windows sẽ không xử lý hoặc tăng báo cáo lỗi cho, các tên tệp UNIX hợp lệ này: aux.c, q "uote" s.txt hoặc NUL.txt.

NTFS tên tập tin được sử dụng trong nội bộ bao gồm:

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

Cảm ơn, tôi đã biết tên MSDOS dành riêng nhưng những tên tệp NTFS nội bộ đó mới mẻ đối với tôi. Tôi sẽ phải cung cấp cho họ một cái nhìn như tôi nghĩ rằng họ cũng có thể gây ra vấn đề trong ứng dụng của tôi. –

Các vấn đề liên quan