• 16-09-2007, 03:42:56
    #1
    Bir dizi içine filemtime() ile dizindeki dosyaların oluşturlma tarihini aldım.

    Bu dizideki en küçük tarihi nasıl bulurum, tarihler unix formatında:

    1188651041
    1185228664
    1185334465
    1188299348
    ..
    Dizi içindeki dosya sayısı belli değildir.
  • 16-09-2007, 06:25:00
    #2
    Üyeliği durduruldu
    <?php
    
    $string = array('1188651041', '1185228664', '1185334465', '1188299348');
    
    // küçükten büyüğe sıralamak için
    asort($string);
    
    // sıralamadan sonra index değerleri aynı kalır. 
    // bu da index değerlerini sıfırlamak için
    // "index => value"
    $string = array_values($string); 
    
    echo $string[0];
    
    ?>
    not: fonksiyonlar çalışmadan önce birer print_r($string) . '<br />'; yazarsan akışı görebilir ve çok daha rahat anlarsın olanları
  • 16-09-2007, 07:13:48
    #3
    dosya tarihleri dizi içinde değil while içinde, min() ile yapmaya kalktım ama çuvalladım:

    Amaç: bir dizindeki dosya sayısı x'e ulaşınca en eski dosyayı bulup silmek

    $dir    = './files/';
    $files = scandir($dir); // php5 only
    $count = count($files);
    //echo $count;
    
    $i = 0;
    while ( $i < $count)
    {
    	if ($files[$i] != "." && $files[$i] != ".." && $files[$i] != "index.html" && $files[$i] != "index.htm")
    	{
    		$file_num = ($count - 3);
    		$last_modified = filemtime($path . $files[$i]);
    		//echo "$files[$i] - $last_modified<br />";
    		
    		if ($file_num > 3)
    		{
    			$delete_files[$i] = $last_modified;
    			//echo $delete_files[$i] . '<br />';
    			echo min($delete_files[$i]);
    		}
    	}
    	$i++;
    }
  • 16-09-2007, 07:39:06
    #4
    Üyeliği durduruldu
    $dir    = './files/';
    $files = scandir($dir); // php5 only
    $count = count($files);
    //echo $count;
    
    $i = 0;
    while ( $i < $count)
    {
        if ($files[$i] != "." && $files[$i] != ".." && $files[$i] != "index.html" && $files[$i] != "index.htm")
        {
            $file_num = ($count - 3);
            $aah=filemtime($path . $files[$i]);
            $last_modified[] = $aah;
            $dosya_adi[$aah]=$path.$files[$i];
        }
        $i++;
    }
    buradan gibi yap
    asort($last_modified);// sıralamadan sonra index değerleri aynı kalır.
    // bu da index değerlerini sıfırlamak için
    // "index => value"
    $string = array_values($string);

    echo
    $string[0];
    gibi emrag ın yazdıkları echo yerine
    unlink($dosya_adi[$string[0]);
    gibi birşeyler yapabilirsin mantığı kavradıysan sorun yok kodlarda ufak hata var olabilir bleki
    kontrol etmedim ama çalışmalı ...
  • 16-09-2007, 10:24:57
    #5
    Üyeliği durduruldu
    şöyle bir şey çıkardım ama php5 only fonksiyon olduğundan deneme şansım olmadı. oradaki total_files değişkeni bu sayıdan fazla dosya olursa silmek için. eğer bu haliyle 6 dosya için çalışırsa üstü dosyalar için bir döngü koymak gerekecek unlink kısmına:

    edit: çok sayıda yeri değiştirdim. yanlış değişken isimleri hep.

    <?php
    
    $total_files = 5;
    $dir    = './files/';
    $files = scandir($dir); // php5 only
    $count = count($files);
    $file_num = ($count - 3);
    
    $string = array();
    $i = 0;
    
    if( $file_num > $total_files)
    {
        while ( $i < $count)
        {
            if ($files[$i] != "." && $files[$i] != ".." && $files[$i] != "index.html" && $files[$i] != "index.htm")
            {
                $last_modified = filemtime($dir . $files[$i]);
                $string[$last_modified] = $files[$i];
            }
            $i++;
        }
    }
    
    ksort($string);
    
    $string = array_values($string); 
    
    unlink($dir . $string[0]);
    
    ?>
  • 16-09-2007, 13:46:17
    #6
    Üyeliği durduruldu
    bende önce düşündüm sonra dedim elimizde tarih varsa bunu key yapıp dosyayı alabiliriz sorun olmaması lazım çalışır gibi duruyorlar
  • 16-09-2007, 14:27:35
    #7
    Üyeliği durduruldu
    içime sinmedi o kod. php 4'te, 5'te, hepsinde çalışcak versiyonunu yazdım

    <?php
    
    $file_limit = 2; // klasörde kalmasını istediğin dosya sayısı
    $dir = "./dir/"; // bu kodun olduğu dosyaya göre klasör yeri
    $dh  = opendir($dir);
    $files = array();
    $tot_files = 0;
    while (($filename = readdir($dh)) !== false) 
    {
        if($filename != '.' && $filename != '..' && $filename != 'index.html' && $filename != 'index.htm')
        {
            $last_modified = filemtime($dir . $filename);
            $files[$last_modified] = $filename;
            $tot_files++;
        }
    }
    
    ksort($files);
    
    $files = array_values($files); 
    
    if($tot_files > $file_limit)
    {
        for($i = 0, $i_limit = $tot_files - $file_limit; $i < $i_limit; $i++)
        {
            if(unlink($dir . $files[$i]))
            {
                echo $dir . $files[$i] . ' silindi<br />';
            }
        }
    }
    
    ?>
  • 16-09-2007, 22:16:32
    #8
    emrag'ın son kodları dizindeki en yeni dosya hariç hepsini sildi ve sildiği halde perpission errror hatası verdi:


    Warning: unlink(./files/) [function.unlink]: Permission denied in xxxx/clear_dir.php on line 26
    satır 26

    if(unlink($dir . $files[$i]))
    Kodları detaylı olarak incelemedim henüz, hazırcılık olmasın diye, kodları iyice inceleyip, kavrayıp geri geleceğim.
  • 16-09-2007, 22:54:49
    #9
    Üyeliği durduruldu
    unlink'in başına @ işareti koyarsan hata çıktısı vermez ekrana. bu haliyle bende sorunsuz çalıştı.