如何使用php只保留特定文件并删除目录中的其他文件?

时间:2013-07-25 03:05:38

标签: php unlink

如何使用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);  

4 个答案:

答案 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()如何匹配的内容,请参阅文档和注释,并提供它看它如何运作的剧本。