2009-02-13 13 views
13

linguistiche: il C#Elimina file stretti

Teoria: Voglio creare un file con il FileOptions.DeleteOnClose bandierina in una cartella temporanea. Il file è stato creato con successo e scrivo il dato su di esso, il passo successivo è avviare l'applicazione associata al file Process.Start (...) e consentire all'utente di ispezionare il documento, infine chiudo il mio handle e non appena mentre l'altro processo chiude l'handle nel file temporaneo, il file viene eliminato dal sistema operativo.

Il mio problema è che altri processi non possono aprire il file, anche per la lettura, nonostante aggiungo FileShare.ReadWrite | FileShare.Delete alla modalità di condivisione.

Qualche suggerimento?

risposta

17

Gli altri processi devono specificare FileShare.Delete quando aprono il file DeleteOnClose

Dalle MSDN CreateFile documentazione:

"FILE_FLAG_DELETE_ON_CLOSE ... Le successive richieste aperte per il file non riescono, a meno che la modalità di condivisione FILE_SHARE_DELETE è specificato."

+0

Ok, dovrei leggere il documento MSDN. Grazie per la risposta. Risolverò il problema usando un'applicazione di monitoraggio, quando il processo termina, cancello il file temporaneo. – xoreax

-6

passare a Linux SCNR

Ok, seriamente ora: Questa è una falla nel sistema operativo Windows, che non può davvero essere aggirato. Ogni programma che apre il file deve concordare su altri programmi con il file aperto nello stesso tempo. Questo è stato un problema che ho avuto molti anni fa quando usavo ancora Windows. Non è sufficiente aprire un file e dire: Permetti a chiunque altro di aprire anche questo. Gli altri devono anche dire di aprire questo file anche se è già aperto.

Su Linux, al contrario, il sistema operativo non consente alcun blocco di file nel modo in cui Windows fa del tutto. Qui, se un file viene utilizzato da più di un programma contemporaneamente, i programmi stessi devono assicurarsi che gli accessi concorrenti vengano bloccati. Inoltre, su Linux, possiamo semplicemente creare il file, assicurarci che l'altro processo sia stato avviato e aperto il file e quindi eliminare il file (mentre è aperto). Il nome file viene quindi rimosso immediatamente dal file system, ma il file viene comunque mantenuto dal driver del file system fino a quando l'ultimo collegamento (inclusi gli handle di file aperti) non viene rimosso.

Torna al tuo problema: Come tutto questo doen't lavoro su Windows, si potrebbe fare altri due approcci:

  1. Registrare il file da eliminare all'avvio successivo (nei giorni Win3x, c'era una sezione nel file win.ini per quello. La versione Windows più recente lo supporta ancora, non riesco più a ricordare, come è fatto ora).
  2. avviare l'altro processo, attendere che si apre il file, chiudere il file e quindi provare ogni minuto per eliminare il file fino a eliminazione riesce ...

saluti, Bodo

+1

Ma Unix in generale (non certo di Linux, ma probabilmente anche di Linux) non ha un'opzione "elimina quando il file è chiuso". –

+1

Questo perché è possibile eliminarlo anche quando è aperto. Finché chiunque ne abbia bisogno ha una maniglia, le cose funzioneranno. –

-1

I desidera creare un file con la bandiera FileOptions.DeleteOnClose in una cartella temporanea .

chiudo il mio manico e non appena altri processo chiudere la maniglia per il file temporaneo , il file viene eliminato dal sistema operativo.

Prego elaborare. Come viene cancellato questo file dal sistema operativo. Se intendi rimuovilo per codice. Perché non salvare il filestream. Quindi puoi aprirlo con Process.Inizia

+0

Si tratta di un'opzione su Windows, discussa di recente in un'altra domanda SO che non riesco a individuare. –

0

Controllare questo:

È necessario fare in modo che tutti i processi stanno aprendo il file con FileShare.ReadWrite e FileShare.Delete.

Anche se il creatore si apre con share-readwrite, se un secondo programma tenta di aprirsi con share-read, il secondo programma sta fondamentalmente dicendo che nessun altro può scrivere. Ma il primo programma ha già quel potere, quindi il secondo open fallisce.

+0

Tuttavia, il creatore può creare il file, quindi chiuderlo e riaprirlo con Condividi sola lettura. Infine, il problema non risiede proprio nell'avere il file aperto da due processi contemporaneamente, ma nella domanda su come implementare quell'autodelete. –

+1

bothie, il sistema operativo cancellerà immediatamente il file, quindi la riapertura fallirà. – paxdiablo