我使用单独的线程将调试信息写入文件。在启动期间,我喜欢备份任何以前的文件。不幸的是,操作系统似乎挂起了文件句柄不确定的时间,因此当我尝试写入文件时,它会失败。
我在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
谢谢!
答案 0 :(得分:2)
您正在初始化信号量错误。尝试:new Semaphore(0, 1);
WaitEvent可能更容易,也更适合这项任务。
2个代码更改将是:
//Semaphore readyToWrite=new Semaphore(1, 1);
var readyToWrite = new ManualResetEvent(false);
//readyToWrite.Release();
readyToWrite.Set();
此外,设置优先级通常是一个坏主意。你不会在这里获得任何东西(它是一个I / O线程),所以最好离开它。