У меня есть php-приложение, которое (по запросу) сканирует наличие некоторых файлов. (на общем сетевом ресурсе)
Я использую glob
для этого, потому что обычно я просто знаю начало имени файла.
Я заметил, что glob
не возвращает файлы, которые в настоящее время открыты любым клиентом, поэтому мое приложение считает, что file_xy
не существует, если кто-то его открыл.
Есть ли способ сделать glob
возвращать открытые (: = заблокированные?) файлы?
Странно, что это не так, где упоминалось. Однако я могу подтвердить, что glob НЕ возвращает файлы, которые в настоящее время открыты клиентом... (Как только клиент закрывает приложение для доступа, glob
вернет файл как обычно)
ps.: даже glob("\\server\share\*")
возвращает файл до тех пор, пока он открыт. (Network Share позволяет максимальное количество одновременных пользователей)
$dir = opendir ("\\server\share");
while ($file = readdir($dir)){
echo $file."<br />";
}
показывает файл, о котором идет речь, совершенно нормально, независимо от того, открыт ли он другим клиентом или нет. - Поэтому я почти исключаю любой доступ-ограничение/разрешение...
Я понял причину, даже если теперь не знаю причину:
Проблема с glob()
, не обнаруживающая открытый файл, появляется, когда файл находится на диске, использующем Windows Server 2012 R2, в функции дедупликации данных.
Если я переведу файл на не дедуплицированный ресурс, glob()
может его прочитать, даже если он открыт несколькими клиентами.
Поскольку у меня есть рабочая альтернатива, этот вопрос должен в основном фокусироваться на вопросе, почему глобус не работает, или, скажем, работать здесь. Должна быть разница в том, как glob
и readdir
получают доступ к подстилающей файловой системе для определения содержимого.
Другое доказательство
Существует еще одно доказательство того, что это относится к дедупликации данных: я настроил функцию "только" дедуплицировать файлы старше 3 дней.
Я установил cronjob, "открытие и глотание" определенного файла на общем ресурсе. Как только было ~ 3 дня (Windows решает, когда дедуплицировать), glob не смог перечислить файл, пока его открыл другой клиент.
Таким образом, glob может находить открытые файлы, которые были скопированы на долю в течение первых 3 дней - и затем начинает пропустить его, как только он был дедуплицирован.
Наблюдения
Glob
glob
выходит из строя, вызывая это сообщение: -)
ScanDir
Использование указанной функции scandir
показывает то же самое поведение:
- дедуплицированный файл, открытый клиентом - отсутствует в результирующем массиве.
- дедуплицированный файл, не открытый клиенту - часть результирующего массива.
opendir/readdir
Я хочу снова подчеркнуть, что opendir
вместе с readdir
работает в обоих случаях.
RecursiveDirectoryIterator
Это привело к ожидаемому результату в любое время.
Атрибуты файлов
Я отметил, что дедуплицированные файлы показаны с размером "Размер на жестком диске" из 0 байтов, а еще не дедуплицированные файлы (которые успешно найдены) показаны с размером, который они логически занимают (на основе размера кластеров файловых систем):
Однако это не объясняет, почему имеет значение, открыт ли файл клиентом или нет. Отчет о размере равен в любое время.