Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Salin semua kandungan satu direktori ke direktori lain dalam PHP

Salin semua kandungan satu direktori ke direktori lain dalam PHP

WBOY
WBOYke hadapan
2023-08-29 14:41:062014semak imbas

Salin semua kandungan satu direktori ke direktori lain dalam PHP

Apakah itu PHP?

PHP adalah singkatan kepada Hypertext Preprocessor dan merupakan bahasa skrip bahagian pelayan yang digunakan secara meluas yang digunakan terutamanya untuk pembangunan web. Ia menyediakan pemaju dengan platform yang berkuasa dan fleksibel untuk mencipta halaman web dan aplikasi yang dinamik. PHP boleh dibenamkan dalam kod HTML, membolehkan penyepaduan lancar kefungsian bahagian pelayan dengan elemen sisi klien. Sintaksnya serupa dengan C dan Perl, menjadikannya agak mudah dipelajari dan digunakan untuk pengaturcara yang biasa dengan bahasa ini. PHP membenarkan skrip sebelah pelayan dilaksanakan pada pelayan web, menjana kandungan dinamik yang boleh dihantar ke penyemak imbas pengguna. Ia menyokong pelbagai pangkalan data dan sesuai untuk membangunkan tapak web berasaskan pangkalan data. Selain itu, PHP menawarkan ekosistem perpustakaan dan rangka kerja sumber terbuka yang luas yang memudahkan pembangunan pesat dan meningkatkan kebolehgunaan semula kod. Dengan sokongan komuniti yang kukuh dan dokumentasi yang luas, PHP kekal sebagai pilihan popular di kalangan pembangun web di seluruh dunia.

PHP Salin keseluruhan kandungan satu direktori ke direktori lain

Di sini, kami menggunakan kelas scandir() dan RecursiveIteratorIterator untuk menyalin keseluruhan kandungan satu direktori ke direktori lain.

Kaedah 1

Gunakan scandir()

Kemudian scandir() menerima beberapa argumen dan, jika tiada ralat berlaku, mengembalikan senarai nama fail dalam direktori.

Tatabahasa

array scandir(string $directory, int $sorting_order = 
SCANDIR_SORT_ASCENDING, resource|null $context = null)
  • $direktori (rentetan): Laluan ke direktori untuk mengimbas.

  • $urutan_isih (int, pilihan): Menentukan susunan isihan hasil. Ia boleh mengambil salah satu daripada nilai berikut:

  • SCANDIR_SORT_ASCENDING (lalai): Isih hasil dalam tertib menaik.

  • SCANDIR_SORT_DESCENDING: Isih hasil dalam tertib menurun.

  • SCANDIR_SORT_NONE: Tiada pengisihan dilakukan.

  • $konteks (sumber|null, pilihan): Menentukan sumber konteks yang dibuat menggunakan stream_context_create(). Ia digunakan untuk mengubah suai tingkah laku fungsi scandir(). Jika tidak disediakan, null digunakan.

  • Nilai pulangan: Fungsi scandir() mengembalikan tatasusunan nama fail dan direktori dalam direktori yang ditentukan. Ia termasuk fail dan direktori biasa. Tatasusunan yang terhasil mengandungi entri khas. dan .. mewakili direktori semasa dan direktori induk masing-masing.

Contoh

Berikut ialah contoh cara menggunakan scandir() untuk menyalin keseluruhan kandungan satu direktori ke direktori lain dalam PHP.

<?php
function copyDirectory($source, $destination) {
   if (!is_dir($destination)) {
      mkdir($destination, 0755, true);
   }
   $files = scandir($source);
   foreach ($files as $file) {
      if ($file !== '.' && $file !== '..') {
         $sourceFile = $source . '/' . $file;
         $destinationFile = $destination . '/' . $file;
         if (is_dir($sourceFile)) {
            copyDirectory($sourceFile, $destinationFile);
         } else {
            copy($sourceFile, $destinationFile);
         }
      }
   }
}
$sourceDirectory = '/source/directory';
$destinationDirectory = '/destination/directory';
copyDirectory($sourceDirectory, $destinationDirectory);
?>

Output

There will be no output if the process is successful.

Perihalan kod

Kod ini mentakrifkan fungsi yang dipanggil copyDirectory, yang bertanggungjawab untuk menyalin secara rekursif kandungan direktori sumber ke direktori sasaran. Fungsi pertama menyemak sama ada direktori sasaran tidak wujud dan menciptanya menggunakan mkdir() jika perlu. Ia kemudian menggunakan scandir() untuk mendapatkan semula senarai fail dan direktori dalam direktori sumber. Ia berulang melalui setiap item, tidak termasuk entri .. dan .. dan membina laluan fail sumber dan destinasi. Jika item itu ialah direktori, fungsi itu memanggil dirinya secara rekursif dengan laluan baharu. Jika ia adalah fail, gunakan fungsi copy() untuk menyalin fail daripada sumber ke destinasi. Proses ini berterusan sehingga semua kandungan direktori sumber telah disalin ke direktori sasaran, termasuk subdirektori dan fail masing-masing. Akhirnya, fungsi dipanggil dengan direktori sumber dan destinasi yang disediakan sebagai hujah untuk melaksanakan operasi penyalinan.

Kaedah 2

Gunakan kelas RecursiveIteratorIterator dengan RecursiveDirectoryIterator

Di sini kita akan menggunakan dua kelas untuk menyelesaikan tugasan.

Tatabahasa

bool mkdir(string $pathname, int $mode = 0777, bool $recursive = 
false, resource|null $context = null)
  • $nama laluan (rentetan): Laluan ke direktori untuk dibuat.

  • $mod (int, pilihan): Kebenaran untuk ditetapkan untuk direktori yang baru dibuat. Ia dinyatakan sebagai nilai perlapanan.

  • $rekursif (boolean, pilihan): Jika ditetapkan kepada benar, dayakan penciptaan rekursif direktori induk.

  • $konteks (sumber|null, pilihan): Menentukan sumber konteks yang dibuat menggunakan stream_context_create().

  • Nilai pulangan: Fungsi mkdir() mengembalikan benar apabila berjaya dan palsu apabila gagal.

Contoh

Berikut adalah contoh menggunakan kaedah di atas.

function copyDirectory($source, $destination) {
   if (!is_dir($destination)) {
      mkdir($destination, 0755, true);
   }
   $iterator = new RecursiveIteratorIterator(
      new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),
      RecursiveIteratorIterator::SELF_FIRST
   );
   foreach ($iterator as $item) {
      if ($item->isDir()) {
         $dir = $destination . '/' . $iterator->getSubPathName();
         if (!is_dir($dir)) {
            mkdir($dir, 0755, true);
         }
      } else {
         $file = $destination . '/' . $iterator->getSubPathName();
         copy($item, $file);
      }
   }
}
$sourceDirectory = '/source/directory';
$destinationDirectory = '/destination/directory';
copyDirectory($sourceDirectory, $destinationDirectory);

Output

There will be no output if the process is successful.

Penerangan kod:

Kod ini mentakrifkan fungsi yang dipanggil copyDirectory, yang bertanggungjawab untuk menyalin secara rekursif kandungan direktori sumber ke direktori sasaran. Fungsi pertama menyemak sama ada direktori sasaran tidak wujud dan menciptanya menggunakan mkdir() jika perlu. Ia kemudian menggunakan scandir() untuk mendapatkan semula senarai fail dan direktori dalam direktori sumber. Ia berulang melalui setiap item, tidak termasuk entri .. dan .. dan membina laluan fail sumber dan destinasi. Jika item itu ialah direktori, fungsi itu memanggil dirinya secara rekursif dengan laluan baharu. Jika ia adalah fail, gunakan fungsi copy() untuk menyalin fail daripada sumber ke destinasi. Proses ini berterusan sehingga semua kandungan direktori sumber telah disalin ke direktori sasaran, termasuk subdirektori dan fail masing-masing. Akhirnya, fungsi dipanggil dengan direktori sumber dan destinasi yang disediakan sebagai hujah untuk melaksanakan operasi penyalinan.

方法2

将 RecursiveIteratorIterator 类与 RecursiveDirectoryIterator 一起使用

这里我们将使用两个类来完成任务。

语法

bool mkdir(string $pathname, int $mode = 0777, bool $recursive = 
false, resource|null $context = null)
  • $pathname(字符串):要创建的目录的路径。

  • $mode(int,可选):为新创建的目录设置的权限。它被指定为八进制值。

  • $recursive(布尔型,可选):如果设置为 true,则启用父目录的递归创建。

  • $context(resource|null,可选):指定使用stream_context_create()创建的上下文资源。

  • 返回值:mkdir() 函数在成功时返回 true,在失败时返回 false。

示例

这里是使用上述方法的一个例子。

function copyDirectory($source, $destination) {
   if (!is_dir($destination)) {
      mkdir($destination, 0755, true);
   }
   $iterator = new RecursiveIteratorIterator(
      new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),
      RecursiveIteratorIterator::SELF_FIRST
   );
   foreach ($iterator as $item) {
      if ($item->isDir()) {
         $dir = $destination . '/' . $iterator->getSubPathName();
         if (!is_dir($dir)) {
            mkdir($dir, 0755, true);
         }
      } else {
         $file = $destination . '/' . $iterator->getSubPathName();
         copy($item, $file);
      }
   }
}
$sourceDirectory = '/source/directory';
$destinationDirectory = '/destination/directory';
copyDirectory($sourceDirectory, $destinationDirectory);

代码说明

在此方法中,RecursiveDirectoryIterator 用于迭代目录结构,包括所有子目录和文件。 RecursiveIteratorIterator 有助于递归地遍历迭代器。它会跳过 .和 .. 使用 SKIP_DOTS 标志的条目。在循环内,它检查当前项是否是目录。如果是这样,它会使用 mkdir() 在目标路径中创建相应的目录(如果该目录尚不存在)。如果该项目是文件,它将构造目标文件路径并使用 copy() 复制文件。此方法消除了对单独递归函数的需要,并通过利用内置 PHP 迭代器类的功能简化了代码。

结论

综上所述,两种方法都可以达到预期的结果,但第二种使用迭代器的方法提供了更优雅、更高效的解决方案,特别是对于涉及大型目录结构的场景。不过,这两种方法的选择最终取决于开发者的具体要求和偏好。

Atas ialah kandungan terperinci Salin semua kandungan satu direktori ke direktori lain dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:tutorialspoint.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam