代码之家  ›  专栏  ›  技术社区  ›  TN888 Ritesh Gune

写入文件时出错-其他进程正在使用该文件

  •  0
  • TN888 Ritesh Gune  · 技术社区  · 11 年前

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

     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);
                        }
                    }
    

    w 是一个 WebClient 对象错误回调:

    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 回复  |  直到 11 年前
        1
  •  2
  •   Sriram Sakthivel    11 年前

    File.Create 返回打开 FileStream ,所以当你创建新的 StreamWriter 它尝试使用访问已在进程中打开的文件 文件.创建 结果在 IOException

    试试这个

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

    Using语句可确保的底层流 流写入程序 控制退出时关闭 Using 。所以没必要打电话 sss.Close(); 手动。using语句甚至在抛出异常时也能为您完成此操作。

        2
  •  1
  •   I4V    11 年前

    您没有关闭由创建的文件 File.Create(s2); .

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

        3
  •  1
  •   Frank Rundatz    11 年前

    只需评论:

    文件.创建(s2);

    问题是File.Create(s2)返回一个FileStream,使文件保持打开状态。然后,您试图创建第二个流来打开文件以便再次写入,这就是为什么您会得到文件已经打开的错误。

    如果您总是想创建一个新文件,请将创建StreamWriter的行更改为:

    StreamWriter sss=新的StreamWriter(s2,false);

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

        4
  •  0
  •   CSJ    11 年前

    而不是:

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

    使用:

    StreamWriter sss = File.CreateText(s2);