Elimina file vicine
-
23-08-2019 - |
Domanda
La lingua usata: C #
Theory:
Voglio creare un file con il FileOptions.DeleteOnClose
bandierina in una cartella temporanea.
Il file viene creato con successo e io scrivere date su di esso, il passo successivo è quello di avviare l'applicazione associata al file Process.Start(...)
e consentire all'utente di controllare il documento, infine, chiudo il mio manico e non appena altro processo chiudere la maniglia per il 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 se aggiungo FileShare.ReadWrite | FileShare.Delete
per la modalità di condivisione.
Qualche suggerimento?
Soluzione
Gli altri processi devono specificare FileShare.Delete
quando aprono il file DeleteOnClose
documentazione MSDN CreateFile :
"
FILE_FLAG_DELETE_ON_CLOSE
... Le successive richieste aperte per il file non riescono, se non è stata specificata la modalitàFILE_SHARE_DELETE
parte".
Altri suggerimenti
Controlla 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 una quota-readwrite, se un secondo programma tenta di aprire con una quota di lettura, il secondo programma è sostanzialmente dicendo che nessun altro può scrivere. Ma il primo programma ha già quel potere così il secondo open fallisce.
Passa a Linux SCNR
Ok, seriamente ora: Questo è un difetto nel sistema operativo Windows, che non può davvero essere aggirato. Ogni programma l'apertura del file deve essere d'accordo su altri programmi che hanno il file aperto nello stesso tempo. Questo è stato un problema che ho avuto tanti anni fa, quando ho ancora usato di Windows pure. Non basta per aprire un file e dire: lasciate che nessuno aprire anche questo. Gli altri devono dire anche aprire questo file, anche se è aperto già.
Su Linux, al contrario, il sistema operativo non consente alcun file di blocco nel modo in cui Windows non a tutti. Qui, se un file viene utilizzato da più di un programma contemporaneamente, i programmi si devono fare in modo che accessi concorrenti vengono bloccati. Inoltre, su Linux, possiamo solo creare il file, assicuriamo è stato avviato l'altro processo e aperto il file e poi basta cancellare il file (mentre è aperto). Il nome del file viene quindi rimosso dal file system immediatelly, ma il file è ancora mantenuto dal driver di file system fino a quando l'ultimo anello (tra cui handle di file aperti) ha ottenuto rimosso.
Torna al tuo problema: Come tutto questo doen't lavoro su Windows, si potrebbe fare altri due approcci:
- Registrare il file da eliminare all'avvio successivo (nei giorni Win3x, c'era una sezione del win.ini per questo. Più recente versione di Windows sostiene ancora che, non riesco proprio a ricordare più a lungo, come si fa ora ).
- Avvia l'altro processo, attendere che si apre il file, chiudere il file e quindi provare ogni minuto per eliminare il file fino a quando la cancellazione riesce ...
Saluti, Bodo