Могу ли я использовать FileStream для реализации блокировки файлов? - PullRequest
5 голосов
/ 29 ноября 2010

Можно ли использовать конструктор FileStream, чтобы гарантировать, что только один процесс обращается к файлу за раз?Будет ли работать следующий код?

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;
    }
}

В частности, является ли поведение с FileMode.Create атомарным WRT другими процессами?Есть ли что-то еще, что я должен использовать?

РЕДАКТИРОВАТЬ: точнее, это на Microsoft CLR с использованием локальных файлов на одной машине.

Ответы [ 2 ]

2 голосов
/ 29 ноября 2010

Это будет делать то, что вы хотите. FileShare.None является важной частью.

Если все приложения для записи находятся на одном компьютере, вы также можете использовать с именем Mutex для достижения той же цели без необходимости в физическом файле или для обеспечения доступа к файлу, если вас это не волнует кто пишет в файл последним (только то, что пишет не одновременно). Это может избавить вас от необходимости каждый раз открывать файл и обеспечивать семантику блокировки вместо цикла Sleep (лучше перф).

Обратите внимание, что любой процесс может сесть на корточки в вашем файле (Mutex), если имя не считается секретным, т. Е. Информация, которая должна храниться в безопасности.

1 голос
/ 29 ноября 2010

Это будет работать при следующих предостережениях:

  • Вы находитесь в Windows (в Linux через Mono это не работает, поскольку блокировки файлов рекомендуются, поэтому ваш метод всегда срабатывает)1004 *
  • Вы получаете доступ к локальному файлу (вероятно, SMB также будет работать, но NFS или WebDAV почти наверняка не будут)нарушения обмена
...