该进程无法访问该文件,因为该文件正由另一个进程使用。 (线程)

时间:2010-08-12 12:40:32

标签: c# .net file-io

我使用单独的线程将调试信息写入文件。在启动期间,我喜欢备份任何以前的文件。不幸的是,操作系统似乎挂起了文件句柄不确定的时间,因此当我尝试写入文件时,它会失败。

我在Windows XP上使用C#,。Net framework 3.5。 (Vista和Win7有同样的问题)。

这是解决问题的代码,其中t将抛出System.IO.IOException:“进程无法访问文件'C:\ deleteMe.txt',因为它正被另一个进程使用。“

public class WriteToFile {

    static void Main(){
        String filename=@"C:\deleteMe.txt";
        String filenameBackup = @"C:\deleteMe (backup).txt";
        String value = "this is a test value";

        //MAKE FILE
        fillFile(filename, value);


        //MAKE A THREAD TO WRITE TO FILE, WHEN READY
        Semaphore readyToWrite=new Semaphore(1, 1);
        var t=new Thread(
            new ThreadStart(delegate(){
                readyToWrite.WaitOne();
                WriteToFile.fillFile(filename, value);
            })
        );
        t.Priority=ThreadPriority.Highest;
        t.Start();


        //BACKUP FILE 
        if (File.Exists(filename)) {
            File.Delete(filenameBackup);
            File.Copy(filename, filenameBackup);
            File.Delete(filename);
        }//endif

        //SIGNAL THREAD TO WRITE TO FILE
        readyToWrite.Release();
    }//method


    public static void fillFile(String filename, String value) {
        try {
            StreamWriter w = File.AppendText(filename);
            using (w) {
                w.Write(value);
                w.Flush();
            }//using
        } catch (Exception e) {
            throw new Exception("Can not write to file", e);
        }//try
    }//method


}//class

谢谢!

1 个答案:

答案 0 :(得分:2)

您正在初始化信号量错误。尝试:new Semaphore(0, 1);

this MSDN page

WaitEvent可能更容易,也更适合这项任务。

2个代码更改将是:

//Semaphore readyToWrite=new Semaphore(1, 1);
var readyToWrite = new ManualResetEvent(false);

//readyToWrite.Release();
readyToWrite.Set();

此外,设置优先级通常是一个坏主意。你不会在这里获得任何东西(它是一个I / O线程),所以最好离开它。