Ví dụ, tôi có một thư mục có tên là 'Temp' và tôi muốn xóa hoặc xóa tất cả các tệp khỏi thư mục này bằng PHP. Tôi có thể làm điều này?
Ví dụ, tôi có một thư mục có tên là 'Temp' và tôi muốn xóa hoặc xóa tất cả các tệp khỏi thư mục này bằng PHP. Tôi có thể làm điều này?
Câu trả lời:
$files = glob('path/to/temp/*'); // get all file names
foreach($files as $file){ // iterate files
if(is_file($file))
unlink($file); // delete file
}
Nếu bạn muốn xóa các tệp 'ẩn' như .htaccess, bạn phải sử dụng
$files = glob('path/to/temp/{,.}*', GLOB_BRACE);
Nếu bạn muốn xóa tất cả mọi thứ từ thư mục (bao gồm cả thư mục con) sử dụng sự kết hợp này của array_map
, unlink
và glob
:
array_map( 'unlink', array_filter((array) glob("path/to/temp/*") ) );
Cuộc gọi này cũng có thể xử lý các thư mục trống (cảm ơn vì tiền boa, @mojuba!)
glob("...") ?: []
(PHP 5.4+) vì thư mục trống glob()
sẽ trả về false
.
array_map('unlink', ( glob( "path/to/temp/*" ) ? glob( "path/to/temp/*" ) : array() ) );
Đây là một cách tiếp cận hiện đại hơn bằng cách sử dụng Thư viện PHP tiêu chuẩn (SPL) .
$dir = "path/to/directory";
$di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
$ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST);
foreach ( $ri as $file ) {
$file->isDir() ? rmdir($file) : unlink($file);
}
return true;
foreach (new DirectoryIterator('/path/to/directory') as $fileInfo) {
if(!$fileInfo->isDot()) {
unlink($fileInfo->getPathname());
}
}
Mã này từ http://php.net/unlink :
/**
* Delete a file or recursively delete a directory
*
* @param string $str Path to file or directory
*/
function recursiveDelete($str) {
if (is_file($str)) {
return @unlink($str);
}
elseif (is_dir($str)) {
$scan = glob(rtrim($str,'/').'/*');
foreach($scan as $index=>$path) {
recursiveDelete($path);
}
return @rmdir($str);
}
}
Xem readdir và bỏ liên kết .
<?php
if ($handle = opendir('/path/to/files'))
{
echo "Directory handle: $handle\n";
echo "Files:\n";
while (false !== ($file = readdir($handle)))
{
if( is_file($file) )
{
unlink($file);
}
}
closedir($handle);
}
?>
Giả sử bạn có một thư mục có RẤT NHIỀU tệp đọc tất cả và sau đó xóa theo hai bước thì không hiệu quả. Tôi tin rằng cách hiệu quả nhất để xóa các tập tin là chỉ sử dụng một lệnh hệ thống.
Ví dụ trên linux tôi sử dụng:
exec('rm -f '. $absolutePathToFolder .'*');
Hoặc điều này nếu bạn muốn xóa đệ quy mà không cần phải viết hàm đệ quy
exec('rm -f -r '. $absolutePathToFolder .'*');
các lệnh chính xác tương tự tồn tại cho bất kỳ HĐH nào được PHP hỗ trợ. Hãy ghi nhớ đây là cách xóa tệp. $ perfectPathToFolder PHẢI được kiểm tra và bảo mật trước khi chạy mã này và phải cấp quyền.
$absolutePatToFolder
đã hết
Cách đơn giản và tốt nhất để xóa tất cả các tệp khỏi thư mục trong PHP
$files = glob('my_folder/*'); //get all file names
foreach($files as $file){
if(is_file($file))
unlink($file); //delete file
}
Có mã nguồn này từ đây - http://www.codexworld.com/delete-all-files-from-folder-USE-php/
Một giải pháp khác: Lớp này xóa tất cả các tệp, thư mục con và tệp trong thư mục con.
class Your_Class_Name {
/**
* @see http://php.net/manual/de/function.array-map.php
* @see http://www.php.net/manual/en/function.rmdir.php
* @see http://www.php.net/manual/en/function.glob.php
* @see http://php.net/manual/de/function.unlink.php
* @param string $path
*/
public function delete($path) {
if (is_dir($path)) {
array_map(function($value) {
$this->delete($value);
rmdir($value);
},glob($path . '/*', GLOB_ONLYDIR));
array_map('unlink', glob($path."/*"));
}
}
}
Hàm unlinkr xóa đệ quy tất cả các thư mục và tệp trong đường dẫn đã cho bằng cách đảm bảo rằng nó không xóa chính tập lệnh.
function unlinkr($dir, $pattern = "*") {
// find all files and folders matching pattern
$files = glob($dir . "/$pattern");
//interate thorugh the files and folders
foreach($files as $file){
//if it is a directory then re-call unlinkr function to delete files inside this directory
if (is_dir($file) and !in_array($file, array('..', '.'))) {
echo "<p>opening directory $file </p>";
unlinkr($file, $pattern);
//remove the directory itself
echo "<p> deleting directory $file </p>";
rmdir($file);
} else if(is_file($file) and ($file != __FILE__)) {
// make sure you don't delete the current script
echo "<p>deleting file $file </p>";
unlink($file);
}
}
}
Nếu bạn muốn xóa tất cả các tệp và thư mục nơi bạn đặt tập lệnh này, hãy gọi nó như sau
//get current working directory
$dir = getcwd();
unlinkr($dir);
Nếu bạn chỉ muốn xóa các tập tin php thì hãy gọi nó như sau
unlinkr($dir, "*.php");
bạn cũng có thể sử dụng bất kỳ đường dẫn nào khác để xóa các tập tin
unlinkr("/home/user/temp");
Điều này sẽ xóa tất cả các tập tin trong thư mục home / user / temp.
Đã đăng một lớp mục đích chung và lớp xử lý thư mục để sao chép, di chuyển, xóa, tính toán kích thước, v.v., có thể xử lý một tệp hoặc một tập hợp các thư mục.
https://gist.github.com/4689551
Để sử dụng:
Để sao chép (hoặc di chuyển) một tệp hoặc một tập hợp các thư mục / tệp:
$files = new Files();
$results = $files->copyOrMove('source/folder/optional-file', 'target/path', 'target-file-name-for-single-file.only', 'copy');
Xóa một tệp hoặc tất cả các tệp và thư mục trong một đường dẫn:
$files = new Files();
$results = $files->delete('source/folder/optional-file.name');
Tính kích thước của một tệp hoặc một tập hợp tệp trong một tập hợp các thư mục:
$files = new Files();
$results = $files->calculateSize('source/folder/optional-file.name');
<?
//delete all files from folder & sub folders
function listFolderFiles($dir)
{
$ffs = scandir($dir);
echo '<ol>';
foreach ($ffs as $ff) {
if ($ff != '.' && $ff != '..') {
if (file_exists("$dir/$ff")) {
unlink("$dir/$ff");
}
echo '<li>' . $ff;
if (is_dir($dir . '/' . $ff)) {
listFolderFiles($dir . '/' . $ff);
}
echo '</li>';
}
}
echo '</ol>';
}
$arr = array(
"folder1",
"folder2"
);
for ($x = 0; $x < count($arr); $x++) {
$mm = $arr[$x];
listFolderFiles($mm);
}
//end
?>
Đối với tôi, giải pháp readdir
tốt nhất và hoạt động như một cơ duyên. Với glob
, chức năng đã thất bại với một số tình huống.
// Remove a directory recursively
function removeDirectory($dirPath) {
if (! is_dir($dirPath)) {
return false;
}
if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
$dirPath .= '/';
}
if ($handle = opendir($dirPath)) {
while (false !== ($sub = readdir($handle))) {
if ($sub != "." && $sub != ".." && $sub != "Thumb.db") {
$file = $dirPath . $sub;
if (is_dir($file)) {
removeDirectory($file);
} else {
unlink($file);
}
}
}
closedir($handle);
}
rmdir($dirPath);
}
Tôi đã cập nhật câu trả lời của @Stichoza để xóa các tệp thông qua các thư mục con.
function glob_recursive($pattern, $flags = 0) {
$fileList = glob($pattern, $flags);
foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) {
$subPattern = $dir.'/'.basename($pattern);
$subFileList = glob_recursive($subPattern, $flags);
$fileList = array_merge($fileList, $subFileList);
}
return $fileList;
}
function glob_recursive_unlink($pattern, $flags = 0) {
array_map('unlink', glob_recursive($pattern, $flags));
}
Có một gói gọi là "Pusheh". Sử dụng nó, bạn có thể xóa một thư mục hoặc xóa hoàn toàn một thư mục ( liên kết Github ). Nó cũng có sẵn trên Packagist .
Chẳng hạn, nếu bạn muốn xóa Temp
thư mục, bạn có thể làm:
Pusheh::clearDir("Temp");
// Or you can remove the directory completely
Pusheh::removeDirRecursively("Temp");
Nếu bạn quan tâm, hãy xem wiki .