2010-08-19 8 views
12

Ich fand eine ähnliche Frage here, aber es wurde geschlossen/mit einer Antwort akzeptiert "Do not do that".Forcing geschlossen eine offene Datei von C#

Ich bin in einer Situation, in der es mir egal ist, was mit den anderen Anwendungen passiert, ich möchte eine Datei nehmen, die von anderen gesperrt werden kann (grob wenn nötig) und habe meinen Weg damit. Möglicherweise muss ich diese Datei verschieben, umbenennen oder löschen.

Grundsätzlich muss ich Dateien in einem Verzeichnis verarbeiten, das von einer App erstellt wird, die ihre Sperren nicht bereinigt. Ich weiß, dass die App fertig ist, wenn ich meins anrufe, aber ich muss die Schlösser töten, wenn ich renne. Darüber hinaus scheint es, dass ich mit Lesevorgängen von lokaler AV-Software, die die Remote-Freigabe scannt, wo der Server ist, in Konflikt steht.

All dies summiert sich zu einer unlösbaren "Kraft-nahe" Situation, so dass ich tun kann, was ich brauche. Hat jemand eine Idee, was zu tun ist?

Antwort

2

Diese ist wahrscheinlich irrelevant und wenn es bitte jemanden kommentiert, aber es gab einen Workaround, den ich vorher im Explorer benutzt habe, um Dateisperren zu umgehen.
Wenn eine Datei von einem gestoppten Prozess gesperrt wurde, ließ Windows sie oft nicht löschen, aber wenn Sie eine neue Datei mit demselben Namen woanders erstellt hatten, wurde sie in den Ordner verschoben, in dem sie erfolgreich war. Sie könnten dann die neue Datei löschen und alles war gut.
Um dies für Ihre App zu verwenden, müssen Sie in der Lage sein, die Datei zu lesen und sie im Speicher zu behalten, bevor Sie dies getan haben. Dann schreiben Sie sie zurück, nachdem Sie die alte Version gelöscht haben.
Vielleicht wird es helfen, vielleicht nicht, aber es ist einen Versuch wert.

0
foreach (var process in Process.GetProcessesByName("excel")) //whatever you need to close 
    { 
     if (process.MainWindowTitle.Contains("test.xlsx")) 
     { 
      process.Kill(); 
      break; 
     } 
    } 

oder

foreach (var process in Process.GetProcesses()) 
    { 
     if (process.MainWindowTitle.Contains("test.dat")) 
     { 
      process.Kill(); 
      break; 
     } 
    } 
Verwandte Themen