Удаление каталога в Windows без участия гонок? - PullRequest
3 голосов
/ 19 марта 2012

http://code.google.com/p/guava-libraries/issues/detail?id=365 обсуждает потенциальные условия гонки, которые могут возникнуть при рекурсивном удалении каталога.

Согласно http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7148952 это может быть реализовано без гонки в Linux с использованием openat () . Есть ли эквивалентный механизм под Windows?

1 Ответ

0 голосов
/ 10 февраля 2014

Ключевым отличием между поведением файловой системы Windows и поведением файловой системы linux является блокировка и подсчет ссылок.

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

Итак, если у кого-то открыт файл «C: \ a \ b \ c \ d \ file.txt», то никому не разрешается переименовывать или удалять любую часть пути «C: \ a \ b \ c \ d». \ file.txt».

Модель linux сильно отличается, любая часть этого пути может быть изменена, и даже файл может быть удален. Процесс, удерживающий дескриптор в file.txt, все еще имеет ссылку, и файл не будет удален из файловой системы, пока все дескрипторы не будут закрыты.

Win32 API не предоставляет прямой способ хранения дескриптора каталога (хотя для этого есть API - смотрите функции "Zw", FindFirstFile, может быть, я не уверен, API резервного копирования и т. Д.) - но ваш процесс "текущий каталог" содержит дескриптор этого каталога.

Таким образом, вы можете получить поведение "openat", изменив свой рабочий каталог и затем открыв файл напрямую. Лучше было бы использовать что-то вроде ZwCreateFile (), чтобы открыть дескриптор каталога - поскольку «текущий каталог» является глобальным процессом.

Поиск Stackoverflow и Microsoft.com для получения информации ZwCreateFile.

...