Подтвердить что ты не робот

Как сделать файловую блокировку Windows более похожей на блокировку файлов UNIX?

Блокировка файлов UNIX не работает: операционная система предполагает, что вы знаете, что делаете, и позволяет делать то, что вы хотите:

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

Как разные вещи в Windows: если я пытаюсь удалить файл, который использует другой процесс, я получаю ошибку операционной системы. Файл неприкосновен, пока исходный процесс не заблокирует файл. Это было замечательно в однопользовательские дни MS-DOS, когда любой процесс блокировки, вероятно, находился на том же компьютере, который содержал файлы, однако в сети это кошмар:

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

Какая неприятность!

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

... так можно ли это сделать?

4b9b3361

Ответ 1

В соответствии с MSDN вы можете указать флаг общего режима CreateFile() 3rd parameter (dwSharedMode) FILE_SHARE_DELETE, который:

Разрешает последующие открытые операции с файлом или устройством для запроса доступа на удаление.

В противном случае другие процессы не смогут открыть файл или устройство, если они запрашивают доступ к удалению.

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

Примечание. Доступ к удалению позволяет выполнять операции удаления и переименования.

http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx

Итак, если вы можете управлять своими приложениями, вы можете использовать этот флаг.

Ответ 2

Нет. Windows предназначена для "среднего пользователя", то есть людей, которые ничего не понимают в отношении компьютера. Поэтому ОС пытается быть умным, чтобы избежать PEBKAC s. Процитировать Билла Гейтса: "Нет проблем с Windows, что любое количество людей хочет быть исправленным". Конечно, он знает, что 99,9999% всех пользователей Windows не могут определить, действительно ли программа сделала что-то странное из-за них или того, кто его написал.

Unix был разработан, когда мир был более простым, и кто-то достаточно близко к компьютеру, чтобы его коснуться, вероятно, знал, как собрать его из грязного песка. Поэтому ОС обычно позволяет делать то, что вы хотите, потому что предполагает, что вы знаете лучше (а если нет, то в следующий раз).

Технический ответ: Unix выделяет "i-узлы", если вы создаете файл. I-узлы могут быть разделены между процессами. Если два процесса создают один и тот же файл (т.е. Два процесса вызывают create() с одним и тем же путем), то вы получаете два i-узла. Это по дизайну. Это позволяет использовать удобную функцию безопасности: вы можете создавать файлы, которые никто не может открыть, кроме вас самих:

  • Откройте файл
  • Удалить его (но сохранить дескриптор файла)
  • Используйте файл любым способом, который вам нравится
  • Закройте файл

После шага №2 единственным процессом в юниверсе, который может получить доступ к файлу, является тот, кто его создал (если вы не хотите читать блок жесткого диска по блоку). ОС сохранит данные до тех пор, пока вы не закроете файл, или ваш процесс не исчезнет (в этот момент Unix будет очищаться после вас).

Этот дизайн является основой всех файловых систем Unix. Файловая система Windows NTFS работает так же, но API высокого уровня отличается. Многие приложения открывают файлы в эксклюзивном режиме (который запрещает кому-либо, даже программам резервного копирования) читать файл. Это справедливо и для приложений, которые просто отображают информацию, например, для просмотра PDF файлов.

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

Ответ 3

Обратите внимание, что Process Explorer разрешает принудительное закрытие дескрипторов файлов (для процессов, локальных в поле, в котором вы его запускаете), с помощью дескриптора → Close Handle.

Unlocker имеет целью сделать намного больше и предоставляет полезный список других инструментов.

Кроме того, удаление при перезагрузке - это вариант (хотя это звучит не так, как вы хотите)

Ответ 4

Это действительно не помогает, если у висячего процесса все еще имеется ручка. Он не будет освобождать ресурсы, пока этот зависающий процесс не освободит дескриптор. Но так или иначе, в Windows можно принудительно закрыть файл из-под процесса, который его использует. Обработчик процессов из sysinternals.com позволит вам просмотреть и закрыть дескрипторы, открытые процессом.