2012-03-23 3 views
1

Я работаю над Moodle 2.2.1 и создал файлы dynamic.csv с использованием определенных запросов. Я создал каталог/tmp/с разрешениями на запись в моем домашнем каталоге и используя функции файлов. Я создал файл CSV через свой код.Удалить файл после загрузки - PHP

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

<a href='/moodle/tmp/'".$filename."'> Download </a> 

N с этой строкой в ​​формате .htaccess, файлы можно загрузить на любой компьютер.

AddType application/octet-stream .csv 

Но проблема сейчас есть, каждый раз при загрузке страницы, одни и те же .csv-файлы создаются с различными временными метками. В основном я получаю много дубликатов файлов с разными временными метками в каталоге/tmp /.

Есть ли способ, которым при каждой загрузке этой страницы все существующие экземпляры файлов в этой папке удаляются, и новая партия файлов готова для скачивания. Так что у меня нет дубликатов файлов и всего лишь один экземпляр каждого файла.

Если кто-нибудь может мне помочь, я был бы очень признателен.

Благодаря

EDIT: Если мой код для создания и написания CSV-файл это, то где я должен удалить старые файлы с меткой времени до того часа, как сохранить новые файлы.

foreach($uniquenames as $uniquename) 
{ 
$data = "Header1,Header2,Header3,Header4,Header5\n"; 
$filename = $uniquename.'_'.time().'.csv'; 
$writepath = $filepath.$filename; 
$fh  = fopen($writepath, 'w'); 
$result = $functions->getFiless(); 
foreach($result as $activity) 
{ 
    if($uniquename == $activity->quiz) 
    { 
     $data .= .$somedata.",".$foreachheader."\n";   
    } 
    else 
    { 

    } 
} 
fwrite($fh, $data); 
fclose($fh); 
echo "<p>".$uniquename . "<div class='assessment-reportlink'><a href='/moodle/tmp/".$filename."'> Download </a></p></div>"; 

}

ответ

1

То, что вы в принципе нужно сделать, это:

  • Сканирование в каталог с ScanDir()
  • Петля над ним и проверить время создания файла с filemtime(), чтобы найти «новый файл»
  • Удалите все файлы с помощью unlink(), у которых есть более старые временные метки.

Но помните, что иногда рекомендуется хранить файлы со старыми временными метками. Что делать, если ссылка существует в одном из старых файлов пользователем, работающим в параллельном сеансе? Я предлагаю не удалять файлы на основе того, что является «новейшим», а основано на времени.

Возможно, удалите каждый файл старше 1 часа, и это не самый новый файл.

ПРИМЕР УДАЛЕНИЕ ВСЕ ФАЙЛЫ КРОМЕ ОДНОГО С НОВЕЙШЕЙ TIMESTAMP:

// This is where I would scan the files from 
$directory='./mycsv/'; 

// This scans the files 
$files=scandir($directory); 

// I will store the 'newest' timestamp here 
$newestFileModifiedTime=0; 

// Making sure that there are files 
if(!empty($files)){ 
    foreach($files as $file){ 
     // This ignores all current and parent directory references 
     if($file!='.' && $file!='..'){ 
      // This ignores a directory, if that folder has other folders in it 
      if(!is_dir($directory.$f)){ 
       $fileModifiedTime=filemtime($directory.$file); 
       if($fileModifiedTime>$newestFileModifiedTime){ 
        $newestFileModifiedTime=$fileModifiedTime; 
       } 
      } 
     } 
    } 
    // We loop again since we found a file timestamp 
    if($newestFileModifiedTime!=0){ 
     foreach($files as $file){ 
      // This ignores all current and parent directory references 
      if($file!='.' && $file!='..'){ 
       // This ignores a directory, if that folder has other folders in it 
       if(!is_dir($directory.$f)){ 
        // This deletes all the files that are not with the newest timestamp 
        if(filemtime($directory.$file)!=$newestFileModifiedTime){ 
         // Deleting the file 
         unlink($directory.$file); 
        } 
       } 
      } 
     } 
    } 
} 
+0

Try This Это может помочь вам до –

+0

так изгоняются я делаю это в моем цикле Еогеасп, как редактируются в вопросе или как? Если u cud взять фрагмент моего кода и показать мне точно, что Ur пытается сказать, это было бы действительно полезно. Благодарю. – ivn

+0

Я добавил пример удаления всего, кроме самого нового файла. Однако я не использовал ваш код для базы, но я уверен, что это легко понять. Это было бы проще, если бы вы могли сортировать файлы на основе модифицированного времени с помощью scandir(), его не нужно было бы зацикливать дважды. Альтернатива заключается в том, чтобы использовать то, что user1283565 рекомендовал, удалив все файлы перед созданием нового, но это может быть не очень полезно для некоторых обстоятельств. – kingmaple

0

Перед тем, как создать файл итерацию через существующие файлы в этом каталоге и удалить то, что не является необходимым.

0

Перед созданием файла:

foreach (glob("*.csv") as $filename) {

unlink($filename);

}

5

это горе RKS для меня:

$file = $_GET['f']; 

if ($file and file_exists($file)) 
{ 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($file)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    if (readfile($file)) 
    { 
    unlink($file); 
    } 
} 
Смежные вопросы