Подтвердить что ты не робот

Php "glob" и дедупликация данных?

У меня есть 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 байтов, а еще не дедуплицированные файлы (которые успешно найдены) показаны с размером, который они логически занимают (на основе размера кластеров файловых систем):

Однако это не объясняет, почему имеет значение, открыт ли файл клиентом или нет. Отчет о размере равен в любое время.

File Attributes of deduplicated and not deduplicated file

4b9b3361

Ответ 1

Я не уверен, что это то, что вы ищете, но я использую   ScanDir() чтобы перечислить все файлы в каталоге, вы можете прервать любую команду на них, как только вы узнаете имя. Он также будет работать с открытыми файлами.

Источник документации PHP scandir

Ответ 2

Это имеет смысл, если целью дедупликации не является дублирование, тогда файлы блокируются, а php can not видят их. Единственное, что нужно сделать, это посмотреть, распространяется ли это ограничение на scandir() и семейство итераторов каталога/файловой системы SPL. Если это так, возможно, не удастся получить их список.

Единственный другой выбор - использовать exec() и строку командной строки Windows, чтобы увидеть, можете ли вы получить список файлов, а затем проанализировать вывод. Это может быть полезно

php exec: не возвращает результат

Удачи!

Ответ 3

Вы пробовали

$files = glob('{,.}*', GLOB_BRACE);

Возможно, что функция дедуплирования данных сохраняет открытый файл в виде скрытого файла.

Ответ 4

Готовы ли вы использовать другую функцию, чем glob()? Вы можете попытаться использовать рекурсивные итераторы SPL, если он найдет открытый файл, который находится на диске с использованием Windows Server 2012 R2, в функции дедупликации данных. Вы можете найти пример того, как вы можете использовать его по этой ссылке.