0

我想通过一个命令删除我域的 public_html 目录中的所有文件。对于这个 SO 的问题有这个答案:

<?php
array_map('unlink', glob("path/to/temp/*"));
?>

我怎样才能添加例外,也许使用这个代码或其他东西?我不想删除运行删除代码的文件,因为该文件也将位于 public_html 文件夹中。

4

2 回答 2

1

阅读类结构,你会得到一些有用的特性

<?php
// this will call your given callback with the file or folder informations, so you can use your logic to delete/copy/move the file/folder
// note: this is a recursive function
$literator  = new ipDirLiterator(
  "your/path/to/root/or/anyfolder/", // for getting root path, you can use $_SERVER["DOCUMENT_ROOT"]
  array(
    "file"  =>  function( $file ) { // your callback to delete files
      if ( basename( $file["pathname"] ) !== basename( __FILE__ ) ) {
        unlink( $file["pathname"] );
      }
    }
  ),
  true
);

class ipDirLiterator {
  protected $basepath   = false;
  protected $callbacks  = false;

  protected $checked    = array();

  public function __construct( $basepath = false, $callbacks = false, $init = false ) {
    $this->basepath   = ( $basepath ) ? realpath( $basepath ) : false;
    $this->callbacks  = $callbacks;
    if ( $init ) {
      $this->literate();
    }
  }

  public function literate( $dir = false ) {
    if ( !$this->basepath ) {
      return false;
    }
    if ( $dir === $this->basepath ) {
      return false;
    }
    if ( !$dir ) {
      $dir  = $this->basepath;
    }

    $dir  = realpath( $dir );

    if ( strstr( $dir, basename( $this->basepath ) ) === false ) {
      return false;
    }
    if ( in_array( $dir, $this->checked ) ) {
      return false;
    }

    $this->checked[]  = $dir;
    $items  = new DirectoryIterator( $dir );

    foreach( $items as $item ) {
      if ( $item->isDot() ) {
        if ( $item->getFilename() === ".." ) {
          $this->literate( dirname( $item->getPath() ) );
        }
        $this->callback( "dot", $this->info( $item ) );
        continue;
      }
      if ( $item->isFile() || $item->isLink() ) {
        $this->callback( "file", $this->info( $item ) );
      }
      if ( $item->isDir() && !$item->isLink() ) {
        $this->literate( $item->getPathname() );
        $this->callback( "dir", $this->info( $item ) );
      }
    }
  }

  private function info( $item ) {
    $info = array(
      "filename"  =>  $item->getFilename(),
      "extension" =>  pathinfo( $item->getFilename(), PATHINFO_EXTENSION ),
      "pathname"  =>  $item->getPathname(),
      "path"  =>  $item->getPath(),
      "readable"  =>  (bool)$item->isReadable(),
      "writable" =>  (bool)$item->isWritable(),
      "executable"  =>  (bool)$item->isExecutable(),
      "created_on" =>  $item->getCTime(),
      "last access" =>  $item->getATime(),
      "modified_on" =>  $item->getMTime(),
      "inode" =>  $item->getInode(),
      "permissions" =>  $item->getPerms(),
      "is_dir" =>  (bool)$item->isDir(),
      "is_dot" =>  (bool)$item->isDot(),
      "type"  =>  $item->getType(),
      "group" =>  $item->getGroup(),
      "owner" =>  $item->getOwner(),
      "size"  =>  $item->getSize()
    );
    return $info;
  }

  private function callback( $callback = "file", $args = null ) {
    if ( $this->callbacks ) {
      if ( isset( $this->callbacks[$callback] ) ) {
        call_user_func( $this->callbacks[$callback], $args );
      }
    }
  }
}
?>

详细示例:

<?php
/**
 * It will recursively go through the all directories and files under the directory you have given.
 * Here we are going to delete all the files order than 1 hour
**/
/**
 * Path to the folder you want to process
**/
$basepath = "any/path/to/files/or/folder/";
/**
 * Callbacks
**/
$file_callback  = function( $file /* information of current file in the loop */ ) { // your callback for files
  $modified_time  = filemtime( $file["pathname"] );
  $current_time   = time();
  $time_differnce = ( $current_time - $modified_time );
  if ( $time_differnce > 3600 ) {
    unlink( $file["pathname"] );
  }
};
$folder_callback  = function( $file /* information of current folder in the loop */ ) { // your callback for folders
  // proceess your folder here
};
/**
 * Initialize the class
**/
$literator  = new ipDirLiterator( $basepath, array( "file" => $file_callback, "dir" => $folder_callback ) );
$literator->literate();
?>
于 2013-06-22T12:36:09.303 回答
0

使用这样的东西:

function delete_all($filename) {
    // files listed in this array will not being deleted
    $exceptions = array (
        'file1',
        'file2', ...
    );

    if(!in_array($filename, $exceptions)) {
        unlink($filename);
    }
}

// !!! attention !!! this will delete all files except those listed above
// from this folder. Make sure you know what you are doing
array_map('delete_all', glob("path/to/temp/*"));
于 2013-06-22T12:21:36.460 回答