2010-04-30 20 views
6

Bằng cách nào đó tệp đã xuất hiện trong một trong các thư mục của tôi và nó có dấu cách ở cuối phần mở rộng của nó - tên của nó là "test.txt". Điều kỳ lạ là Directory.GetFiles() trả lại cho tôi đường dẫn của tệp này, nhưng tôi không thể truy xuất thông tin tệp với lớp FileInfo.Không gian trống sau khi mở rộng tập tin -> hành vi FileInfo lạ

Lỗi biểu hiện ở đây:

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 (!) 

là FileInfo lớp vỡ? Tôi có thể lấy lại thông tin về tập tin này bằng cách nào? Tôi thực sự không biết làm thế nào mà tập tin đó xuất hiện trên hệ thống tập tin của tôi, và tôi không thể tái tạo thêm một số trong số chúng.

Tất cả nỗ lực của tôi để tạo tệp mới với loại tiện ích mở rộng này đều không thành công, nhưng bây giờ chương trình của tôi là bị lỗi khi mã hóa nó. Tôi có thể dễ dàng xử lý các trường hợp ngoại lệ khi tìm kiếm các tập tin, nhưng cậu bé tôi tò mò về điều này!

+0

Bạn có chạy trình kiểm tra đĩa OS để đảm bảo rằng tệp đó không phải là tệp bị hỏng không? Chúng tôi có thể chính xác để giả định rằng điều này là dưới Windows? Nếu có phiên bản nào? – ChrisBD

+0

Windows Vista Business x86, nhưng tôi chắc chắn rằng bằng cách nào đó tôi đã tạo ra tệp của mình, cách đây khoảng một năm, theo ngày – Axarydax

Trả lời

5

Kết thúc tên tệp có khoảng trắng được ghi nhận là Ý tưởng không hợp lệ.

Từ MSDN "Naming Files, Paths, and Namespaces (Windows)":

  • Đừng kết thúc một tập tin hoặc tên thư mục với một không gian hoặc một thời gian. Mặc dù hệ thống tệp cơ bản có thể hỗ trợ các tên như vậy, giao diện người dùng và trình bao Windows không.

Ngoài ra, bài viết KB "INFO: Filenames Ending with Space or Period Not Supported":

vấn đề có thể phát sinh khi một khách hàng Macintosh tạo ra một tập tin trên máy chủ Windows NT. Mã để xóa dấu cách và khoảng thời gian không được thực hiện và người dùng Macintosh nhận được tên tệp có dấu câu đúng. Các Win32 APIs FindFirstFile()FindNextFile() trả lại tên tệp kết thúc bằng dấu cách hoặc trong một khoảng thời gian; tuy nhiên, không có cách nào để tạo hoặc mở tệp bằng API Win32.

DirectoryInfo có thể sử dụng FindFirstFile() và bạn bè để tạo danh sách thư mục. File.Exists có nhiều khả năng được triển khai thông qua GetFileAttributes() có thể gặp vấn đề tương tự như CreateFile() và sẽ báo cáo tệp không tồn tại.

Do đó, không phải là vấn đề trong .NET cụ thể, nhưng trong chính Windows.

4

Có tôi biết các tệp này. Tôi cũng đã từng có một điều thú vị như vậy. Để loại bỏ nó tôi không biết về cách lập trình trong C#, nhưng dòng lệnh cũ tốt là bạn của bạn:

Mở cửa sổ bảng điều khiển trong thư mục đã cho (hoặc thực hiện cmd và điều hướng đến thư mục đó cd lệnh). Bây giờ, hãy nhập dir /x để truy xuất tên rút gọn của các tệp trong thư mục này. Sử dụng tên này để xóa hoặc đổi tên tệp bằng cách sử dụng lệnh del hoặc ren.

+0

Cảm ơn bạn, Oliver. Điều đó dir/x đã làm các trick. Tôi đã có cùng một vấn đề và cố gắng xóa các tập tin bằng cách sử dụng tên đầy đủ + phần mở rộng nhưng đã nói với tập tin không thể được tìm thấy. Tuy nhiên cuối cùng tôi đã có thể xóa nó bằng cách sử dụng shortname. –

+0

Bạn sẽ có thể thao tác các tệp này bằng cách bỏ qua API Win32, tức là thông qua hệ thống con POSIX (lệnh 'cygwin' như' mv' và 'touch' sẽ sẵn sàng thao tác các tên tệp này) hoặc có thể bằng cách thêm đường dẫn với L" \ \? \ "(điều này cũng có khả năng bỏ qua các đặc tính của API Win32.) – vladr

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