如何使用php只保留特定文件并删除目录中的其他文件?
例如:
1/1.png, 1/2.jpeg, 1/5.png ...
文件编号,文件类型是随机的,如x.png或x.jpeg,但我有一个字符串2.jpeg
该文件需要保留。
任何建议怎么做?
感谢您的回复,现在我编码如下,但unlink功能似乎无法删除任何东西..我需要更改一些设置吗?我正在使用Mamp
更新
// explode string <img src="u_img_p/5/x.png">
$content_p_img_arr = explode('u_img_p/', $content_p_img);
$content_p_img_arr_1 = explode('"', $content_p_img_arr[1]); // get 5/2.png">
$content_p_img_arr_2 = explode('/', $content_p_img_arr_1[0]); // get 5/2.png
print $content_p_img_arr_2[1]; // get 2.png < the file need to keep
$dir = "u_img_p/".$id;
if ($opendir = opendir($dir)){
print $dir;
while(($file = readdir($opendir))!= FALSE )
if($file!="." && $file!= ".." && $file!= $content_p_img_arr_2[1]){
unlink($file);
print "unlink";
print $file;
}
}
}
我将代码unlink路径更改为文件夹,然后就可以了!!
unlink("u_img_p/".$id.'/'.$file);
答案 0 :(得分:2)
http://php.net/manual/en/function.scandir.php
这会将目录中的所有文件都放到一个数组中,然后你可以在数组上运行foreach()并在每个文件上查找模式/匹配。
unlink()可用于删除文件。
$dir = "/pathto/files/"
$exclude[] = "2.jpeg";
foreach(scandir($dir) as $file) {
if (!in_array($file, $exclude)) {
unlink("$dir/$file");
}
}
简单而重要。您可以将多个文件添加到$exclude
数组。
答案 1 :(得分:0)
$dir = "your_folder_path";
if ($opendir = opendir($dir)){
//read directory
while(($file = readdir($opendir))!= FALSE ){
if($file!="." && $file!= ".." && $file!= "2.jpg"){
unlink($file);
}
}
}
答案 2 :(得分:0)
function remove_files( $folder_path , $aexcludefiles )
{
if (is_dir($folder_path))
{
if ($dh = opendir($folder_path))
{
while (($file = readdir($dh)) !== false)
{
if( $file == '.' || $file == '..' )
continue ;
if( in_array( $file , $aexcludefiles ) )
continue ;
$file_path = $folder_path."/".$file ;
if( is_link( $file_path ) )
continue ;
unlink( $file_path ) ;
}
closedir($dh);
}
}
}
$aexcludefiles = array( "2.jpeg" )
remove_files( "1" , $aexcludefiles ) ;
答案 3 :(得分:0)
我很惊讶人们不再使用glob()。这是另一个想法:
$dir = '/absolute/path/to/u_img_p/5/';
$exclude[] = $dir . 'u_img_p/5/2.jpg';
$filesToDelete = array_diff(glob($dir . '*.jpg'), $exclude);
array_map('unlink', $filesToDelete);
首先,glob()
根据提供给它的模式返回文件数组。接下来,array_diff()
查找第一个数组中所有不在第二个数组中的元素。最后,将array_map()
与unlink()
一起使用,以删除除排除文件以外的所有文件。请确保使用绝对路径* 。
您甚至可以将其变成辅助函数。这是一个开始:
<?php
/**
* @param string $path
* @param string $pattern
* @param array $exclude
* @return bool
*/
function deleteFiles($path, $pattern, $exclude = [])
{
$basePath = '/absolute/path/to/your/webroot/or/images/or/whatever/';
$path = $basePath . trim($path, '/');
if (is_dir($path)) {
array_map(
'unlink',
array_diff(glob($path . '/' . $pattern, $exclude)
);
return true;
}
return false;
}
unlink()
返回的路径数组恰好与调用glob()
的位置有关,否则unlink()
将不起作用。由于glob()
仅返回匹配的内容,因此最好使用包含要删除/排除的文件的目录的绝对路径。有关glob()
如何匹配的内容,请参阅文档和注释,并提供它看它如何运作的剧本。