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?

È stato utile?

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:

  1. 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 ).
  2. 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top