Если вы спросите старого пердуна: "Как проверить наличие файла?", он наверняка ответит: "Используй
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 можно просто не указывать.
Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.
Примечание. Отправлять комментарии могут только участники этого блога.