2015-09-01 22 views
5

Hier den Code ist, dass ich meine Anwendung, die damit verbundene Prozesse zu schließen und alle Dateien zu löschen, die während der Verwendung der Anwendung extrahiert wurden:Wie lösche ich Dateien programmatisch?

private void Quit_Click(object sender, RoutedEventArgs e) //close the application 
{ 
    //kill cinector after all import is done 
    Process[] processes = Process.GetProcesses(); 
    for (int i = 0; i < processes.Count(); i++) 
    { 
     if (processes[i].ProcessName.ToLower().Contains("CinectorProcess")) 
     { 
      processes[i].Kill(); 
     } 
    } 

    //also kill powerpoint just in case 

    for (int i = 0; i < processes.Count(); i++) 
    { 
     if (processes[i].ProcessName.ToLower().Contains("powerpnt")) 
     { 
      processes[i].Kill(); 
     } 
    } 

    //kill the engine 
    ShutdownEngine(); 

    //kill the main app 
    App.Current.Shutdown(); 

    //also delete all three folders 

    //slides_png_prev 
    if (Directory.Exists(slides_png_prev)) 
    { 
     Thumbnails = null; 
     Directory.Delete(slides_png_prev, true); 
    } 

    //slides_png 
    if (Directory.Exists(slides_png)) 
    { 
     Directory.Delete(slides_png, true); 
    } 

    //slides_png_prev_seleect 
    if (Directory.Exists(slides_png_prev_seleect)) 
    { 
     Directory.Delete(slides_png_prev_seleect, true); 
    } 
} 

Allerdings ist das Problem, dass, wenn es versucht, die Dateien (die die Bilder irgendwo in der App verwendet wird) es zeigt die folgende Ausnahme zu löschen: „der Vorgang kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird“

Update: fand ich, dass der Prozess ‚Mastersolution.vhost.exe‘ alle Dateien hält, die ich zu löschen versucht bin. Mastersolution ist eigentlich die Haupt-App, die ich auf der Leitung schließe App.Current.Shutdown(); Also muss ich irgendwie die Dateien von der Hauptanwendung trennen, bevor sie gelöscht werden. Aber hacke, das zu tun?

+4

ist diese WinForms/wpf/Konsolenanwendung? Das Töten des Prozesses (der Prozesse) und der GUI scheint nicht der netteste Weg zu sein, Dinge zu tun. – Sayse

+0

das ist wpf. Mit gui meine ich die Hauptanwendung – Ivan

Antwort

1

Zuerst sollten Sie feststellen, welche Datei im Ordner gesperrt ist - anstatt den gesamten Ordner zu löschen, löschen Sie einzelne Dateien. Dann sind Sie mit Process Explorer und Strg + F, welcher Prozess wirklich nutzt die löschbare Datei.

Sie können auch die Methode WhoIsLocking in diesem Code verwenden.

https://bitbucket.org/snippets/wiip/nnGX

Sie können es verwenden, um zu bestimmen, welcher Prozess die Datei sperrt. Dann können Sie so etwas schreiben, diesen Prozess automatisch zu töten:

  List<Process> lp = FileUtil.WhoIsLocking(fileName); 
     foreach (Process p in lp) 
     { 
       p.Kill(); 
     } 

Dies ist letzte Abhilfe, wenn es keine besseren Möglichkeiten geben, wie die Datei in Ihrer Anwendung zu schließen, schließt Powerpoint mit Hilfe der Automatisierung usw.

+0

Ich fand, dass der Prozess 'Mastersolution.vhost.exe' alle Dateien hält, die ich versuche zu löschen. Mastersolution ist eigentlich die Haupt-App, die ich in der Zeile App.Current schließe.Herunterfahren();' – Ivan

+1

@Ivan Was bedeutet eigentlich, dass Sie die Dateigriffe nicht sauber in Ihrer App irgendwo anders schließen. –

+0

Versuchen Sie, Ihre App zu debuggen, und stellen Sie sicher, dass Sie alle geöffneten oder erstellten Dateien explizit schließen. Wenn Ihre Anwendung komplex ist, gibt es Tools, die Ihnen helfen können, wie http://www.jetbrains.com/profiler/index.html –

0

Sie Ordner können auf diese Weise ohne Probleme gelöscht werden, sofern sie nicht verwendet werden und Sie dazu berechtigt sind. Sie können mit SysInternals Handle ermitteln, welche Prozesse auf die gewünschte Datei/den gewünschten Ordner zugreifen. Beachten Sie, dass wenn Sie die Dateien nicht löschen können und Sie nicht auf sie zugreifen können, nur eine Warnung ausgeben: "Konnte Ordner nicht bereinigen: Vorschaubilder" Anstatt die Apps des Benutzers nach dem Zufallsprinzip zu löschen, bis Sie ein PNG löschen können.

Auf eine Randnotiz: Erinnere mich daran, keine Anwendung zu verwenden, die Büro töten kann und jede Arbeit, die ich getan habe, ablegen.

Sie sollten die PIDs von jedem Prozess verwenden, den Sie starten oder noch besser, verwenden Sie IPC, um eine freundliche Shutdown-Anforderung zu senden, die Ressourcen vor dem Schließen bereinigen kann. Für Powerpoint ist dies ein einfacher Aufruf des Anwendungsobjekts Quit().

Verwandte Themen