2010-04-30 96 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類壞了?我可以以某種方式檢索有關此文件的信息嗎?我真的不知道該文件是如何出現在我的文件系統上的,我無法重新創建更多文件。

我所有試圖用這種類型的擴展名創建一個新文件都失敗了,但是現在我的程序在包含它時崩潰了。我可以很容易地處理找到該文件時的例外情況,但我對這個好奇的男孩是我 !

+0

你有沒有運行操作系統磁盤檢查器,以確保它不是一個損壞的文件? 我們假設這是在Windows下是否正確?如果是這樣的版本? – ChrisBD 2010-04-30 07:12:25

+0

Windows Vista Business x86,但我確定自己在某年前根據日期 – Axarydax 2010-04-30 09:33:13

回答

5

用空格結尾文件名記錄爲壞主意。

從MSDN "Naming Files, Paths, and Namespaces (Windows)"

  • 不要結束一個文件或目錄名稱用空格或句點。儘管底層文件系統可能支持這種名稱,但Windows外殼程序和用戶界面不支持。

此外,知識庫文章"INFO: Filenames Ending with Space or Period Not Supported":當Macintosh客戶端創建一個Windows NT服務器上的文件可能會出現

問題。不執行用於刪除尾隨空格和句點的代碼,並且Macintosh用戶獲取正確標點的文件名。 Win32 API FindFirstFile()FindNextFile()返回以空格或句點結尾的文件名;但是,無法使用Win32 API創建或打開文件。

DirectoryInfo可能使用FindFirstFile()和朋友產生目錄列表。 File.Exists最有可能通過GetFileAttributes()實施,它可能遭受與CreateFile()相同的問題,並且會報告不存在的文件。

因此,在.NET中不是一個問題,而是在Windows本身。

4

是的,我知道這些文件。我也曾經有過這樣一個野獸的事情。爲了擺脫它,我不知道在C#中的編程方式,但良好的舊命令行是你的朋友:

打開給定文件夾中的控制檯窗口(或執行cmd並導航到文件夾cd命令)。現在輸入dir /x以檢索此目錄中文件的短名稱。使用此名稱通過使用delren命令來刪除或重命名文件。

+0

自己創建了該文件。謝謝奧利弗。那dir/x做了詭計。我有同樣的問題,並試圖刪除使用全名+擴展名的文件,但被告知該文件無法找到。不過,我終於可以使用短名稱將其刪除。 – 2011-01-28 13:11:48

+0

你可以通過繞過Win32 API來處理這些文件,也就是通過POSIX子系統('mv'和'touch'等'cygwin'命令將很樂意操縱這些文件名),或者可能通過在路徑前加上L「\ \?「(這也可能會繞過Win32 API的特性。) – vladr 2012-04-15 03:22:22