Domanda

È possibile utilizzare il costruttore FileStream per garantire un solo processo accede a un file alla volta? Sarà il seguente lavoro codice?

public static IDisposable AcquireFileLock() {
    IDisposable lockObj;
    do {
        // spinlock - continually try to open the file until we succeed
        lockObj = TryOpenLockFile();

        // sleep for a little bit to let someone else have a go if we fail
        if (lockObj == null) Thread.Sleep(100); 
    }
    while (lockObj == null);

    return lockObj;
}

private static FileStream TryOpenLockFile() {
    try {
        return new FileStream(s_LockFileName, FileMode.Create, FileAccess.Read, FileShare.None);
    }
    catch (IOException) {
        return null;
    }
}

In particolare, è il comportamento con FileMode.Create WRT atomica altri processi? C'è qualcos'altro che dovrei usare?

EDIT:. Per essere più precisi, questo è il Microsoft CLR utilizzando i file locali su una singola macchina

È stato utile?

Soluzione

Questo farà quello che vuoi. FileShare.None è la parte importante.

Se tutte le applicazioni scrittore si trovano sullo stesso computer, è anche possibile utilizzare un chiamato Mutex per raggiungere lo stesso obiettivo senza essere bisogno di un file fisico, o per l'accesso ai file mediato se non si cura che scrive per l'ultimo file (solo che le scritture non sono concomitanti). Questo potrebbe risparmiare da dover riaprire il file ogni volta, e di fornire una semantica invece il blocco del vostro Sleep loop (meglio perf).

Si noti che qualsiasi processo può accovacciarsi sul vostro file (Mutex) se il nome non è trattata come un segreto, vale a dire le informazioni che devono essere tenuti al sicuro.

Altri suggerimenti

Questo lavoro, date le seguenti avvertenze:

  • Sei su Windows (su Linux via Mono, questo non regge in quanto blocchi di file sono di consulenza, in modo che il metodo riesce sempre)
  • Si accede a un file locale (SMB sarà probabilmente anche il lavoro, ma NFS o WebDAV quasi certamente non sarà)
  • Facendo IOException è probabilmente troppo ampia, è necessario verificare in particolare che non è riuscito a causa di una violazione di condivisione
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top