2012-07-05 31 views
1

我的應用正在寫入\ AppData \ Roaming中的幾個文件。我創建的文件應用程序啓動時是這樣的:文件已被訪問錯誤

private void Form1_Load(object sender, EventArgs e) 
{ 
DirectoryInfo _File = new DirectoryInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"MyApp\myfile.txt")); 
} 

後來,當我寫的一個按鈕點擊該文件,我得到一個錯誤,該文件已在使用,不能訪問。我將如何解決這個問題?

要寫入文件的代碼是正確的,因爲當我刪除上面的代碼並自己創建文件時,應用程序無需任何問題就可以寫入文件。因此,我不認爲問題出在用於寫入文件的代碼。但是,這裏僅供參考:

var myfile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"MyApp\myfile.txt")); 
StreamWriter sw = new StreamWriter(myfile); 
sw.WriteLine(textBox1.text); 
sw.Close(); 

在此先感謝您的幫助!

+0

除了上面第二個示例中發佈的代碼之外,是否有任何操作嘗試訪問該文件?例如,你是否嘗試閱讀他們的內容並把它放在用戶界面的某個地方? – 2012-07-05 14:33:05

+0

@ChrisShain我在應用程序的WebBrowser中查看文件。這是一個通過瀏覽器訪問的HTML文件。除此之外,沒有別的東西可以訪問該文件。 – Nathan 2012-07-05 14:38:54

回答

3

這裏有一些概念,我不確定我們是否有足夠的信息來明確地解決根本問題,但我會給你一些指示。

您需要了解FileMode,FileAccessFileShare枚舉。

第一個,FileMode指定您打算如何處理文件的存在。在上面的鏈接中有各種選項。我不認爲你在這裏有問題,但它提到了。

第二個,FileAccess,涉及您與文件(讀取,寫入,或兩者)的預期交互。如果您要求獲得閱讀權限,那麼任何打開文件或已經打開該文件(包括該網絡瀏覽器控件)的其他人都必須允許與其他閱讀器共享。

最後一個,FileShare,定義您願意與誰共享文件訪問權限。您可以指定其他人可以閱讀它,其他人可以寫信給他人,也可以不寫。

您正在使用的代碼是使用最簡單的默認值訪問文件,這可能與WebBrowser的訪問模式不兼容。下面是我,而不是建議:

var myfile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"MyApp\myfile.txt")); 
using (var fs = new FileStream(myfile, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite)) { 
    using (var sw = new StreamWriter(fs)) { 

     // You probably want to move to the end of the file before writing... 
     fs.Seek(0, SeekOrigin.End); 

     sw.WriteLine(textBox1.text); 
     sw.Close(); 
    } 
} 

這非常清楚地表達你的意圖,以及事實,你願意與他人分享誰可能讀取或寫入(我們知道web瀏覽器將無法寫入文件,但由於某種原因,也許它試圖用寫意圖打開它)。

+0

這很棒!謝謝你的幫助! – Nathan 2012-07-05 17:10:42

+0

+1以獲得非常完整的答案。 – NotMe 2012-07-06 16:12:05

-1

嘗試使用using

using (StreamWriter sw = new StreamWriter(myfile)) 
{ 
    sw.Write(textBox1.text); 
} 
+0

小心點評爲什麼投票不中? – Asdfg 2012-07-05 14:36:19

+0

我沒有給你DV,但你的解決方案不太可能幫助,因爲OP已經關閉了StreamWriter。 – 2012-07-05 14:39:30

+0

,但使用使用總是更好。 – Asdfg 2012-07-05 14:41:18

0

嘗試訪問FileInfo對象來創建/添加/如下,該文件已經採取FileInfo類寫入文件,

使用如下,

FileInfo fi1 = new FileInfo(path); 

     //Create a file to write to. 
     using (StreamWriter sw = fi1.CreateText()) 
     { 
      sw.WriteLine("Hello"); 
      sw.WriteLine("And"); 
      sw.WriteLine("Welcome"); 
     } 

     //Open the file to read from. 
     using (StreamReader sr = fi1.OpenText()) 
     { 
      string s = ""; 
      while ((s = sr.ReadLine()) != null) 
      { 
       Console.WriteLine(s); 


      } 
     } 
1

對於文件操作(以及在您訪問非託管資源的任何時候),最好的辦法是隻抓取足夠長的文件句柄來執行所需的操作,然後釋放它。

就你而言,你打開資源,然後嘗試稍後再打開它。改變這一點。除非你真的要對它做些什麼,否則不要創建這些文件。另外,請查看USING條款。您希望在讀完或寫完後立即發佈它。