【问题标题】:How to use php keep only specific file and remove others in directory?如何使用 php 只保留特定文件并删除目录中的其他文件?
【发布时间】:2013-07-25 03:05:38
【问题描述】:

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

示例:
1/1.png, 1/2.jpeg, 1/5.png ...

文件编号,文件类型是随机的,如x.png或x.jpeg,但我有一个字符串2.jpeg需要保留的文件。

有什么建议吗??

感谢您的回复,现在我像下面这样编码,但取消链接功能似乎不起作用删除任何内容..我需要更改一些设置吗?我正在使用 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("u_img_p/".$id.'/'.$file);  

【问题讨论】:

  • 如果您确实找到了解决方案,“我强烈建议”您对此要非常小心,并且“进行备份”在执行此类脚本之前,您的整个网站/文件夹。
  • 为什么?它只删除目录中的苍蝇......你建议的任何理由??
  • 我“只是说”,小心而已。 ;-)
  • 哈哈谢谢我以为会发生一些错误然后删除所有网站文件夹
  • 好东西,保重,不客气:)

标签: php unlink


【解决方案1】:

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 数组中。

【讨论】:

  • 感谢您的回复。但是 unlink() 不起作用删除任何东西??
  • 不要忘记排除 ... 或进行 is_dir() 检查。
  • @OP:检查运行 php 的用户是否有权删除文件。另外,请确保路径正确。你可以在 foreach 下添加一个echo $file; 来帮助调试。
  • @Jack:是的,我很快就做到了,你可以添加 .和 .. 排除 [] 或者你可以让它静默失败,因为 unlink 无论如何都不会删除目录。
  • 应尽可能避免使用@,如果这就是您所说的静默失败:) 最好知道您要删除的内容。
【解决方案2】:
 $dir = "your_folder_path";  
 if ($opendir = opendir($dir)){
    //read directory
     while(($file = readdir($opendir))!= FALSE ){
      if($file!="." && $file!= ".." && $file!= "2.jpg"){
       unlink($file);
      }
     }
   } 

【讨论】:

  • 感谢您的回复。但是为什么 unlink() 不起作用删除任何东西??
  • 检查文件夹的权限以及文件夹的路径
【解决方案3】:
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 ) ;

【讨论】:

    【解决方案4】:

    我很惊讶人们不再使用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;
        }
    
    • 除非glob() 返回的路径数组恰好与调用unlink() 的位置相关,否则unlink() 将不起作用。由于glob() 将仅返回匹配的内容,因此最好使用包含要删除/排除的文件的目录的绝对路径。请参阅文档和 cmets 了解glob() 的匹配方式并试一试它是如何工作的。

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 2018-06-13
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多