在 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 (整數,可選):指定結果的排序順序。它可以取以下值之一

  • SCANDIR_SORT_ASCENDING(預設):按升序排序結果。

  • SCANDIR_SORT_DESCENDING:按降序排序結果。

  • SCANDIR_SORT_NONE:不執行任何排序。

  • $context (資源|空,可選):指定使用 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 (整數,可選):要為新建立的目錄設定的許可權。它以八進位制值指定。

  • $recursive (布林值,可選):如果設定為 true,則啟用父目錄的遞迴建立。

  • $context (資源|空,可選):指定使用 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 (整數,可選):要為新建立的目錄設定的許可權。它以八進位制值指定。

  • $recursive (布林值,可選):如果設定為 true,則啟用父目錄的遞迴建立。

  • $context (資源|空,可選):指定使用 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 迭代器類的功能簡化了程式碼。

結論

總之,這兩種方法都可以達到預期的效果,但使用迭代器的第二種方法提供了一種更優雅和高效的解決方案,尤其是在涉及大型目錄結構的情況下。但是,兩種方法之間的選擇最終取決於開發人員的具體需求和偏好。

更新於: 2023-07-28

2K+ 瀏覽量

啟動你的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.