2012-07-03 2 views
12

То, что я пытаюсь сделать, это когда моя программа использует файл, я хочу, чтобы пользователь не переименовал, не удалил или не переместил файл (ну ... move - это удаление и создание в другом месте в соответствии с Windows FileSystemWatcher, но я отвлекаюсь).Запретить пользователю удалять, перемещать или переименовывать файл

Было предложено использовать FileStream.Lock или использовать Mutex. Однако FileStream.Lock кажется только для предотвращения изменения файла , который я пытаюсь разрешить. Кроме того, я очень не уверен, что если мьютекс может заблокировать файл, хотя я все еще читаю его в библиотеке .Net 4.0.

Есть ли у кого-нибудь советы по использованию одного из них, и если есть решение для решения этой проблемы на основе кода?

+0

Это звучит как очень необычный потребительной случае. Мне любопытно, как вы оказались в этой ситуации ... неужели вы хотите объяснить дальше? Возможно, есть архитектурное решение. – JDB

ответ

19

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

Открытие файла с FileAccess.Read дает вам возможность читать файл, а FileShare.ReadWrite позволяет файлу продолжать редактироваться, но не удаляться и не перемещаться.

var fs = File.Open(@"C:\temp\file.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
MessageBox.Show("File Locked"); // While the messagebox is up, try to open or delete the file. 
// Do your work here 
fs.Close(); 
+0

Вау, это даже предотвращает переименование файлов. Спасибо за это, это будет работать лучше, чем я думал, поскольку он даже подбрасывает Microsoft Boxes: D –

3

Это позволит предотвратить перемещение или удаление файла, но позволяет читать и писать:

using (FileStream fs = new FileStream(@"C:\TestDir\Test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
    { 
     // Do Stuff. 
    } 

FileStream.Lock на самом деле замок диапазон, который предотвращает изменение конкретной части файла в то время как блокировка Ручной.

+1

+1 Первый правильный ответ. – JDB

+0

FTR @JohnKoerner решил это на 3 минуты раньше. –

0

Если вы хотите, чтобы заблокировать все (Dont читал, то не писать, то не удалять, не двигают, ...)
Открыть StreamWriter

StreamWriter sw = new StreamWriter(path); 
Смежные вопросы