什麼是使用php搜索目錄並找出目錄是否有任何以指定文件擴展名結尾的文件(如mp3或pdf)的最佳方法?我想知道我是否可以用if語句來做到這一點。在目錄中搜索以查找具有特定文件擴展名的文件
2
A
回答
3
使用glob()功能:
foreach (glob("*.{pdf,mp3}", GLOB_BRACE) as $filename) {
echo "$filename\n";
}
◾GLOB_BRACE - Expands {a,b,c} to match 'a', 'b', or 'c'
0
也看看PHP的SPL DirectoryIterator.
0
在過複雜的一個簡單的任務,這裏是一個面向對象的SPL的方式風險處理這個問題。
<?php
/**
* Provides a means to pull all files matching the specific pattern within a given folder and at option enumerate all sub folders
* within the same path.
*/
class FileSearchIterator extends FilterIterator
{
protected $_path, $_extension, $_startWith, $_endWith;
/**
* Provides an iterator to a collection of filepath matching the given rules.
*
* If recursive is true also considers sub directories.
*
* Use in a foreach loop.
*
* @param string $path
* @param boolean $recursive If set to true recursive sub directories are enumerated.
* @param mixed $extension Either a single extension to accept or an array of such, null for no filter
* @param mixed $startWith Either a single string that must appear at the beginning of the file name, an array of such or null.
* @param mixed $endWith Either a single string that must appear at the end of the file name, an array of such or null.
* @throws LogicException
* @return FileSearchIterator
*/
public function __construct($path, $recursive = false, $extension = null, $startWith = null, $endWith = null)
{
if(! is_dir($path)) throw new LogicException("$path : is not a valid folder accessible to this process");
if(! is_array($extension)) $extension = array($extension);
if(! is_array($startWith)) $startWith = array($startWith);
if(! is_array($endWith)) $endWith = array($endWith);
$this->_path = $path;
$this->_extension = $extension;
$this->_startWith = $startWith;
$this->_endWith = $endWith;
$it = $recursive ? new RecursiveDirectoryIterator($path, FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_SELF) : new DirectoryIterator($path);
if($recursive) parent::__construct(new RecursiveIteratorIterator($it));
else parent::__construct($it);
}
/**
* Filter function implemented for the FilterIterator
*
* @return bool
*/
public function accept()
{
$info = $this->getInnerIterator()->current();
if (!$info instanceof SplFileInfo) return false;
if (!$info->isFile() || $info->isDot()) return false;
$info = pathinfo($info->getFilename());
if($this->_extension[0] != null)
{//only allow specified extensions
if(! isset($info['extension']) || $info['extension'] == null) return false;
$ext = $info['extension'];
if(! in_array($ext,$this->_extension)) return false;
}
if($this->_startWith[0] != null)
{//string match from start of filename
$found = false;
$file = $info['filename'];
foreach($this->_startWith as $filter)
{
if(strncmp($file, $filter, strlen($filter)) == 0)
{
$found = true;
break;
}
}
if(! $found) return false;
}
if($this->_endWith[0] != null)
{//string match from end of filename
$found = false;
$file = $info['filename'];
foreach($this->_endWith as $filter)
{
if(substr_compare($file, $filter, -strlen($filter), strlen($filter)) === 0)
{
$found = true;
break;
}
}
if(! $found) return false;
}
return true;
}
}
用法:
$fileScanner = new FileSearchIterator(path, true, array('mp3', 'pdf'));
foreach($fileScanner as $file)
{
$file-> //do something
}
相關問題
- 1. 在目錄中遞歸搜索具有特定擴展名的文件
- 2. 檢查具有特定擴展名的文件的目錄
- 3. 在文件夾/目錄(PHP)中搜索特定的文件擴展名
- 4. Ack:搜索具有特定擴展名的文件的目錄樹
- 5. 具有特定擴展名的文件的遞歸搜索
- 6. 查找文件擴展名的目錄
- 7. 將具有特定擴展名的文件移動到目錄
- 8. 查找擴展名以外的所有文件,但不包括特定目錄
- 9. 遞歸地查找具有特定擴展名的文件
- 10. 遞歸查找具有特定擴展名的文件
- 11. 在目錄樹中查找給定擴展名的文件
- 12. 在當前目錄中搜索特定擴展名的文件C
- 13. 如何從特定目錄和所有子目錄中搜索特定擴展名的文件
- 14. 移動具有特定文件名和擴展名的文件
- 15. 在文件夾中找到一個具有特定擴展名的文件
- 16. 在Unix中查找具有特定擴展名的所有文件?
- 17. 在文件夾中搜索具有已知擴展名的未知文件名
- 18. 複製所有子目錄中具有特定擴展名的所有文件
- 19. 正則表達式的文件夾名稱來搜索具有特定文件擴展名的文件
- 20. 在MATLAB中查找並打開一個具有特定擴展名的文件
- 21. Grunt - 刪除具有特定文件擴展名的子目錄中的所有文件和文件
- 22. 如何在Android上查找所有具有特定擴展名的文件?
- 23. 在文件名中查找具有特定模式的文件
- 24. 檢查目錄中是否存在具有給定擴展名的文件
- 25. 如何創建批文件來搜索文件夾中具有特定擴展名的文件?
- 26. 搜索URL沒有文件擴展名
- 27. 查找不以特定擴展名結尾的文件
- 28. C++如何在具有特定名稱的目錄中搜索文件?
- 29. 如何在用戶提供的目錄中查找具有特定擴展名的文件?
- 30. 查找具有特定名稱但具有可變文件擴展名的文件