2015-09-01 18 views
5

Qui è il codice che uso per chiudere la mia domanda, i suoi processi associati e per eliminare tutti i file che sono stati estratti durante l'utilizzo dell'applicazione:Come eliminare i file programmaticamente?

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); 
    } 
} 

Tuttavia, il problema è che quando si cerca per eliminare i file (che sono le immagini utilizzate da qualche parte nell'app) mostra la seguente eccezione:

"Il processo non può accedere al file perché è utilizzato da un altro processo."

Aggiornamento: Ho trovato che il processo di 'Mastersolution.vhost.exe' sta tenendo tutti i file che sto cercando di eliminare. Mastersolution è in realtà l'app principale che sto chiudendo sulla linea App.Current.Shutdown(); Quindi ho bisogno di disconnettere in qualche modo i file dall'applicazione principale prima di eliminarli. Ma zappa per fare questo?

+4

è questa applicazione winforms/wpf/console? Uccidere il/i processo/i e gui non sembra essere il modo più bello di fare le cose .. – Sayse

+0

questo è wpf. Per gui intendo l'applicazione principale – Ivan

risposta

1

Per prima cosa è necessario determinare quale file nella cartella è bloccato: anziché eliminare l'intera cartella, eliminare singoli file. Quindi verificare con Process Explorer e Ctrl + F quale processo utilizza realmente il file non cancellabile.

Inoltre, è possibile utilizzare il metodo WhoIsLocking in questo codice.

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

Si può usare per determinare, quale processo blocca il file. Poi si può scrivere qualcosa di simile a uccidere automaticamente questo processo:

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

Questa è l'ultima soluzione quando non ci sono alternative migliori, come chiudere il file nella vostra app, chiudendo PowerPoint utilizzando l'automazione ecc

+0

, ho trovato che il processo "Mastersolution.vhost.exe" contiene tutti i file che sto tentando di eliminare. Mastersolution è in realtà l'app principale che sto chiudendo sulla linea 'App.Current.Spegnimento();' – Ivan

+1

@Ivan Che in realtà significa che non si chiude il file in modo pulito nella tua app da qualche altra parte. –

+0

Prova a eseguire il debug della tua app e assicurati di chiudere esplicitamente tutti i file aperti o creati. Se la tua applicazione è complessa, ci sono strumenti che possono aiutarti, come http://www.jetbrains.com/profiler/index.html –

0

È puoi eliminare le cartelle in questo modo senza problemi, a condizione che non siano in uso e che tu sia autorizzato a farlo. È possibile utilizzare l'handle di SysInternals per determinare quali processi accedono al file o alla cartella desiderati. Nota che se non puoi cancellare i file e non è il tuo processo ad accedervi, basta sollevare un avviso: "Impossibile pulire la cartella: slide Anteprime" Invece di uccidere casualmente le app degli utenti fino a quando non puoi eliminare un png.

Nota a margine: Ricordami di non utilizzare un'applicazione che può uccidere l'ufficio e interrompere il lavoro che ho svolto.

Si dovrebbe usare il pid di ogni processo che si avvia o meglio ancora, utilizzare IPC per inviare una richiesta di spegnimento amichevole che può ripulire le risorse prima della chiusura. Per powerpoint questo è semplice come chiamare Quit() sull'oggetto dell'applicazione.

Problemi correlati