Ответ 1
Я не уверен, что это то, что вы ищете, но я использую ScanDir() чтобы перечислить все файлы в каталоге, вы можете прервать любую команду на них, как только вы узнаете имя. Он также будет работать с открытыми файлами.
У меня есть 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
выходит из строя, вызывая это сообщение: -)
Использование указанной функции scandir
показывает то же самое поведение:
Я хочу снова подчеркнуть, что opendir
вместе с readdir
работает в обоих случаях.
Это привело к ожидаемому результату в любое время.
Я отметил, что дедуплицированные файлы показаны с размером "Размер на жестком диске" из 0 байтов, а еще не дедуплицированные файлы (которые успешно найдены) показаны с размером, который они логически занимают (на основе размера кластеров файловых систем):
Однако это не объясняет, почему имеет значение, открыт ли файл клиентом или нет. Отчет о размере равен в любое время.
Я не уверен, что это то, что вы ищете, но я использую ScanDir() чтобы перечислить все файлы в каталоге, вы можете прервать любую команду на них, как только вы узнаете имя. Он также будет работать с открытыми файлами.
Это имеет смысл, если целью дедупликации не является дублирование, тогда файлы блокируются, а php can not видят их. Единственное, что нужно сделать, это посмотреть, распространяется ли это ограничение на scandir() и семейство итераторов каталога/файловой системы SPL. Если это так, возможно, не удастся получить их список.
Единственный другой выбор - использовать exec() и строку командной строки Windows, чтобы увидеть, можете ли вы получить список файлов, а затем проанализировать вывод. Это может быть полезно
php exec: не возвращает результат
Удачи!
Вы пробовали
$files = glob('{,.}*', GLOB_BRACE);
Возможно, что функция дедуплирования данных сохраняет открытый файл в виде скрытого файла.
Готовы ли вы использовать другую функцию, чем glob()
? Вы можете попытаться использовать рекурсивные итераторы SPL, если он найдет открытый файл, который находится на диске с использованием Windows Server 2012 R2, в функции дедупликации данных. Вы можете найти пример того, как вы можете использовать его по этой ссылке.