2013-08-24 69 views
0

我厭倦了將循環病毒簽名寫入文件。 我的代碼:寫入文件時出錯 - 它被其他進程使用

for (int i = 0; i < liczba; i++) 
       { 
        int current = i + 1; 
        string xxx = w.DownloadString("xxx(hidden)"); 
        if (xxx != "0") 
        { 
         string[] wirus = xxx.Split("|||".ToCharArray()); 
         string s2 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "_RDTSignatures", "base000" + current.ToString() + ".rdtsignature"); 
         File.Create(s2); 
         StreamWriter sss = new StreamWriter(s2); //that's crash line 
         sss.WriteLine("hidden"); 
         sss.WriteLine(wirus[0]); 
         sss.WriteLine(wirus[1]); 
         sss.Close(); 
         File.Encrypt(s2); 
        } 
       } 

wWebClient對象。錯誤回調:

System.IO.IOException: Process cannot access file : „C:\Users\Pluse Konto\Documents\Visual Studio 2010\Projects\Radzik Diagnostic Tool\Radzik Diagnostic Tool\bin\Debug\_RDTSignatures\base0001.rdtsignature」, because it is used by other process. 
    w System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
    w System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) 
    w System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) 
    w System.IO.StreamWriter.CreateFile(String path, Boolean append, Boolean checkHost) 
    w System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize, Boolean checkHost) 
    w System.IO.StreamWriter..ctor(String path) 
    w Radzik_Diagnostic_Tool.Updates.timer1_Tick(Object sender, EventArgs e) w C:\Users\Pluse Konto\documents\visual studio 2010\Projects\Radzik Diagnostic Tool\Radzik Diagnostic Tool\Updates.cs:line 69 
    w System.Windows.Forms.Timer.OnTick(EventArgs e) 
    w System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m) 
    w System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

我不知道那個錯誤的原因是什麼。當然,沒有進程正在使用我的文件,除了我的主線程。

PS文件base0001.rdtsignature已創建,但爲空。

+0

我假設錯誤發生在循環中的第二次迭代。問題在於你沒有在文件'File.Create(s2);'''上創建的文件處理(因此不能關閉文件)''File.Create(s2);''你反覆嘗試在你的循環中創建的文件。 – Alex

+0

@Alex不是第二次迭代第一次迭代本身將失敗。 'File.Create(s2)'返回打開'FileStream' –

+0

@SriramSakthivel你是對的。我甚至沒有注意到它試圖在這兩行上打開/創建相同的文件。 – Alex

回答

1

您不關閉由File.Create(s2);創建的文件。

嘗試using(File.Create(s2));File.Create(s2).Close();

+0

這將會起作用,但調用File.Create並不是必要的,因爲直接爲它創建文件之後的那一行。 –

+0

@FrankRundatz當然,有很多方法可以做到這一點。我只是指出了錯誤。 – I4V

0

相反的:

File.Create(s2); 
StreamWriter sss = new StreamWriter(s2); //that's crash line 

用途:

StreamWriter sss = File.CreateText(s2); 
1

註釋掉:

File.Create(S2);

問題是File.Create(s2)返回一個FileStream,它將文件打開。然後,您正在嘗試創建第二個流來打開文件以再次寫入,這就是爲什麼會出現文件已打開的錯誤。

如果你總是想創建一個新的文件,改變你的行創建的StreamWriter閱讀:

StreamWriter的SSS =新的StreamWriter(S2,假);

這將使它不會附加到現有的文件,而是覆蓋它。

2

File.Create返回開放FileStream,所以當你創建新的StreamWriter它試圖訪問它已經在你的過程與File.Create結果IOException

打開的文件試試這個

using (StreamWriter sss = new StreamWriter(File.Create(s2))) 
{ 
    //Make use of sss 
} 

使用語句確保當控制退出Using時,StreamWriter的基礎流將關閉。所以不需要手動撥打sss.Close();。即使在拋出異常的情況下,using語句也會爲你做。

相關問題