2013-01-01 63 views

回答

7

使用FileSystemInfo.Attributes屬性,並對照FileAttributes.ReadOnly

var file = new FileInfo(path); 
if ((file.Attributes & FileAttributes.ReadOnly) != 0) 
{ 
    // Do whatever you want for a read-only file 
} 

請注意,這不是一樣的你是否能寫入文件。如果它已經被使用,那麼你可能無法寫信給它。即使它確實表示在您致電屬性時是否可以寫入該屬性,但它不會告訴您是否可以在之後立即寫入文件。

基本上,如果你想處理試圖寫入可能失敗的文件,你基本上用來使用try/catch。我會專門捕捉IOException(或者更具體的例外,可能),而不是捕捉所有例外。

+0

Jon,在'FileAttributes.ReadOnly'中是否存在一些魔法,用於檢查文件是否正在使用,或者這只是檢查文件是否標記爲只讀? – Mitch

+0

@Mitch:它只是*檢查它是否是隻讀文件。這與您目前是否可以寫信息不一樣。將編輯以清楚說明。 –

2

打開文件時使用FileShare.None。如果任何其他進程有該文件的句柄,則該調用將失敗。

例如爲:檢查文件是可寫的,而不是在使用:但是

bool isWritableAndFree = false; 
try { 
    using (new FileStream(name, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) 
    { 
     isWritableAndFree = true; 
    } 
} catch { } 
return isWritableAndFree; 

當心的是,這種類型的代碼很容易受到TOCTOU錯誤。在使用時趕上例外通常會更好。

+1

這正是OP想要避免的算法(出於很好的理由)。 – usr

+0

@usr,這就是爲什麼我明確提出主要問題的原因,但是,OP也請求「檢查文件是否已被使用」的算法,我相信這是提供的。 – Mitch

+1

感謝您的警告,我沒有考慮過一個文件可能會被使用* *我檢查它是否在使用中 – Oztaco

相關問題