So schließen Sie eine Datei, die bereits geöffnet ist, in ein Verzeichnis
Ich versuche zu analysieren, einen Ordner und löschen Sie alle Dateien in es.
DirectoryInfo dir = new DirectoryInfo("C\\Temp");
if (dir.GetDirectories().Any(p => p.Name == "\\NewTemp"))
{
foreach (string file in Directory.GetFiles(dir + "\\NewTemp"))
{
File.SetAttributes(file, FileAttributes.Normal);
File.Delete(file);
}
}
Dieser code funktioniert einwandfrei und löscht alle Dateien in meinem \NewTemp Ordner. Aber wenn eine der Dateien öffnet diese Dateien nicht gelöscht werden. Ich möchte forecfully schließen Sie die Dateien, die geöffnet sind, und löschen Sie Sie. Ich habe sogar versucht
foreach (string file in Directory.GetFiles(dir + "\\NewTemp"))
{
TextReader tr = new StreamReader(dir+"\\NewTemp\\"+file);
tr.Close();
File.SetAttributes(file, FileAttributes.Normal);
File.Delete(file);
}
Aber keine Verwendung. Bitte lassen Sie mich wissen, wo ich bin, fehlt.
was ist
Ich bin mir ziemlich sicher, dass es diesen Befehl Linie Dienstprogramm, die Sie verwenden können, um alle Prozesse, die eine bestimmte Datei öffnen, und ich bin mir auch ziemlich sicher, dass Sie taskkill diese Prozesse von c#
tr versucht, die Datei zu schließen TextReader tr = new StreamReader(Datei). Ich habe einen Tippfehler gemacht
stackoverflow.com/questions/177146/... Es ist nicht zu einfach mit managed code. In dieser Antwort gibt es einen link zu einem proget auf Codeproject, die Ihnen helfen können.
tr
doin esIch bin mir ziemlich sicher, dass es diesen Befehl Linie Dienstprogramm, die Sie verwenden können, um alle Prozesse, die eine bestimmte Datei öffnen, und ich bin mir auch ziemlich sicher, dass Sie taskkill diese Prozesse von c#
tr versucht, die Datei zu schließen TextReader tr = new StreamReader(Datei). Ich habe einen Tippfehler gemacht
stackoverflow.com/questions/177146/... Es ist nicht zu einfach mit managed code. In dieser Antwort gibt es einen link zu einem proget auf Codeproject, die Ihnen helfen können.
InformationsquelleAutor Sneha S Murthy | 2012-10-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut Sie beim schließen Ihre handle auf die Datei, aber das ist nicht auf jedem anderen Datei-handles, ob Sie im Besitz Ihrer Prozess-oder nicht. Grundsätzlich kann man nicht eine Datei löschen, die an anderer Stelle verwendet wird, es sei denn, es ist ausdrücklich geöffnet mit einer Datei-Freigabe-flag, welches es erlaubt, werden gelöscht. Das ist nur die Art, wie die Windows-Datei-Systeme funktionieren, soweit ich weiß. (EDIT: ich schlug ursprünglich mit dem Editor als ein Weg, um ein Datei-handle geöffnet, aber anscheinend ist es schließt den Griff nach dem laden in den Arbeitsspeicher. Ähm, probieren Sie andere apps 🙂
Ich glaube, Sie können erzwingen, schließen Sie die Datei-handles (eine Datei-handle), die ich verwendet habe, Programme, die es tun. Ich glaube nicht, dass es Sie gibt .Netz-Funktionen, es zu tun, so müssen Sie möglicherweise zu Graben, in die windows-API für eine Antwort.
Das ist eigentlich ein schlechtes Beispiel. Editor liest die Datei und schließt es. Sie können löschen Sie die Dateien mit NotePad geöffnet, ohne den Editor zuerst.
Notepad-Beispiel war nicht korrekt. Den Editor nicht öffnen und handhaben. Es lädt alle text im Speicher und löst den Griff. Sie können die Datei löschen, auch wenn der Editor geöffnet ist.
Das ist eine hochgradig nicht-triviale Aufgabe. Sie müssen irgendwie die Prozesse, halten Sie einen handle auf die Datei und machen Sie diese Prozesse schließen, dass Griff. Es gibt keinen einzigen WinAPI-Funktion.
InformationsquelleAutor Jon Skeet
Können Sie eine Datei löschen, wenn der Griff geöffnet ist von einem anderen Prozess. Sie haben zu töten, die zuerst verarbeitet, bevor Sie die Datei löschen.
Sie können sich diese Beispiel zu sehen, so finden Sie alle offenen handles.
InformationsquelleAutor loopedcode
Dies ist ein praktisches Werkzeug für die Suche nach, welcher Prozess hat die Datei-handles:
http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
InformationsquelleAutor Justin Harvey
Wenn Sie wissen, welche Programm Ihr die Datei öffnen, können Sie nur taskkill, dass das Programm direkt, und löschen Sie dann die Datei.
Wenn Sie nicht wissen, was für einen Prozess hat Sie Ihre Datei öffnen, als Sie verwenden können,ein Programm wie dieses, und dann den Ausgang. Ich selber würde die Umleitung der Ausgabe und verwenden Sie dann regex zu finden, was ich bekommen wollen, aber es gibt wahrscheinlich einen besseren Weg.
Beachten Sie, dass diese Methode nicht ganz ungefährlich ist, und kann Prozesse beenden, dass Sie den flugakku nicht töten wollen.
InformationsquelleAutor Sam I am
Diese sind Ihre Möglichkeiten, in der Reihenfolge, in der Sie versuchen sollten, Sie (von der am wenigsten invasiven, sehr invasiv).
FILE_FLAG_DELETE_ON_CLOSE
flag (pinvoke aus, um CreateFile). Wenn alle anderen Griffe, um die Dateien geschlossen sind, die system gelöscht werden die Datei für Sie.FILE_SHARE_DELETE
, dann sollten Sie rufen MoveFileEx mit derMOVEFILE_DELAY_UNTIL_REBOOT
fahne (und die lpNewFileName parameter auf NULL gesetzt /IntPtr.Null). Dadurch wird die Datei gelöscht, beim nächsten Neustart/reboot des Systems.InformationsquelleAutor josh poley
InformationsquelleAutor aditi mandloi