System.IO.IOException: Der Prozess kann nicht auf die Datei 'Dateiname'
Ich habe eine Methode in meinem windows-Dienst wie folgt:
System.IO.File.Copy(path, ConfigurationManager.AppSettings["BulkInsertGiftRegisterCreatorDirectory"] + System.IO.Path.GetFileName(path));
Loyalty.Entity.Base.FileInfo file = new Loyalty.Entity.Base.FileInfo();
file.FileName = path;
request.Object = file;
ResponseBase response = new ResponseBase(request);
RequestConnection connection = new RequestConnection("cn");
FileManager fileManager = new FileManager(request, connection);
response = fileManager.OfflineGiftRegisterBulkInsert();
System.IO.File.Delete(ConfigurationManager.AppSettings["BulkInsertGiftRegisterCreatorDirectory"] + System.IO.Path.GetFileName(path));
//here is the part of stored procedure that uses file
SELECT @SCRIPT= 'BULK INSERT GIFT_CARD.GIFT_TEMP'
+' FROM '''
+ @FILE_PATH
+''' WITH ('
+'FIELDTERMINATOR = '','','
+ 'KEEPNULLS'
+');'
Kann ich die Datei löschen aus dem Datei-system von hand, aber dieser code sagt mir "Ooops! System.IO.IOException: Der Prozess kann nicht auf die Datei 'Dateiname'
denn es wird von einem anderen Prozess verwendet."
Habe ich gesucht, die ähnliche Fragen auf stackoverflow und sonst wo. Aber ich konnte nichts finden, um mir zu helfen. Kopieren oder Löschen von Methoden, die "void" zurückgeben und ich habe keinen Strom in meinem code zu entsorgen.
Wie kann ich es beheben?
Vielen Dank im Voraus.
- Was ist das "etwas anderes tun" - Teil zu tun? Ich nehme an, es ist etwas mit der Datei nicht kopiert/gelöscht werden. Und ich habe das Gefühl, dass dies etwas ist hier wichtig.
- Sieht Ihr Fenster service laufen unter der gleichen Identität wie Sie? Wenn nicht, vielleicht das Fenster service der keine Berechtigung zum löschen der Datei.
- Ich rufe eine gespeicherte Prozedur verwendet den Pfad der Datei an, die bulk insert-Zeilen enthalten, die von der Datei.
- Das bedeutet, dass die Datei geöffnet ist (wahrscheinlich durch die Methode der Ausführung der gespeicherten Prozedur oder die gespeicherte Prozedur). Stellen Sie sicher, es ist richtig geschlossen. Wenn Sie Ihre code-wir können Ihnen helfen, das problem zu finden.
- Ich bin das anmelden mit dem gleichen Benutzer, den windows-Dienst verwendet wird.
- Hinzugefügt habe ich den Dienst Anruf-Linien
- Stellen Sie sicher, dass der Antrag, der Verbindung und der fileManager Objekte ordnungsgemäß entsorgt werden, wenn Sie implementieren
IDisposable
. So können Sie am besten durch wickeln Sie Ihren code inusing
Blöcke. - Wie werden Sie die Auslösung der Methode? FileWatcher? timer?
- Und was ist, wenn Sie nicht implementieren IDisposable?
- Frix-timer
- So, das war meine Antwort hilfreich oder nicht?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bevor Sie gehen auf der Suche durch den code, den Sie verwenden möchten process explorer zu Identifizieren, welcher Prozess hat den Griff. Dies könnte ausschließen, einige Problem, das Sie nicht gedacht haben
update
Da Sie über eine Zeitschaltuhr, die Sie müssen sicherstellen, dass Ihre Methode ist reentrant, und Sie haben keine race conditions.. E. g. die Zeit tickt schneller, als Sie das Ereignis verarbeitet.
Sehen diese Frage
Und diese Antwort
Hier ist eine Methode für Sie, um zu überprüfen, ob eine Datei in Benutzung ist:
Auch, zu warten, für eine Datei die ich gemacht habe:
Ich hoffe, das hilft!
Sogar die bessere Lösung ist, fügen Sie diese zwei Zeilen code, bevor Sie die Funktion FileInUse, dass Vercas zeigte: