1

我尝试使用代码从目录中读取文件名,并将过滤器添加到文件名中包含当前年份和月份的只读文件中

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);
}
4

2 回答 2

1

为什么是scandir?使用DirectoryIterator不要害怕使用现代 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 项是否可以写入
于 2013-05-08T10:02:09.683 回答
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'];
}

这是未经测试的,我可能过度逃避正则表达式-_.


至于您为什么该文件可能不可用的问题,我猜这个问题属于服务器故障。fileperms但是,您可以使用( http://www.php.net/manual/en/function.fileperms.php )测试文件的权限,但是当它们首先不可读时不会提供结果。

于 2013-05-08T09:49:01.927 回答