2013-09-17 4 views
0

Итак, я пытаюсь создать простой скрипт, у него будет список предопределенных файлов, поиск чего-то, чего нет в списке, и удалить его.Удалить файлы, не соответствующие списку

У меня есть это на текущий

<?php 
$directory = "/home/user/public_html"; 
$files = glob($directory . "*.*"); 

foreach($files as $file) 
{ 

    $sql = mysql_query("SELECT id FROM files WHERE FileName='$file'"); 
    if(mysql_num_rows($sql) == 0) 
     unlink($directory . $file); 
} 
?> 

Однако, я хотел бы избежать запроса, так что я могу запустить скрипт чаще (там около 60-70 файлов, и я хочу, чтобы запустить это каждый 20 секунд или около того?), так как бы я вставлял список файлов в файл php и проверял это вместо базы данных?

Спасибо!

ответ

2

У вас не хватает трейлинг / дважды .. В glob() вы даете /home/user/public_html*.* в качестве аргумента, я думаю, что вы имеете в виду /home/user/public_html/*.*.

Именно поэтому я ставлю пари, что ничего не соответствует файлам в вашей таблице. Это не даст ошибки ни потому, что синтаксис в порядке.

Затем, где вы unlink(), вы делаете это снова .. ваш аргумент home/user/public_htmltestfile.html должен быть home/user/public_html/testfile.html.

Мне нравится этот синтаксис style: "{$directory}/{$file}", потому что он короткий и читаемый. Если отсутствует /, вы сразу увидите его. Вы также можете изменить его на $directory . "/" . $file, это вы предпочитаете. То же самое относится и к одной линии условных операторов .. Так вот он приходит ..

<?php 
$directory = "/home/user/public_html"; 
$files = glob("{$directory}/*.*"); 

foreach($files as $file) 
{ 

    $sql = mysql_query("SELECT id FROM files WHERE FileName=\"{$file}\";"); 
    if(mysql_num_rows($sql) == 0) 
    { 
     unlink("{$directory}/{$file}"); 
    } 
} 
?> 

EDIT: Вы запросили рекурсию. Здесь он идет.

Вам нужно сделать функцию, которую вы можете запустить один раз с помощью пути в качестве аргумента. Затем вы можете запустить эту функцию изнутри этой функции в подкаталогах. Например:

<?php 

/* 
    ListDir list files under directories recursively 
    Arguments: 
    $dir  = directory to be scanned 
    $recursive = in how many levels of recursion do you want to search? (0 for none), default: -1 (for "unlimited") 

*/ 

function ListDir($dir, $recursive=-1) 
{ 
    // if recursive == -1 do "unlimited" but that's no good on a live server! so let's say 999 is enough.. 
    $recursive = ($recursive == -1 ? 999 : $recursive); 

    // array to hold return value 
    $retval = array(); 

    // remove trailing/if it is there and then add it, to make sure there is always just 1/
    $dir = rtrim($dir,"/") . "/*"; 

    // read the directory contents and process each node 
    foreach(glob($dir) as $node) 
    { 
     // skip hidden files 
     if(substr($node,-1) == ".") continue; 

     // if $node is a dir and recursive is greater than 0 (meaning not at the last level or disabled) 
     if(is_dir($node) && $recursive > 0) 
     { 
      // substract 1 of recursive for ever recursion. 
      $recursive--; 
      // run this same function again on itself, merging the return values with the return array 
      $retval = array_merge($retval, ListDir($node, $recursive)); 
     } 
     // if $node is a file, we add it to the array that will be returned from this function 
     elseif(is_file($node)) 
     { 
      $retval[] = $node; 

      // NOTE: if you want you can do some action here in your case you can unlink($node) if it matches your requirements.. 

     } 
    } 
    return $retval; 
} 

// Output the result 
echo "<pre>"; 
print_r(ListDir("/path/to/dir/",1)); 
echo "</pre>"; 

?> 
+0

Косые черты отсутствовали ^^ Входит ли этот поиск в подпапки? Это важно. Кроме того, поскольку я планирую использовать ваши косые черты в сочетании с массивом (хотите запустить его как можно чаще, поэтому я хочу избегать запросов) есть ли команда для перечисления всех файлов (в том числе в подпапках) в формате массива? Поэтому мне не нужно создавать массив в ответе ниже файла по файлу. Благодаря! –

+0

Нет Это не будет, я изменю ответ на рекурсивный поиск. – Chris

+0

Awesome :) Спасибо большое, я собираюсь сделать это в один раз код и поделиться им здесь =) –

1

Если список не является динамическим, хранить его в массив:

$myFiles = array (
    'some.ext', 
    'next.ext', 
    'more.ext' 
); 
$directory = "/home/user/public_html/"; 
$files = glob($directory . "*.*"); 

foreach($files as $file) 
{ 
    if (!in_array($file, $myFiles)) { 
     unlink($directory . $file); 
    } 
} 
+0

Да, я буду использовать массив, поскольку я хочу избежать запросов. Как только я узнаю, как перечислять все файлы в виде массива, поэтому мне не нужно записывать их по файлу (есть много, я думаю). Кроме того, как вы думаете, как часто я могу запускать это как задание cron, не забивая сервер? Я хочу запускать это как можно чаще, поскольку демо-версия системы будет общедоступной, если кто-то решит отказаться от оболочки или чего-то подобного. Спасибо! –

Смежные вопросы