такое создание файлов атомарно в Windows XP? - PullRequest
3 голосов
/ 16 марта 2011

HI, Я хотел бы использовать файловую систему в качестве блокировки между двумя процессами в Windows XP. то есть, учитывая имя файла "file_lock", процесс получает блокировку, пытаясь создать файл "file_lock", если он еще не существует. Если уже существует, не удается получить блокировку.

т.е.

FileStream fs=new FileStream("c:\\file_lock, FileMode.CreateNew);

Будет ли это работать? Является ли создание файла атомным, если файл еще не существует?

Спасибо!

Ответы [ 3 ]

7 голосов
/ 16 марта 2011

Да, это будет работать. Но не так хорошо, как Mutex по многим причинам, включая:

  1. Что, если у пользователя нет доступа для создания этого файла?
  2. Когда ваше приложение дает сбой, система очищает блокировки Mutex. Он не удалит ваш файл для вас.
  3. Зачем вводить издержки и риск дискового ввода-вывода без необходимости? (и я не уверен, что это возможно, но пока файл открыт, пользователь может переименовать или переместить его, верно?)
  4. Это больше кода.
0 голосов
/ 16 марта 2011

Поскольку вопрос был помечен как C #, этот ответ больше не применяется, но я хотел бы оставить его на тот случай, если в будущем он будет полезен для других.

Если вы используете Java,Вы можете использовать java.nio.channels.FileLock.

Чтобы использовать его, сделайте что-то вроде этого:

import java.io.RandomAccessFile;
import java.nio.FileLock;
...
RandomAccessFile raf = new RandomAccessFile(file, "rw");
FileLock lock = raf.getChannel().tryLock(0L, Long.MAX_VALUE, false);
if (lock != null && lock.isValid()) {
    // You've acquired the lock!
else {
    // You did not acquire the lock
    raf.close();
}

Примечание. Это защищает от доступа других процессов, но не других потоков.Для этого вам нужно будет использовать собственную внутреннюю синхронизацию (вероятно, будет работать блокировка на raf).

0 голосов
/ 16 марта 2011

Если вы хотите использовать файл в качестве блокировки синхронизации, я предлагаю вам следующую процедуру.

  1. Проверьте, существует ли блокировка файла / существует
  2. Если файл заблокирован, другой процесс
  3. Если файл не существует или не имеет блокировки, вы можете получить его
  4. Открыть файл, запрашивающий блокировку

Этот код может помочь вам проверитьзамок.

public static bool isFileLocked(string filename)
{
    if (!File.Exists(filename)) throw new FileNotFoundException("File not found!", filename);

    FileStream fs = null;
    try
    {
        fs = File.Open(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
        return false;
    }
    catch (IOException)
    {
        return true;
    }
    catch (Exception)
    {
        throw;
    }
    finally
    {
        if (fs != null)
        {
            fs.Close();
            fs = null;
        }
    }
}

HTH!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...