我有一个Windows服务使用FileSystemWatcher监视文件夹,打印添加的图像,然后在打印后删除图像。使用FileSystemWatcher来触发事件,然后删除新创建的文件?
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
FileSystemWatcher Watcher = new FileSystemWatcher();
Watcher.Path = @"C:\Images";
Watcher.Created += new FileSystemEventHandler(Watcher_Changed);
Watcher.EnableRaisingEvents = true;
}
private void Watcher_Changed(object sender, FileSystemEventArgs e)
{
try
{
PrintDocument myDoc = new PrintDocument();
myDoc.PrintPage += new PrintPageEventHandler(print);
FilePath = e.FullPath;
myDoc.PrinterSettings.PrinterName = @"\\Network Printer";
myDoc.Print();
using (StreamWriter sw = new StreamWriter("C:\\error.txt"))
{
sw.WriteLine("Printed File: " + FilePath);
}
File.Delete(e.FullPath);
}
catch(Exception excep)
{
using (StreamWriter sw = new StreamWriter("C:\\error.txt"))
{
sw.WriteLine("Error: " + excep.ToString());
}
}
}
的问题是,我得到抛出Error: System.IO.IOException: The process cannot access the file because it is being used by another process.
不同的是该文件正在由另一个进程使用,当我尝试将其删除。我猜这是因为FileSystemWatcher保留了一些对它的引用。任何想法在这里做什么,打印后删除文件?
编辑:
private void print(object sender, PrintPageEventArgs e)
{
try
{
using (Image i = Image.FromFile(FilePath))
{
Point p = new Point(0, 0);
e.Graphics.DrawImage(i, p);
}
}
catch(Exception exep)
{
throw exep;
}
}
我申请使用块建议,这个功能太,也感动了删除这一功能是事件处理程序: 之前没有从我的代码包含此功能mydoc.EndPrint,以确保与文件的所有关系都被切断,这似乎是个窍门。
void myDoc_EndPrint(object sender, PrintEventArgs e)
{
File.Delete(FilePath);
}
使用['FileMon'(http://technet.microsoft.com/en-us/sysinternals/bb896642.aspx),看看哪些进程正在锁定文件。 – Oded 2010-09-29 19:57:13