понедельник, 9 сентября 2019 г.

Суеверие: почему старожилы предпочитают GetFileAttributes для проверки существования файла?

Это перевод Superstition: Why is GetFileAttributes the way old-timers test file existence? Автор: Реймонд Чен.

Если вы спросите старого пердуна: "Как проверить наличие файла?", он наверняка ответит: "Используй GetFileAttributes". Это и сегодня, вероятно, самый быстрый способ проверки существования файла, поскольку он требует только одного вызова. Другие методы (такие как FindFirstFile или CreateFile) требуют дополнительного вызова FindClose или CloseHandle - что приведёт к дополнительным запросам по сети, увеличивая стоимость проверки.

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

Дело в том, что у некоторых сетевых провайдеров была функция, называемая "путь данных" (data path). Вы можете добавлять каталоги в "путь данных". Если попытка открыть файл завершается ошибкой, сетевой провайдер попытается повторить попытку открытия во всех каталогах из "пути данных". Например, предположим, что ваш путь данных равен \\server1\backups\dir1;\\server1\backups\dir2, и вы пытаетесь открыть файл File.txt. Если файл File.txt не может быть найден в текущем каталоге, сетевой провайдер попытается снова, ища \\server1\backups\dir1\File.txt, и если он не сможет найти этот файл, он попытается снова с \\server1\backups\dir2\File.txt.

Весь этот дополнительный поиск пути происходит за спиной Windows. Windows понятия не имеет, что это происходит. Всё, что она знает - она отправила вызов открытия файла, и он завершился успешно.

В результате, если вы используете алгоритм "открыть файл, чтобы увидеть, существует ли он", вы получите неверный результат для любого файла, который существует в пути данных, но отсутствует в текущем каталоге. Однако эти сетевые провайдеры не выполняли поиск в "пути данных" для вызова GetFileAttributes, поэтому вызов GetFileAttributes завершился бы неудачей, если бы файл не существовал в текущем каталоге, независимо от того, существовал ли он в пути данных.

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

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.