2010-07-24 9 views
5


Sto sviluppando un'applicazione che richiede di eliminare un file, non importa è in uso da un altro processoCancellare un file con forza, anche se è utilizzato da l'altro processo

Si consideri il seguente frammento di codice.

using System; 
using System.IO; 

namespace DotNet_Concepts.File_Operation 
{ 
    class Deleting_File_Which_Is_In_Use 
    { 
     static void Main(string[] args) 
     { 
      StreamReader lclFileStream = null; 
      string lclFileName=string.Empty; 
      try 
      { 
       [email protected]"E:\Visual Studio 2008 Projects\DotNet Concepts\DotNet Concepts\Local Files\Garbage.txt"; 
       if (File.Exists(lclFileName)) 
       { 
        lclFileStream = new StreamReader(lclFileName); 
        if (lclFileStream != null) 
        { 
         //Doing some operation 
        } 
        //Deleting the file before closing the stream 
        File.Delete(lclFileName); 
       } 
      } 
      catch (Exception ex) 
      { 

       System.Diagnostics.Debug.WriteLine(ex.StackTrace); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

Sto cancellando il file utilizzato dallo stesso processo. E 'possibile eliminare il file

Grazie, Amit Shah

+0

ma il file è in uso. Allora, perché eliminarlo? –

+2

Duplicate - http://stackoverflow.com/questions/1040/how-do-i-delete-a-file-which-is-locked-by-another-process-in-c? –

+0

Non è chiaro dalla tua domanda se vuoi chiudere un file che hai aperto. Se questo è il caso, usa il consiglio di Ed Swangren. –

risposta

1

sto eliminando il file che viene utilizzato con il medesimo procedimento

Basta chiudere il file prima ...

+0

e se il tuo file è utilizzato da altri processi puoi provare CreateRemoteThread() per chiudere l'handle. – fardjad

+0

Il codice sopra riportato serve solo per visualizzare l'errore. Ho un file swf ospitato che usa il file wav. Ho un'applicazione back-end che modifica lo stesso file wave che viene utilizzato da swf. Voglio che l'onda aggiornata sia resa in swf. E l'unico modo è quello di sostituire il file esistente. –

+0

Supponi che questo sia "l'unico modo". –

6

Sì, questo è un noto problema di sicurezza di Windows, noto come "attacco di riciclo maniglia". È tecnicamente possibile percorrere la tabella degli handle del kernel non documentata, inserire il codice nel processo che possiede l'handle e chiamare CloseHandle() per chiudere l'handle del file. Molto difficile da sfruttare, hai bisogno dei diritti di amministratore per farlo. Modi migliori per rovinare un processo se hai quel diritto.

Quello che risulta è più di un attacco di tipo Denial of Service, uno che cattura a caso la macchina senza alcun modo di scoprire come è successo. Il processo non è a conoscenza del fatto che l'handle del file è stato chiuso, non l'ha chiuso e continua a scrivere sull'handle. I dati scritti cadono nel pozzetto. Ignorare il valore di ritorno di WriteFile() è piuttosto standard nella maggior parte dei programmi non gestiti.

Fino a quando il processo apre un'altra maniglia per scrivere, ad esempio, in un database. Le maniglie sono riciclate, può ottenere lo stesso valore di impugnatura. Ora il processo sta scrivendo i normali dati del database, mescolati con i dati che dovevano andare nel file ora chiuso.

L'ilarità si verifica quando qualcuno tenta di leggere i dati da quel database. O qualunque altra risorsa sia stata distrutta, è casuale. Sei un po 'coperto, nessuno riuscirà a capire che è stato il tuo programma a distruggere la macchina.

2
using System.Collections; 
using System.Diagnostics; 
using System.Management; 

if (File.Exists(@"D:\New folder\Test0001.wav")) 
{ 
    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 
    FileInfo f = new FileInfo(@"D:\New folder\Test0001.wav"); 
    f.Delete(); 
} 
+0

che non è "forcefull". se il file è in uso, il codice genererà un'eccezione.Anche File.Delete (percorso) come l'OP ha usato farà esattamente la stessa cosa che hai fatto con FileInfo.Delete(). –

Problemi correlati