2013-05-08 88 views
1

我試着使用代碼來讀取一個目錄中的文件名和添加過濾器爲只讀當前年份和月份文件的文件名,例如文件名閱讀PHP

Julius Robles_Client11_20130508_10-42-42_AM.zip 
Julius Robles_Client12_20130508_11-45-42_AM.zip 
Julius Robles_Client13_20130508_11-58-42_AM.zip 

這樣的代碼將只返回文件與201305在他們的名字,但它會返回一個正確的過濾設置,但一些文件丟失,我不知道爲什麼?

也是什麼文件「。」和「..」存儲在數組的前兩行中?

繼承人的代碼

$filenames = array(); 
if ($handle = opendir('archive/search_logs/')) { 
    $ctr = 0; 
    while (false !== ($entry = readdir($handle))) { 
    //if(strpos($entry,date('Ym')) !== false){ 
    $name = $entry; 
    $entry = str_replace("-",":",$entry); 
    $filenames[$ctr] = explode("_", $entry); 
    $filenames[$ctr][] = $name; 
    $ctr++; 
    //} 
} 
    closedir($handle); 
} 
+0

'.'是當前目錄,'..'是前一個目錄;他們可以跳過 – Luceos 2013-05-08 09:42:25

+0

當你說一些文件丟失,你可以提供一些例子。 – 2013-05-08 09:47:54

+0

例如,有10個文件的名稱中包含201305,但代碼只返回7個文件。 – 2013-05-08 09:49:30

回答

1

爲什麼選擇scandir?使用​​不要affraid使用現代PHP

從手動:

的DirectoryIterator類提供了一個簡單的界面,用於查看文件系統目錄的內容。

例如:

<?php 
$filenames = array(); 
$iterator = new DirectoryIterator($directory); 
foreach ($iterator as $fileinfo) { 
    if ($fileinfo->isFile()) { 
     $filenames[] = $fileinfo->getFilename(); 
    } 
} 
print_r($filenames); 

?> 

與DirectoryIterator你可以通過這個方法檢查$的fileInfo

  • DirectoryIterator :: ISDIR - 確定如果當前DirectoryIterator產品目錄
  • DirectoryIterator :: isDot - 確定當前DirectoryIterator項是否爲'。'要麼 '..「
  • DirectoryIterator :: isExecutable - 確定如果當前DirectoryIterator產品可執行
  • DirectoryIterator :: ISFILE - 確定如果當前DirectoryIterator項目是一個普通文件
  • DirectoryIterator :: isLink - 確定如果當前DirectoryIterator項目是一個符號鏈接
  • DirectoryIterator :: isReadable - 確定如果當前DirectoryIterator項目可以讀取
  • DirectoryIterator :: isWritable - 確定如果當前DirectoryIterator項目可以寫成
0

正如評論說:

.是當前目錄 ..這是一個

上面的目錄可以讀取目錄跳過這兩者。

我會親自做的是閱讀基於正則表達式,像這樣的文件名和信息:

$filenames  = array(); 

foreach(scandir('archive/search_logs/') as $file) { 
    // test for current or higher path 
    if($file == "." || $file == "..") continue; 
    // test if readable 
    if(!is_readable($file)) printf("File %s is not readable",$file); 
    // use regular expression to match: <filename><date:yyyymmdd>_<hours:hh>-<minutes:mm>-<seconds:ss>_<am|pm>.zip 
    preg_match("/(?<filename>[.]+)(?<date>[0-9]{8})\_(?<hours>[0-9]{2})\-(?<minutes>[0-9]{2})\-(?<seconds>[0-9]{2})\_(?<ampm>AM|PM)\.zip$/i" , $file , $matches); 
    // now use anything in matches that suits your needs: 
    echo $matches['filename']; 
    echo $matches['date']; 
    echo $matches['hours']; 
    echo $matches['seconds']; 
    echo $matches['ampm']; 
} 

這是未經測試,我可能有些過頭逃脫正則表達式-_


至於你的問題爲什麼文件可能不可用,我猜這個問題屬於服務器故障。但是,您可以使用filepermshttp://www.php.net/manual/en/function.fileperms.php)測試文件的權限,但不能在首先無法讀取時提供結果。