2015-08-08 2 views
3

Прежде чем кто-то отметит этот дубликат, поймите, что я искал этот сайт, поисковые запросы Google и PHP.net.Список всех файлов с датами рекурсивно с PHP

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

Лучшие один я нашел до сих пор это одна:

header("Pragma: public"); 
    header("Cache-Control: private"); 
    header("Content-Type: text/csv"); 
    header("Content-Disposition: attachment; filename=age-of-files.csv"); 

    $result = array(); 
    $handle = opendir("."); 
    while ($datei = readdir($handle)) 
    { 
      if (($datei != '.') && ($datei != '..')) 
      { 
       $file = "./".$datei; 
       if (!is_dir($file)) 
        $result[] = $file; 
      } 
    } 
    closedir($handle); 
    foreach($result as $r) 
    if (file_exists($r)) 
     echo substr($r,2).",".date ("m-d-Y", filemtime($r))."\r\n"; 

Это прекрасно работает для dircetory скрипт запускается в, но это не является рекурсивным. Мне нужно, чтобы он продолжал работать в каждом подкаталоге. Моя цель состоит в том, чтобы иметь отсортированный список, чтобы я мог находить файлы, которые были изменены на определенных датах или вокруг них.

Я новичок в PHP, поэтому несите меня. Я провел некоторое исследование на PHP.net (я все время вижу, что люди относятся к SPL, и я не уверен, что это означает или что это такое, но, возможно, это группа стандартных классов PHP?), И мне кажется, что мне нужно чтобы каким-то образом использовать RecursiveDirectoryIterator.

Я нашел этот скрипт, который отлично выглядит на бумаге, но запуск его на моем сайте дает пустой белый экран.

try 
{ 
     /*** freds home directory ***/ 
     $rdi = new recursiveDirectoryIterator('/', FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS); 
     $it = new recursiveIteratorIterator($rdi); 
     while($it->valid()) 
     { 
       if(!$it->isDir()) 
       { 
         echo $it->current().' '.date('Y m d H:i:s', $it->getATime())."\n"; 
       } 

       /*** move to the next element ***/ 
       $it->next(); 
     } 
} 
catch(Exception $e) 
{ 
     /*** echo the error message ***/ 
     echo $e->getMessage(); 
} 

Я предпочел бы использовать первый сценарий, как мне нравится, что он создает файл CSV (легко сортировать), но я не знаю, как примирить два. Может ли кто-нибудь посоветовать мне, как включить RDI в первый скрипт?

+0

Попробуйте без этих ', FilesystemIterator :: SKIP_DOTS | FilesystemIterator :: UNIX_PATHS' – Sayed

ответ

0

Вот небольшой код, который я нашел очень хорошо работает

$rdi = new RecursiveDirectoryIterator("path/"); // The directory here 
$rii = new RecursiveIteratorIterator($rdi); 

foreach ($rii as $filename=>$cur) { 
    echo $cur.' '.date('Y m d H:i:s', $cur->getATime())."<br/>"; 
} 
+0

Это отлично работает, если я заменил «путь /» на «.». – UserX

1

Попробуйте что-то вроде этого, который похож на второй пример, который вы предоставили:

<?php 

$path = __DIR__; 

if (!is_dir($path)) { 
    throw new RuntimeException(sprintf('Path %s does not exist!', $path)); 
} 

if (!is_readable($path)) { 
    throw new RuntimeException(sprintf('Path %s is not readable!', $path)); 
} 

$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($path) 
); 

$files = []; 

foreach ($iterator as $fileInfo) { 
    if ($fileInfo->isFile()) { 
     $files[] = [ 
      $fileInfo->getFilename(), 
      dirname($fileInfo->getPathname()), 
      date('c', $fileInfo->getMTime()) 
     ]; 
    } 
} 

print_r($files); 

Учитывая пример файла структуры :

enter image description here

Это дает:

Array 
(
    [0] => Array 
     (
      [0] => .DS_Store 
      [1] => /private/tmp/rec 
      [2] => 2015-08-08T08:28:33+00:00 
     ) 

    [1] => Array 
     (
      [0] => .DS_Store 
      [1] => /private/tmp/rec/0 
      [2] => 2015-08-08T08:28:33+00:00 
     ) 

    [2] => Array 
     (
      [0] => 0.1.txt 
      [1] => /private/tmp/rec/0/0.1 
      [2] => 2015-08-08T08:27:58+00:00 
     ) 

    [3] => Array 
     (
      [0] => 0.txt 
      [1] => /private/tmp/rec/0 
      [2] => 2015-08-08T08:27:58+00:00 
     ) 

    [4] => Array 
     (
      [0] => .DS_Store 
      [1] => /private/tmp/rec/1 
      [2] => 2015-08-08T08:28:33+00:00 
     ) 

    [5] => Array 
     (
      [0] => .DS_Store 
      [1] => /private/tmp/rec/1/1.1 
      [2] => 2015-08-08T08:28:27+00:00 
     ) 

    [6] => Array 
     (
      [0] => 1.1.txt 
      [1] => /private/tmp/rec/1/1.1 
      [2] => 2015-08-08T08:27:58+00:00 
     ) 

    [7] => Array 
     (
      [0] => 1.txt 
      [1] => /private/tmp/rec/1 
      [2] => 2015-08-08T08:27:58+00:00 
     ) 

    [8] => Array 
     (
      [0] => rec.php 
      [1] => /private/tmp/rec 
      [2] => 2015-08-08T08:48:30+00:00 
     ) 

) 

Каждый матч сохраняется как элемент суб-массива, содержащего:

  1. Имя файла
  2. Текущий dirpath
  3. Datetime последней модификации

Это делает некоторые дополнительные проверки на убедитесь, что предоставленный $path может быть прочитан.

Теперь у вас есть результирующий набор $files в массиве, вы должны иметь возможность повторно использовать часть кода в первом примере для вывода в виде CSV-файла.

Надеется, что это помогает :)

+0

Спасибо! Я поиграю с этим и посмотрю, смогу ли я включить его в первый пример, который я опубликовал, поскольку я думаю, что это было бы более красноречивым решением. – UserX

+0

Нет проблем. Вчера я бросился за дверь, поэтому у меня не было времени, чтобы ответить на вопрос. Экспорт в .csv. И ... Я снова устремляюсь снова :) но я постараюсь соответствующим образом обновить ответ, когда смогу, вместо создания массива в основном цикле было бы лучше построить .csv напрямую с ' fputcsv() 'и т. д. –

1

Если кому-то интересно, это то, что я закончил с. Он сочетает в себе простоту и эффективность первого ответа с csv первого примера в моем вопросе. Когда я открываю файл csv в excel, я могу сортировать по дням легко.

Причина, по которой я нуждался в этом, заключалась в том, чтобы помочь отслеживать некоторые вредоносные программы на одном из моих сайтов. Имея список всех файлов, я могу сортировать по дате и искать файлы, которые были добавлены в подозрительные даты. Или, наоборот, если я обнаружил известную угрозу в определенный день, я могу легко увидеть, какие другие файлы были изменены в этот день/время. Это очень помогло мне, наконец, избавив мой сайт от постоянной инфекции. Это продолжало оживать, потому что я не смог удалить все файлы. Используя этот простой скрипт, я наконец нашел установленную бэкдор-оболочку. Уф!

Большое спасибо обоим автоответчикам! :)

<?php 
header("Pragma: public"); 
header("Cache-Control: private"); 
header("Content-Type: text/csv"); 
header("Content-Disposition: attachment; filename=age-of-files.csv"); 

$rdi = new RecursiveDirectoryIterator("."); // The directory here 
$rii = new RecursiveIteratorIterator($rdi); 

foreach ($rii as $filename=>$cur) { 
    echo $cur.', '.date('m-d-Y', $cur->getATime()).', '.date('H:i:s', $cur->getATime())."\r\n"; 
} 
?> 
Смежные вопросы