Cara menggunakan php scandir

Di kesempatan kali ini saya akan menjelaskan cara menggunakan directory di php. Perlu teman-teman ketahui sebelumnya, directory yaitu lokasi tempat penyimpanan file di system yang berisi berisi informasi file dan isi dari masing-asing file tersebut. Namun bagi manipulasi dan pemakaian yang terkait directory di php, kalian dapat menggunakan 11 (sebelas) manfaat yang dari masing-masing manfaat tersebut dapat digunakan bagi manipulasi directory. Berikut 11 (sebelas) manfaat yang dapat kalian gunakan dibawah ini :

  1. mkdir() berfungsi bagi membangun direktori baru.
  2. scandir() berfungsi bagi melihat isi direktori tertentu.
  3. rmdir() berfungsi bagi menghapus direktori tertentu.
  4. rename() berfungsi bagi mengubah nama direktori tertentu.
  5. chroot() berfungsi bagi mengubah direktori root.
  6. closedir() berfungsi bagi menutup pegangan direktori.
  7. dir() berfungsi bagi mengembalikan instance kelas Direktori.
  8. getcwd() berfungsi bagi mengembalikan direktori kerja ketika ini.
  9. opendir() berfungsi bagi membuka pegangan direktori.
  10. readdir() berfungsi bagi mengembalikan entri dari pegangan direktori.
  11. rewinddir() berfungsi bagi mengatur ulang pegangan direktori.

Selaku contoh, disini saya ingin melihat isi dari directory C: yang terdapat di komputer saya menggunakan PHP. Karenanya kodenya seperti berikut :

  • Melihat isi Directory C:

Bagi dapat melihat isi dari directory yang akan ditentukan kalian dapat menggunakan manfaat scandir(). Manfaat ini akan mengembalikan nilai berupa array yang berisi nama-nama dari isi directory tersebut.

$dir=scandir(“C:”);

var_dump($dir,0777,true);

Note:

  1. parameter C: yaitu lokasi directory yang ingin dilihat
  2. parameter 0777 yaitu bagi memberikan hak akses penuh bagi directory tersebut.
  3. parameter true yaitu bagi mengizinkan penyusunan directory secara rekursif.
  • Membangun Directory:

Bagi dapat membangun directory di php. Manfaat php yang dapat kalian gunakan yaitu mkdir(). Manfaat tersebut akan membangun folder sesuai di directory yang ditentukan, berikut kodenya:

<?php

$dir=mkdir(“C:Dumet School”,0777,true);

var_dump($dir);

Note:

  1. parameter C:Dumet School yaitu bagi membangun directory folder baru dengan nama Dumet School di lokasi C:
  2. parameter 0777 yaitu bagi memberikan hak akses penuh bagi directory tersebut.
  3. parameter true yaitu bagi mengizinkan penyusunan directory secara rekursif.

Hingga disini penjelasan saya mengenai cara menggunakan directory di php, semoga bermanfaat.

sumber :kursuswebprogramming.com/blog/

(Visited 3 times, 1 visits today)


Saya mencoba menyalin seluruh isi direktori ke lokasi lain menggunakan

copy ("old_location/*.*","new_location/");

tetapi dikatakan tidak dapat menemukan aliran, benar *.*tidak ditemukan.

Cara lain

Terima kasih Dave






Jawaban:


Tampaknya salinan hanya menangani file tunggal . Berikut adalah fungsi untuk menyalin secara rekursif yang saya temukan dalam catatan ini di halaman dokumentasi salinan :

php 
function recurse_copy($src,$dst) { 
    $dir = opendir($src); 
    @mkdir($dst); 
    while(false !== ( $file = readdir($dir)) ) { 
        if (( $file != '.' ) && ( $file != '..' )) { 
            if ( is_dir($src . '/' . $file) ) { 
                recurse_copy($src . '/' . $file,$dst . '/' . $file); 
            } 
            else { 
                copy($src . '/' . $file,$dst . '/' . $file); 
            } 
        } 
    } 
    closedir($dir); 
} 
?>






Seperti dijelaskan di sini , ini adalah pendekatan lain yang menangani symlink juga:

/**
 * Copy a file, or recursively copy a folder and its contents
 * @author      Aidan Lister <>
 * @version     1.0.1
 * @link        http://aidanlister.com/2004/04/recursively-copying-directories-in-php/
 * @param       string   $source    Source path
 * @param       string   $dest      Destination path
 * @param       int      $permissions New folder creation permissions
 * @return      bool     Returns true on success, false on failure
 */
function xcopy($source, $dest, $permissions = 0755)
{
    $sourceHash = hashDirectory($source);
    // Check for symlinks
    if (is_link($source)) {
        return symlink(readlink($source), $dest);
    }

    // Simple copy for a file
    if (is_file($source)) {
        return copy($source, $dest);
    }

    // Make destination directory
    if (!is_dir($dest)) {
        mkdir($dest, $permissions);
    }

    // Loop through the folder
    $dir = dir($source);
    while (false !== $entry = $dir->read()) {
        // Skip pointers
        if ($entry == '.' || $entry == '..') {
            continue;
        }

        // Deep copy directories
        if($sourceHash != hashDirectory($source."/".$entry)){
             xcopy("$source/$entry", "$dest/$entry", $permissions);
        }
    }

    // Clean up
    $dir->close();
    return true;
}

// In case of coping a directory inside itself, there is a need to hash check the directory otherwise and infinite loop of coping is generated

function hashDirectory($directory){
    if (! is_dir($directory)){ return false; }

    $files = array();
    $dir = dir($directory);

    while (false !== ($file = $dir->read())){
        if ($file != '.' and $file != '..') {
            if (is_dir($directory . '/' . $file)) { $files[] = hashDirectory($directory . '/' . $file); }
            else { $files[] = md5_file($directory . '/' . $file); }
        }
    }

    $dir->close();

    return md5(implode('', $files));
}




copy () hanya berfungsi dengan file.

Baik perintah salin DOS dan Unix cp akan menyalin secara rekursif - jadi solusi tercepat adalah dengan keluar dan menggunakannya. misalnya

`cp -r $src $dest`;

Kalau tidak, Anda harus menggunakan opendir/readdir atau scandiruntuk membaca isi direktori, beralih melalui hasilnya dan jika is_dir mengembalikan true untuk masing-masing, kembalilah ke dalamnya.

misalnya

function xcopy($src, $dest) {
    foreach (scandir($src) as $file) {
        if (!is_readable($src . '/' . $file)) continue;
        if (is_dir($src .'/' . $file) && ($file != '.') && ($file != '..') ) {
            mkdir($dest . '/' . $file);
            xcopy($src . '/' . $file, $dest . '/' . $file);
        } else {
            copy($src . '/' . $file, $dest . '/' . $file);
        }
    }
}



Solusi terbaik adalah!

php
$src = "/home/www/domain-name.com/source/folders/123456";
$dest = "/home/www/domain-name.com/test/123456";

shell_exec("cp -r $src $dest");

echo "

Copy Paste completed!

"
; //output when done ?>






function full_copy( $source, $target ) {
    if ( is_dir( $source ) ) {
        @mkdir( $target );
        $d = dir( $source );
        while ( FALSE !== ( $entry = $d->read() ) ) {
            if ( $entry == '.' || $entry == '..' ) {
                continue;
            }
            $Entry = $source . '/' . $entry; 
            if ( is_dir( $Entry ) ) {
                full_copy( $Entry, $target . '/' . $entry );
                continue;
            }
            copy( $Entry, $target . '/' . $entry );
        }

        $d->close();
    }else {
        copy( $source, $target );
    }
}


Seperti yang dikatakan di tempat lain, copyhanya bekerja dengan satu file untuk sumber dan bukan pola. Jika Anda ingin menyalin berdasarkan pola, gunakan globuntuk menentukan file, kemudian jalankan salin. Ini tidak akan menyalin subdirektori, juga tidak akan membuat direktori tujuan.

function copyToDir($pattern, $dir)
{
    foreach (glob($pattern) as $file) {
        if(!is_dir($file) && is_readable($file)) {
            $dest = realpath($dir . DIRECTORY_SEPARATOR) . basename($file);
            copy($file, $dest);
        }
    }    
}
copyToDir('./test/foo/*.txt', './test/bar'); // copies all txt files


php
    function copy_directory( $source, $destination ) {
        if ( is_dir( $source ) ) {
        @mkdir( $destination );
        $directory = dir( $source );
        while ( FALSE !== ( $readdirectory = $directory->read() ) ) {
            if ( $readdirectory == '.' || $readdirectory == '..' ) {
                continue;
            }
            $PathDir = $source . '/' . $readdirectory; 
            if ( is_dir( $PathDir ) ) {
                copy_directory( $PathDir, $destination . '/' . $readdirectory );
                continue;
            }
            copy( $PathDir, $destination . '/' . $readdirectory );
        }

        $directory->close();
        }else {
        copy( $source, $destination );
        }
    }
?>

dari baris 4 terakhir, buat ini

$source = 'wordpress';//i.e. your source path

dan

$destination ='b';

Terima kasih penuh harus ditujukan kepada Felix Kling untuk jawaban luar biasa yang telah saya gunakan dengan penuh syukur dalam kode saya. Saya menawarkan peningkatan kecil dari nilai pengembalian boolean untuk melaporkan keberhasilan atau kegagalan:

function recurse_copy($src, $dst) {

  $dir = opendir($src);
  $result = ($dir === false ? false : true);

  if ($result !== false) {
    $result = @mkdir($dst);

    if ($result === true) {
      while(false !== ( $file = readdir($dir)) ) { 
        if (( $file != '.' ) && ( $file != '..' ) && $result) { 
          if ( is_dir($src . '/' . $file) ) { 
            $result = recurse_copy($src . '/' . $file,$dst . '/' . $file); 
          }     else { 
            $result = copy($src . '/' . $file,$dst . '/' . $file); 
          } 
        } 
      } 
      closedir($dir);
    }
  }

  return $result;
}




Versi @Kzoty saya yang sudah dipangkas. Terima kasih, Kzoty.

Pemakaian

Helper::copy($sourcePath, $targetPath);

class Helper {

    static function copy($source, $target) {
        if (!is_dir($source)) {//it is a file, do a normal copy
            copy($source, $target);
            return;
        }

        //it is a folder, copy its files & sub-folders
        @mkdir($target);
        $d = dir($source);
        $navFolders = array('.', '..');
        while (false !== ($fileEntry=$d->read() )) {//copy one by one
            //skip if it is navigation folder . or ..
            if (in_array($fileEntry, $navFolders) ) {
                continue;
            }

            //do copy
            $s = "$source/$fileEntry";
            $t = "$target/$fileEntry";
            self::copy($s, $t);
        }
        $d->close();
    }

}

Saya mengkloning seluruh direktori dengan SPL Directory Iterator.

function recursiveCopy($source, $destination)
{
    if (!file_exists($destination)) {
        mkdir($destination);
    }

    $splFileInfoArr = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

    foreach ($splFileInfoArr as $fullPath => $splFileinfo) {
        //skip . ..
        if (in_array($splFileinfo->getBasename(), [".", ".."])) {
            continue;
        }
        //get relative path of source file or folder
        $path = str_replace($source, "", $splFileinfo->getPathname());

        if ($splFileinfo->isDir()) {
            mkdir($destination . "/" . $path);
        } else {
        copy($fullPath, $destination . "/" . $path);
        }
    }
}
#calling the function
recursiveCopy(__DIR__ . "/source", __DIR__ . "/destination");

// using exec

function rCopy($directory, $destination)
{

    $command = sprintf('cp -r %s/* %s', $directory, $destination);

    exec($command);

}

Untuk server Linux, Anda hanya perlu satu baris kode untuk menyalin secara rekursif sambil mempertahankan izin:

exec('cp -a '.$source.' '.$dest);

Cara lain untuk melakukannya adalah:

mkdir($dest);
foreach ($iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::SELF_FIRST) as $item)
{
    if ($item->isDir())
        mkdir($dest.DIRECTORY_SEPARATOR.$iterator->getSubPathName());
    else
        copy($item, $dest.DIRECTORY_SEPARATOR.$iterator->getSubPathName());
}

tapi lebih lambat dan tidak mempertahankan izin.


Saya memiliki situasi yang serupa di mana saya perlu menyalin dari satu domain ke domain lain di server yang sama, Inilah yang berhasil dalam kasus saya, Anda juga dapat menyesuaikan sesuai keinginan Anda:

foreach(glob('../folder/*.php') as $file) {
$adjust = substr($file,3);
copy($file, '/home/user/abcde.com/'.$adjust);

Perhatikan penggunaan "substr ()", tanpa itu, tujuan menjadi '/ home / pengguna / abcde.com/../folder/', yang mungkin sesuatu yang tidak Anda inginkan. Jadi, saya menggunakan substr () untuk menghilangkan 3 karakter pertama (../) untuk mendapatkan tujuan yang diinginkan yaitu '/home/user/abcde.com/folder/'. Jadi, Anda dapat menyesuaikan fungsi substr () dan juga fungsi glob () hingga sesuai dengan kebutuhan pribadi Anda. Semoga ini membantu.