首頁  >  文章  >  後端開發  >  在PHP中將一個目錄的所有內容複製到另一個目錄中

在PHP中將一個目錄的所有內容複製到另一個目錄中

WBOY
WBOY轉載
2023-08-29 14:41:062015瀏覽

在PHP中將一個目錄的所有內容複製到另一個目錄中

什麼是 PHP?

PHP 代表超文本預處理器,是一種廣泛使用的伺服器端腳本語言,主要用於 Web 開發。它為開發人員提供了一個強大而靈活的平台來創建動態網頁和應用程式。 PHP 可以嵌入 HTML 程式碼中,從而實現伺服器端功能與客戶端元素的無縫整合。它的語法與 C 和 Perl 類似,對於熟悉這些語言的程式設計師來說相對容易學習和使用。 PHP 允許在 Web 伺服器上執行伺服器端腳本,產生可傳送到使用者瀏覽器的動態內容。它支援多種資料庫,適合開發資料庫驅動的網站。此外,PHP 提供了一個龐大的開源程式庫和框架生態系統,促進快速開發並增強程式碼可重複使用性。憑藉其強大的社群支援和廣泛的文檔,PHP 仍然是全球 Web 開發人員的熱門選擇。

PHP將一個目錄的全部內容複製到另一個目錄

這裡,我們使用 scandir() 和 RecursiveIteratorIterator 類別將一個目錄的全部內容複製到另一個目錄。

方法1

使用 scandir()

然後 scandir() 接受許多參數,如果沒有發生錯誤,則傳回目錄中的檔案名稱清單。

文法

array scandir(string $directory, int $sorting_order = 
SCANDIR_SORT_ASCENDING, resource|null $context = null)
  • $directory(字串):要掃描的目錄的路徑。

  • $sorting_order(int,可選):指定結果的排序順序。它可以採用以下值之一:

  • SCANDIR_SORT_ASCENDING(預設):以升序對結果進行排序。

  • SCANDIR_SORT_DESCENDING:以降序對結果進行排序。

  • SCANDIR_SORT_NONE:不執行任何排序。

  • $context(resource|null,可選):指定使用stream_context_create()建立的上下文資源。它用於修改 scandir() 函數的行為。如果未提供,則使用 null。

  • 傳回值:scandir() 函數傳回指定目錄中的檔案名稱和目錄的陣列。它包括常規文件和目錄。產生的陣列包含特殊條目。和 .. 分別代表目前目錄和父目錄。

範例

以下是如何使用 scandir() 將一個目錄的全部內容複製到 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);
?>

輸出

There will be no output if the process is successful.

程式碼說明

程式碼定義了一個名為 copyDirectory 的函數,該函數負責遞歸地將來源目錄的內容複製到目標目錄。函數首先檢查目標目錄是否不存在,並在必要時使用 mkdir() 建立它。然後,它使用 scandir() 檢索來源目錄中的檔案和目錄清單。它迭代每個項目,不包括 .和 .. 條目,並建構來源檔案路徑和目標檔案路徑。如果該專案是目錄,則函數使用新路徑遞歸呼叫自身。如果是文件,則使用 copy() 函數將文件從來源複製到目標。此程序持續進行,直到來源目錄的所有內容都複製到目標目錄,包括子目錄及其各自的檔案。最後,使用作為參數提供的來源目錄和目標目錄來呼叫該函數以執行複製操作。

方法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);

輸出

There will be no output if the process is successful.

程式碼說明:

程式碼定義了一個名為 copyDirectory 的函數,該函數負責遞歸地將來源目錄的內容複製到目標目錄。函數首先檢查目標目錄是否不存在,並在必要時使用 mkdir() 建立它。然後,它使用 scandir() 檢索來源目錄中的檔案和目錄清單。它迭代每個項目,不包括 .和 .. 條目,並建構來源檔案路徑和目標檔案路徑。如果該專案是目錄,則函數使用新路徑遞歸呼叫自身。如果是文件,則使用 copy() 函數將文件從來源複製到目標。此程序持續進行,直到來源目錄的所有內容都複製到目標目錄,包括子目錄及其各自的檔案。最後,使用作為參數提供的來源目錄和目標目錄來呼叫該函數以執行複製操作。

方法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 迭代器类的功能简化了代码。

结论

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

以上是在PHP中將一個目錄的所有內容複製到另一個目錄中的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除