Datei wird von einem anderen Prozess verwendet in c#
Ich versuche, eine Datei zu löschen, die in C#, aber ich erhalte eine Meldung, dass die Datei von einem anderen Prozess verwendet. Was ich tun möchte, ist zu überprüfen, ob die Dateien vorhanden ist, und schließen Sie es. Ich benutze folgende Funktion, um zu überprüfen, ob die Datei geöffnet ist:
public static bool IsFileInUse(string path)
{
if (string.IsNullOrEmpty(path))
throw new ArgumentException("'path' cannot be null or empty.", "path");
try
{
using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { }
}
catch (IOException)
{
return true;
}
return false;
}
und ich bin versucht, wenn die Datei in Gebrauch ist, um es zu schließen:
bool checking = IsFileInUse(file );
File.Create(file ).Close();
if (File.Exists(file))
{
File.Delete(file );
}
Bekam ich Probleme in der Datei.Linien -, ich erhalte die Meldung:
Datei wird von einem anderen Prozess verwendet wird.
EDIT: ich bin versucht, lock-Ansatz, um die Datei zu löschen. Ich nehme an, die Datei zu löschen innerhalb einer lock-Anweisung? Wie Kann ich richtig die lock-Anweisung?
Also ich sollte den Prozess zu beenden, um die Datei zu schließen, richtig?
Ist, dass Ihre Anwendung? Wenn ja, dann können Sie Nachricht senden, um Sie freizugeben, oder verwenden Sie die inter-Prozess-lock
Was ist der andere Prozess, der es verwendet? Ist es Ihre app selbst?
Finden Sie eine Menge Artikel zu sperren, multi-threading, das ist, was msdn erzählen, sperren, msdn.microsoft.com/en-us/library/c5kehkcz.aspx
InformationsquelleAutor Jose Ramon | 2016-01-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum glaubst du, dass eine lese-operation wird fehlschlagen, wenn die Datei in Gebrauch ist, während eine Schreiboperation nicht?
File.Create()
wird scheitern, genau wie neueFileStream()
vorher gescheitert...Siehe auch IOException: Der Prozess kann nicht auf die Datei 'Dateipfad', denn es wird von einem anderen Prozess verwendet.
Beachten Sie, dass Ihr check schlägt fehl, wenn der andere Prozess nicht öffnen, die Datei exklusiv (check
FileShare
Aufzählung): die Datei die geöffnet werden können, für gemeinsames Lesen, schreiben und manchmal auch zum löschen (weil Sie zum Beispiel Lesen kann, gleichzeitig aber nicht zu schreiben, aber die anderen Vorgang kann lassen Sie löschen , Datei...).Schließen eine geöffnete Datei kann sehr störend für die anderen Verfahren, kann es zum Absturz, schön das problem umgehen oder...etwas anderes (im hintergrund ignorieren, die Fehler und produzieren zufällige Ausgabe, öffnen Sie die Datei erneut, und so weiter...) Ist es möglich in C#? Ja, mit einigen P/Invoke...
1) finden wir das handle für die Datei, die Sie wollen entsperren. Verwenden
NtQuerySystemInformation()
und alle aufzuzählen, Griffe, bis Sie das finden, das bezieht sich auf diese Datei.2) Dupliziert das handle gültig in Ihrem eigenen Prozess mit
DuplicateHandle()
.3) Schließen Sie einfach erstellen Griff Angabe
DUPLICATE_CLOSE_SOURCE
ist, wird es in der Nähe sowohl der Griff und das original (natürlich, wenn der Prozess genügend Berechtigungen).4) Überprüfen, wenn die Datei wirklich geschlossen Berufung
NtQuerySystemInformation()
wieder, wenn nicht, dann müssen Sie möglicherweise direkt in der Nähe seines übergeordneten Prozesses.InformationsquelleAutor Adriano Repetti
Haben Sie keine Notwendigkeit überprüfen wenn die Datei vorhanden ist, versuchen Sie einfach tun löschen:
https://msdn.microsoft.com/en-us/library/system.io.file.delete(v=vs. 110).aspx
Versuchen und überprüfen Sie die Ausnahme
InformationsquelleAutor Dmitry Bychenko
In Ihrem code, Sie tun nichts, mit dem IsFileInUse Ergebnis.
Diese
File.Create(file ).Close();
wird auch nicht in der Nähe einer Datei von einem anderen Prozess geöffnet. Sie müssen beenden Sie den Prozess, die Datei zu öffnen, und wenn es Ihre eigene app, schließen Sie das handle der Datei, bevor Sie versuchen die Datei zu löschen.Sie können es tun (in der Nähe, Prozess, nachdem Sie es gefunden), aber es ist etwas zu tun, sorgfältig.
Ist dies der Weg, um in der Nähe einen thread msdn.microsoft.com/en-US/library/7a2f3ay4(v=vs. 80).aspx ?
InformationsquelleAutor jvanrhyn