2009-11-23 58 views
14

Tôi cần một tập lệnh PHP sẽ tìm ngày của tệp cũ nhất trong một thư mục. Ngay bây giờ, tôi đang lặp qua tất cả các tệp và so sánh ngày đó được sửa đổi cho tệp trước đó và giữ ngày cũ nhất được lưu trữ.Tìm tệp cũ nhất trong một thư mục bằng cách sử dụng PHP

Có ít đĩa/bộ nhớ chuyên sâu hơn để thực hiện việc này không? Có khoảng 300k tệp trong thư mục. Nếu tôi mở thư mục trong Windows Explorer, nó sẽ tự động sắp xếp theo ngày sửa đổi và tôi thấy tệp cũ nhất nhanh hơn rất nhiều. Có cách nào tôi có thể tận dụng lợi thế của sắp xếp mặc định của Explorer từ một kịch bản PHP?

Trả lời

20
// Grab all files from the desired folder 
$files = glob('./test/*.*'); 

// Sort files by modified time, latest to earliest 
// Use SORT_ASC in place of SORT_DESC for earliest to latest 
array_multisort(
array_map('filemtime', $files), 
SORT_NUMERIC, 
SORT_ASC, 
$files 
); 

echo $files[0] // the latest modified file should be the first. 

Taken từ this website

Chúc may mắn

EDIT: Để loại trừ các file trong thư mục để giảm các tìm kiếm không cần thiết:

$files = glob('./test/*.*'); 
$exclude_files = array('.', '..'); 
if (!in_array($files, $exclude_files)) { 
// Sort files by modified time, latest to earliest 
// Use SORT_ASC in place of SORT_DESC for earliest to latest 
array_multisort(
array_map('filemtime', $files), 
SORT_NUMERIC, 
SORT_ASC, 
$files 
); 
} 

echo $files[0]; 

này là hữu ích nếu bạn biết những gì để tìm cho và những gì bạn có thể loại trừ.

+2

Tôi thích câu trả lời của bạn, nhưng với nhiều tệp đó, PHP hết bộ nhớ trước khi hoàn tất và tập lệnh chết. – BLAKE

+0

bạn có thể lọc ra một số tệp nhất định để không kiểm tra, có thể thư mục, tệp văn bản, tập lệnh không? $ exclude_files = array ('.', '..') –

+1

Không, tất cả các tập tin được đặt tên% timestamp-guid% .tmp. Tôi không thể loại trừ bất kỳ tệp nào khác ngoài '.' và '..'. – BLAKE

2

Có một số nhược điểm rõ ràng để phương pháp này - mở ra cả một quá trình bổ sung, hệ điều hành phụ thuộc, vv, nhưng cho 300k file, điều này rất có thể là nhanh hơn so với cố gắng để lặp trong PHP:

exec('dir /TW /O-D /B', $output); 
var_dump($output[0]); 

FWIW, bạn thực sự nên cố gắng tránh việc có 300.000 tệp trong một thư mục duy nhất. Điều đó không thực sự hoạt động tốt trên hầu hết các hệ thống tệp.

+0

Tôi đã cố gắng để làm điều này, nhưng iis chỉ sinh ra một quá trình cmd.exe và không bao giờ kết thúc. Ngay cả khi lệnh tôi vượt qua nó chỉ là 'thoát', cmd.exe sẽ không bao giờ kết thúc. – BLAKE

1

10 tháng trên có lẽ bạn đang không vẫn đang tìm kiếm một giải pháp ở đây, nhưng chỉ trong trường hợp:

function findOldestFile($directory) { 
    if ($handle = opendir($directory)) { 
     while (false !== ($file = readdir($handle))) { 
      $files[] = $file; 
     } 

     print_r("\n"); 
     print_r($files); 
     print_r("\n"); 


     foreach ($files as $file) { 
      if (is_file($directory.'/'.$file)) { 
       $file_date[$file] = filemtime($directory.'/'.$file); 
      } 
     } 
    } 

    closedir($handle); 
    asort($file_date, SORT_NUMERIC); 
    reset($file_date); 
    $oldest = key($file_date); 
    return $oldest; 
} 
1

Thêm bộ nhớ cách hiệu quả để làm điều này, ở đây tôi không bao giờ lưu trữ nhiều hơn một tên tập tin trong bộ nhớ tại một thời điểm:

<?php 
$directory= "C:\\"; 

$smallest_time=INF; 

$oldest_file=''; 

if ($handle = opendir($directory)) { 

    while (false !== ($file = readdir($handle))) { 

     $time=filemtime($directory.'/'.$file); 

     if (is_file($directory.'/'.$file)) { 

      if ($time < $smallest_time) { 
       $oldest_file = $file; 
       $smallest_time = $time; 
      } 
     } 
    } 
    closedir($handle); 
} 



echo $oldest_file; 

chạy trên thư mục có 4000 tệp và sử dụng ít hơn 85% so với lưu trữ tên tệp.

Các vấn đề liên quan