Блокировка файла для записи / удаления, позволяя любому процессу читать - PullRequest
12 голосов
/ 19 июля 2010

Я занимаюсь разработкой приложения на C # (.NET), и у меня возникают проблемы с блокировкой файлов.

  • Моему основному приложению (A) требуется доступ на чтение / запись к определенному файлу.
  • Отдельному приложению (B) необходим доступ на чтение к тому же файлу.
  • Мне нужно запретить пользователю редактировать или удалять файл во время работы моего приложения (A).Приложение (A) является долгосрочным.Файл не должен быть удален во время выполнения (A), даже если он не читается или не активно записывается.

У меня есть полный контроль над источником (A) и (B), поэтому я могу изменить любой из них.

Как я могу помешать пользователю изменять / удалять файл во время работы приложения (A), позволяя приложению (A) выполнять чтение / запись, и приложению (B)) читать?

Ответы [ 4 ]

16 голосов
/ 19 июля 2010

Используйте FileShare.Read, чтобы разрешить чтение только из других приложений.Вы можете заблокировать файл, открыв поток во время работы приложения А.Вам нужно NonClosingStreamWrapper, чтобы избежать утилизации потока при утилизации вашего StreamWriter (это происходит автоматически с using)

NonClosingStreamWrapper Jon Skeet можно найти в здесь

Пример

Когда приложение запускается, используйте его для блокировки файла

FileStream fileStream = new FileStream(file, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);

При записи в файл используйте

using (StreamWriter sr = new StreamWriter(new NonClosingStreamWrapper(fileStream)))
{
    // File writing as usual
}

Когда приложение заканчивается, используйте его для освобождения файла

fileStream.Close();
2 голосов
/ 19 июня 2015

В большинстве случаев блокировка файла не препятствует удалению пользователем файла, а информирует пользователя, работающего с другим экземпляром приложения, о том, что файл «используется» другим пользователем.Это особенно полезно, если несколько пользователей открывают файл r / wa в общей папке.В таком случае вместо блокировки файла на уровне файловой системы было бы намного проще использовать «файл блокировки», сгенерированный, когда приложение (A) открывает файл.Таким образом, любое другое приложение заметит, что файл блокировки существует (вы можете назвать его, используя то же имя файла, но с другим расширением), а также внутри файла блокировки вы можете написать, кто и когда получил блокировку.Приложение (B) теперь может отвечать пользователю ... "Файл, кажется, находится в процессе изменения пользователем xxx с компьютера. Ггг, вы действительно хотите загрузить его?"

Конечно, приложение должно удалитьзаблокировать файл, когда файл приложения больше не используется или когда приложение закрывается.В «неудачном» случае, когда сбой оставляет блокировку файловой системы, пользователь может просто ответить «да» на запрос предупреждения или может вручную удалить его, чтобы снять блокировку.

Надеюсь, это поможет,

Паоло Марани

0 голосов
/ 21 ноября 2017

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

Я использую это для блокировки zip-файла, который я использую позже, чтобы он мог быть прочитан другими, но не может быть изменен или изменен Если я использую ответ @Cloudanger, я больше не могу читать zip-файл в других процессах.

FileStream fileStreamSslFile = new FileStream(zipFile, FileMode.OpenOrCreate, 
FileAccess.Read, FileShare.Read);
0 голосов
/ 19 июля 2010

, хотя я не использовал его, но имя Mutex может спасти ваш день.Перед тем, как открыть файл в приложении A, создайте мьютекст, подобный следующему:

Mutex(bool initiallyOwned, string name, out bool createdNew)

передать имя файла в качестве второго параметра.

теперь, когда вы открываете файл в приложении B, снова используйте Mutex если out параметр createdNew равен false, то файл уже открыт буквой A, поэтому вы можете только читать его.

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