J'ai un service Windows utilisant un FileSystemWatcher pour surveiller un dossier, imprimer des images ajoutées, puis supprimer l'image après l'impression.en utilisant FileSystemWatcher pour déclencher l'événement, puis supprimer le fichier nouvellement créé?
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());
}
}
}
Le problème est que je reçois l'exception jetée Error: System.IO.IOException: The process cannot access the file because it is being used by another process.
que le fichier est utilisé par un autre processus lorsque je tente de le supprimer. Je suppose que c'est parce que FileSystemWatcher garde une sorte de référence. Une idée sur ce qu'il faut faire ici, pour supprimer le fichier après qu'il soit imprimé?
Edit: N'a pas inclure cette fonction de mon code avant:
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;
}
}
J'ai appliqué l'aide de suggestion de bloc à cette fonction aussi, mais aussi déplacé la suppression de cette fonction qui est gestionnaire d'événements pour mydoc.EndPrint, pour assurer que tous les liens vers le fichier ont été coupés, et cela semble faire l'affaire.
void myDoc_EndPrint(object sender, PrintEventArgs e)
{
File.Delete(FilePath);
}
Utilisez [ 'FileMon'] (http://technet.microsoft.com/en-us/sysinternals/bb896642.aspx) pour voir quels sont les processus verrouillent le fichier. – Oded