2009-02-19 48 views
2

我有一個類有幾個屬性引用本地磁盤上的文件/目錄位置。這些值可以是動態的,我希望確保在任何時候訪問它們時,我都會首先驗證它是否存在,而不必在每個使用這些值的方法中包含此代碼。getter中存在File/Directory.Exists的開銷?

我的問題是,是否把這個吸氣劑招致性能損失?它在循環中不會被稱爲數千次,所以這不是一個考慮因素。只是想確保我沒有做一些會造成不必要的瓶頸的事情。

我知道,通常情況下,優化太早並不明智,但我寧願在現在檢查這個錯誤之前,我必須回去並從getter中移除它並將它添加到整個地方。


澄清:

的文件/目錄被指向特性要通過的System.Diagnostics.Process使用。我不會直接讀/寫這些文件/目錄,我只是想在我產生子進程之前確保它們存在。

回答

3

任何不是簡單的查找或計算都應該放在方法中,而不是屬性。屬性應該在概念上類似於只訪問一個字段 - 如果有任何額外的開銷或失敗的可能性(和IO - 即使只是檢查一個文件存在 - 將在兩次測試中都失敗),屬性不是正確的選擇。

請記住,在查看對象狀態時,調試器甚至會調用屬性。

從這個角度來看,您關於實際開銷和早期優化的問題變得無關緊要。希望這可以幫助。

2

如果您正在重用對象,則應考慮使用FileInfo類與靜態File類。 File類的靜態方法每次都會進行不必要的安全檢查。
FileInfo - DirectoryInfo - File - Directory

編輯:

我的回答仍然適用。爲了確保你的文件存在,你會做一些像這樣在您的getter:

if(File.Exists(string)) 
//do stuff 
else 
//file doesn't exist 

OR

FileInfo fi = new FileInfo(fName); 
if (fi.Exists) 
//do stuff 
else 
//file doesn't exist 

正確?

我想說的是,如果您將可以通過這種邏輯成千上萬的時間循環再使用的FileInfo例如VS靜態文件類,因爲如果你使用靜態文件,你會得到一個負面的性能影響。退出方法。

+0

請看我上面的說明。 – 2009-02-19 13:10:43

2

如果您擔心性能問題(當您認爲過早優化並不是一個好主意),那麼可以通過多種方法來緩解這一點。如果你認爲昂貴的操作是文件I/O,並且你有很多事情正在進行,你可以隨時在你的課堂上使用像Dictionary這樣的東西。考慮這個(相當人爲的)示例代碼:

private Dictionary<string, bool> _directories = new Dictionary<string, bool>(); 

private void CheckDirectory(string directory, bool create) 
{ 
    if (_directories.ContainsKey(_directories)) 
    { 
    bool exists = Directory.Exists(directory); 
    if (create && !exists) 
    { 
     Directory.CreateDirectory(directory); 
    } 
    // Add the directory to the dictionary. The value depends on 
    // whether the directory previously existed or the method has been told 
    // to create it. 
    _directories.Add(directory, create || exists); 
    } 
} 

稍後通過遍歷此列表來添加那些不存在的目錄是一件簡單的事情。

2
  1. 路徑存在於檢查點但在其與操作之間被移動/刪除的位置是可行的。

    • 你可能已經知道這一點,並接受風險,但只是讓你知道它。
  2. 如果你要做到這一點無論如何也無所謂無論是在性能還是沒有,只是檢查你(每一次操作或每操作組)

  3. 做什麼粒度

    如果您使用非靜態FileInfo操作,請注意此對象將在文件系統上對其視圖緩存進行查看。

    • 對於您來說,這可能是件好事,因爲您可以控制通過Refresh()方法刷新緩存的頻率,或者可能導致代碼中可能存在錯誤。
  4. 通常先嚐試一下,然後再考慮性能建議,但是您表明您已注意到這一點。