写入文件时出错 - 它被其他进程使用

时间:2013-08-24 18:46:02

标签: c# file io

我厌倦了将循环病毒签名写入文件。 我的代码:

 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已创建,但为空。

4 个答案:

答案 0 :(得分:2)

File.Create会返回打开的FileStream,因此当您创建新的StreamWriter时,它会尝试访问已在您的流程中打开的文件File.Create会导致{{ 1}}

试试这个

IOException

使用语句确保在控件退出using (StreamWriter sss = new StreamWriter(File.Create(s2))) { //Make use of sss } 时关闭StreamWriter的基础流。因此无需手动调用Using。即使抛出异常,using语句也会为你做。

答案 1 :(得分:1)

您不会关闭File.Create(s2);创建的文件。

尝试using( File.Create(s2) );File.Create(s2).Close();

答案 2 :(得分:1)

只是评论出来:

File.Create(S2);

问题是File.Create(s2)返回FileStream,使文件保持打开状态。然后,您尝试创建第二个流以打开文件以便再次写入,这就是您收到文件已经打开的错误的原因。

如果您始终想要创建新文件,请将创建StreamWriter的行更改为:

StreamWriter sss = new StreamWriter(s2,false);

这将使它不会附加到现有文件,而是覆盖它。

答案 3 :(得分:0)

而不是:

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

使用:

StreamWriter sss = File.CreateText(s2);