Örneğin, `` Temp '' adlı bir klasörüm vardı ve PHP kullanarak bu klasördeki tüm dosyaları silmek veya silmek istedim. Bunu yapabilir miyim?
Örneğin, `` Temp '' adlı bir klasörüm vardı ve PHP kullanarak bu klasördeki tüm dosyaları silmek veya silmek istedim. Bunu yapabilir miyim?
Yanıtlar:
$files = glob('path/to/temp/*'); // get all file names
foreach($files as $file){ // iterate files
if(is_file($file))
unlink($file); // delete file
}
.Htaccess gibi 'gizli' dosyaları kaldırmak istiyorsanız,
$files = glob('path/to/temp/{,.}*', GLOB_BRACE);
Eğer bu arada kullanın (alt klasörler dahil) klasöründen her şeyi silmek istiyorsanız array_map
, unlink
ve glob
:
array_map( 'unlink', array_filter((array) glob("path/to/temp/*") ) );
Bu çağrı boş dizinleri de işleyebilir (ipucu için teşekkürler, @mojuba!)
glob("...") ?: []
(PHP 5.4+) çünkü boş bir dizin için glob()
geri döner false
.
array_map('unlink', ( glob( "path/to/temp/*" ) ? glob( "path/to/temp/*" ) : array() ) );
İşte Standart PHP Kütüphanesi'ni (SPL) kullanarak daha modern bir yaklaşım .
$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());
}
}
Http://php.net/unlink adresindeki bu kod :
/**
* 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);
}
}
Bkz. Readdir ve bağlantıyı kaldırma .
<?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);
}
?>
Hepsini okuyan ve daha sonra iki adımda silinen bir çok dosya içeren bir klasörünüz olduğu varsayılıyor. Dosyaları silmenin en iyi yolunun sadece bir sistem komutu kullanmak olduğuna inanıyorum.
Örneğin linux üzerinde:
exec('rm -f '. $absolutePathToFolder .'*');
Veya özyinelemeli bir işlev yazmaya gerek kalmadan özyinelemeli silme istiyorsanız
exec('rm -f -r '. $absolutePathToFolder .'*');
PHP tarafından desteklenen tüm işletim sistemleri için aynı komutlar bulunur. Bunun, dosyaları silmenin GERÇEK BİR yolu olduğunu unutmayın. $ absolutePathToFolder bu kodu çalıştırmadan önce kontrol edilmeli ve güvenceye alınmalıdır ve izinler verilmelidir.
$absolutePatToFolder
Hiç boş değilse , bu yöntemi kullanarak biraz güvensiz
PHP'deki bir klasördeki tüm dosyaları silmenin basit ve en iyi yolu
$files = glob('my_folder/*'); //get all file names
foreach($files as $file){
if(is_file($file))
unlink($file); //delete file
}
Bu kaynak kodunu buradan aldınız - http://www.codexworld.com/delete-all-files-from-folder-using-php/
Başka bir çözüm: Bu Sınıf, alt dizinlerdeki tüm dosyaları, alt dizinleri ve dosyaları siler.
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."/*"));
}
}
}
unlinkr işlevi, komut dosyasının kendisini silmediğinden emin olarak verilen yoldaki tüm klasörleri ve dosyaları yinelemeli olarak siler.
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);
}
}
}
bu komut dosyasını yerleştirdiğiniz tüm dosya ve klasörleri silmek istiyorsanız aşağıdaki gibi adlandırın
//get current working directory
$dir = getcwd();
unlinkr($dir);
Sadece php dosyalarını silmek istiyorsanız aşağıdaki gibi çağırın
unlinkr($dir, "*.php");
dosyaları silmek için başka bir yol da kullanabilirsiniz
unlinkr("/home/user/temp");
Bu, home / user / temp dizinindeki tüm dosyaları silecektir.
Kopyalama, taşıma, silme, boyut hesaplama, vb. İçin genel amaçlı bir dosya ve klasör işleme sınıfı yayınlandı.
https://gist.github.com/4689551
Kullanmak:
Tek bir dosyayı veya bir dizi klasörü / dosyayı kopyalamak (veya taşımak) için:
$files = new Files();
$results = $files->copyOrMove('source/folder/optional-file', 'target/path', 'target-file-name-for-single-file.only', 'copy');
Tek bir dosyayı veya yoldaki tüm dosya ve klasörleri silin:
$files = new Files();
$results = $files->delete('source/folder/optional-file.name');
Bir klasör kümesindeki tek bir dosyanın veya bir dosya kümesinin boyutunu hesaplayın:
$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
?>
Benim için çözüm readdir
iyi ve bir cazibe gibi çalıştı. İle glob
, bazı senaryolarda işlev başarısız oldu.
// 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);
}
Dosyaları alt klasörlerden kaldırmak için @Stichoza'nın cevabını güncelledim.
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));
}
"Pusheh" adında bir paket var. Bunu kullanarak, bir dizini temizleyebilir veya bir dizini tamamen kaldırabilirsiniz ( Github bağlantısı ). Bu bulunanlarda Packagist da.
Örneğin, Temp
dizini silmek istiyorsanız şunları yapabilirsiniz:
Pusheh::clearDir("Temp");
// Or you can remove the directory completely
Pusheh::removeDirRecursively("Temp");
İlgileniyorsanız, wiki'ye bakın .