У меня есть служба Windows, использующая 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);
}