2009-11-23 4 views
14

폴더에서 가장 오래된 파일의 날짜를 찾는 PHP 스크립트가 필요합니다. 지금 당장은 모든 파일을 반복 실행하고 수정 한 날짜를 이전 파일과 비교하여 가장 오래된 날짜를 저장 한 채로 비교합니다.PHP를 사용하여 폴더에서 가장 오래된 파일 찾기

디스크/메모리를 많이 사용하지 않는 방법이 있습니까? 폴더에 약 300,000 개의 파일이 있습니다. Windows 탐색기에서 폴더를 열면 자동으로 날짜순으로 정렬되고 가장 오래된 파일이 훨씬 빨리 보입니다. PHP 스크립트에서 Explorer의 기본 정렬을 활용할 수있는 방법이 있습니까?

답변

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. 

this 웹 사이트

행운

편집에서 촬영 :

$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]; 

당신이 보는 무엇을 알고있는 경우에 도움이됩니다 : 불필요한 검색을 줄이기 위해 디렉토리에있는 파일을 제외하려면 당신이 배제 할 수있는 것.

+2

나는 당신의 대답을 좋아하지 만, 그 많은 파일들로 인해 PHP는 메모리가 다 소모되어 끝나기 전에 스크립트가 죽습니다. – BLAKE

+0

폴더, 텍스트 파일, 스크립트를 확인하지 않을 특정 파일을 필터링 할 수 있습니까? $ exclude_files = array ('.', '..') –

+1

아니요, 모든 파일의 이름은 % timestamp-guid % .tmp입니다. ''이외의 파일은 제외 할 수 없습니다. 및 '..'. – BLAKE

2
이 방법의 몇 가지 명백한 단점이 있습니다

- 등의 추가 공정, OS 의존성을, 산란,하지만 300K 파일이 아주 잘 PHP에서 반복하는 것보다 더 빠를 수 있습니다 :

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

FWIW, 당신은 정말로 하나의 dir에 300,000 개의 파일이있는 것을 피하려고 노력해야합니다. 대부분의 파일 시스템에서는 그렇게 잘 수행되지 않습니다. 당신에

+0

이 작업을 시도했지만 cmd.exe 프로세스가 생성되고 종료되지 않습니다. 내가 전달한 명령이 'exit'일지라도 cmd.exe는 끝나지 않을 것입니다. – BLAKE

1

10개월 아마 아직 여기에 솔루션을 찾고 아니지만 단지의 경우 :이 일을

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

더 많은 메모리를 효율적으로, 여기에 내가 메모리에 하나 이상의 파일 이름을 저장하지 않습니다

<?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; 

은 4000 개의 파일이있는 폴더에서 실행되었으며 파일 이름을 저장하는 것보다 85 % 적은 RAM을 사용했습니다.

관련 문제