2013-01-09 74 views
5

我嘗試通過IronPython腳本創建目錄時發生C#項目中的奇怪問題。這是代碼:嘗試創建目錄時發生IOException(「文件或目錄已存在」)

targetTemplateDirectory = Path.Combine(Data, "Templates\\CheckedReports") 

if not Directory.Exists(targetTemplateDirectory): 
    Directory.CreateDirectory(targetTemplateDirectory) 

的問題是一個IOException告訴我,這是不可能創建文件夾"H:\ProductName\Data\Templates\CheckedReports"因爲文件或目錄具有相同名稱已經存在。

根據MSDN,當目錄已經存在時,方法Directory.CreateDirectory()不會引發任何異常。

我知道名爲「CheckedReports」的文件可能是此例外的原因,但客戶非常不可能手動創建該文件。除此之外,沒有包含單詞「CheckedReports」的代碼行(除了提到的腳本之外)。此外,該應用程序由幾千名客戶使用,腳本在每臺機器上執行,只有一位客戶報告了此問題。

除了具有相同名稱的文件之外,是否有可能發生此異常?可能與權限,可移動媒體或網絡驅動器有關?

+0

「但它是非常非常不可能」......但是,鑑於可用的信息,這是最可能的原因。如果存在以該名稱存在的文件,您不能只檢查(或讓客戶檢查)嗎? –

+0

我希望我可以:)。該客戶使用的應用程序版本具有錯誤報告系統,該系統不允許任何個人或聯繫信息。我們在稍後的更新中改變了這一點。所以我們只收到一條包含堆棧跟蹤和機器ID的消息,沒有其他的。 –

回答

3

我們擁有相同的功能,在我們的情況下,它很明顯是一個權限問題。我們期待有記錄的UnauthorizedAccessException,但那不是我們得到的。

在堆棧中,我們有Directory.CreateDirectory調用Directory.InternalCreateDirectory。

它裏面有這樣一個字條:

 //Note that InternalExists may fail due 
     // to Win32 ACL's preventing us from seeing a directory, and this 
     // isn't threadsafe. 

有更多關於它的音符,那進入更深的這一事實,該代碼可以嘗試創建時,它無法看到它是已經存在的目錄。

5

儘管只有一個用戶纔有這種矯枉過正,但應該可以檢查是否存在具有該名稱的文件。

FileInfo myFile = new FileInfo(targetTemplateDirectory); 
if (myFile.Exists) 
    myFile.Delete(); 

if (!Directory.Exists(targetTemplateDirectory)) 
    Directory.CreateDirectory(targetTemplateDirectory); 

也許這可以解決問題如果I/O異常是由具有相同名稱的文件引起的。如果這是由用戶造成的,因爲「網絡名稱未知」,那麼我也不會有任何線索。

+0

也許這是一種偏執狂,這種異常沒有其他原因,但是它是致命的,因爲它在更新過程中被拋出,並且阻止應用程序啓動。我會嘗試解決您的解決方案,至少可以解決由同名文件引起的任何故障,無論是由客戶手動創建還是由於應用程序中的錯誤,我們的設置或與另一個應用。 –

+0

這是我工作的唯一解決方案(很多)。 –

相關問題