2014-07-11 83 views
0

我正在嘗試寫入Asp.Net格式(.aspx)中的文件。我可以通過創建文件罰款,在Asp.Net中寫入文件

if (!File.Exists(Settings.Default.FileLocation)) 
    { 
     File.Create(Settings.Default.FileLocation); 
    } 

但是,當我去使用此代碼寫入文件:

File.WriteAllBytes(Settings.Default.FileLocation, someByteArray); 

我得到一個異常:

System.IO.IOException: The process cannot access the file 'C:\inetpub\wwwroot\mysite.com\captured\captured.xml' because it is being used by another process. 

(在此case'C:\ inetpub \ wwwroot \ mysite.com \ captured \ captured.xml'== Settings.Default.FileLocation)

我不能刪除或複製f在此期間,Windows資源管理器也會自動啓動。但是,如果我停止或重新啓動應用程序池,WebForm正在運行,錯誤消失。這是什麼原因以及如何防止它?

這是一個雙贏的服務器2012 R2上運行,並且IIS 7.5

回答

6

閱讀documentation on MSDN。您應該使用using語句來打開文件,以便確保任何打開的句柄關閉。

using(FileStream fs=File.Create(Settings.Default.FileLocation)) 
{ 
    //manipulate file here 
} 

此外,File.WriteAllByteswill create the file if it doesn't exist,所以沒有必要單獨創建它。

+0

是的,我提出這個問題後,我就明白了這一點。 Facepalm時刻 –

+0

@Mike_G這裏真正的教訓是「在.NET中內置的東西感到困惑時檢查MSDN」。對File.Create()的工作方式感到困惑是可以理解的。 – mason

1

File.Create默認打開文件進行讀取/寫入,需要關閉之後才能再次使用。從文檔:

默認情況下,對所有 用戶授予對新文件的完全讀/寫訪問權限。該文件以讀/寫訪問權限打開,並且必須先關閉 ,然後才能被其他應用程序打開。

File.WriteAllBytes將創建文件,如果它不存在,所以我認爲你的代碼來檢查文件的存在和創建它可能是矯枉過正。