Удалить файл после загрузки - PHP

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

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

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

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

 AddType application/octet-stream .csv

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

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

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

Спасибо

РЕДАКТИРОВАТЬ: Если мой код для создания и записи файла .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>";

}


person ivn    schedule 23.03.2012    source источник


Ответы (4)


Что вам в основном нужно сделать, это:

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

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

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

ПРИМЕР УДАЛЕНИЯ ВСЕХ ФАЙЛОВ, КРОМЕ ОДНОГО С НОВЕЙШЕЙ ОТМЕТКОЙ ВРЕМЕНИ:

// 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);
                    }
                }
            }   
        }
    }
}
person kingmaple    schedule 23.03.2012
comment
Попробуйте это Это может помочь вам - person OM The Eternity; 23.03.2012
comment
так что я делаю это в своем цикле foreach, как отредактировано в вопросе, или как? Если вы возьмете фрагмент моего кода и покажете мне, что именно вы пытаетесь сказать, это будет действительно полезно. Спасибо. - person ivn; 23.03.2012
comment
Я добавил пример удаления всего, кроме самого нового файла. Я не использовал ваш код для базы, но я уверен, что это легко понять. Это было бы проще, если бы вы могли сортировать файлы на основе времени изменения с помощью scandir(), его не нужно было бы зацикливать дважды. Альтернативой является использование того, что рекомендовал пользователь1283565, удаление всех файлов перед созданием нового, но это может быть не очень хорошо в некоторых случаях. - person kingmaple; 23.03.2012

это работает для меня:

$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);
  }
}
person themaster33    schedule 03.10.2012

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

person slash197    schedule 23.03.2012

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

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

unlink($filename);

}

person user1283565    schedule 23.03.2012