2011-02-16 54 views
1

我知道這個問題之前已經被問到過(實際上,我發現了或多或少相同問題的許多實例,但沒有令人滿意的解決方案),但我要重寫它有點不同。 我想使用FileInfo來獲取是否可以在特定磁盤(硬盤/ USB卡/等)上創建(新)文件的指示。和目錄。如何知道是否可以創建未知文件而不嘗試創建並捕獲IOException

目前的問題我面對:

  1. 如果我要創建的文件位於寫保護磁盤/ USB卡的/ etc上。 - 拋出一個IOException,只是問題在於它會在一定的延遲之後拋出(可能在調用Flush()之後)

  2. 由於我想創建的文件不存在,FileInfo.IsReadOnly會總是返回true,即使給定的路徑實際上沒有寫保護! 只有在文件已存在且不是隻讀的情況下,它纔會返回false。

那麼我怎麼能知道是否有可能創建一個特定的文件之前,試圖實際創建它?

謝謝..

+0

你想檢查文件是否存在?或者你想檢查文件是否存在並且是寫保護的(意思是隻讀)? – 2011-02-16 12:06:57

+0

@sachin:他想檢查是否可以在磁盤上創建一個文件,而不需要創建它..沒有延遲。 – 2011-02-16 12:12:02

+0

就像@Levisaxos說的。 – programmer 2011-02-16 12:38:42

回答

2

在一般情況下沒有。即使你可以在你做檢查和你嘗試創建文件之間改變條件。例如。用戶刪除拇指驅動器或某人更改文件權限。

但是,您可以通過查看父目錄的DirectoryInfo來建立一個相當不錯的估計。
檢查DirectoryInfo.AttributesFileAttributes.ReadOnly並遍歷所有ACL中的s:DirectoryInfo.GetAccessControl()以確定當前用戶是否具有足夠的權限。

我想只要嘗試創建文件並捕獲異常就容易多了。

4

這吸引了我,足以給它一個去,雖然沒有徹底或太多的測試,在所有的,這裏有幾件事情你可能要使用(瞭望例外呢!):

static bool CanCreateFile(FileInfo fileInfo) 
    { 
     if (fileInfo.Exists) return false; 
     return !fileInfo.Attributes.HasFlag(FileAttributes.ReadOnly); 
    } 

    static bool CanCreateFile2(FileInfo fileInfo) 
    { 
     if (fileInfo.Exists) return false; 
     return IsDirectoryWriteable(
      Path.GetDirectoryName(fileInfo.FullName)); 
    } 

    static bool IsDirectoryWriteable(string path) 
    { 
     var directoryInfo = new DirectoryInfo(path); 
     if (!directoryInfo.Exists) 
     { 
      return IsDirectoryWriteable(directoryInfo.Parent.FullName); 
     } 
     return !directoryInfo.Attributes.HasFlag(FileAttributes.ReadOnly); 
    } 

但正如另一個答案所指出的那樣,實際上並不能保證當你從「確認」中返回時,在下一次寫作之前不會發生改變情況的有效性的事情。

相關問題