ホームページ >バックエンド開発 >PHPチュートリアル >PHP で、あるディレクトリのすべての内容を別のディレクトリにコピーします

PHP で、あるディレクトリのすべての内容を別のディレクトリにコピーします

WBOY
WBOY転載
2023-08-29 14:41:062143ブラウズ

PHP で、あるディレクトリのすべての内容を別のディレクトリにコピーします

PHP とは何ですか?

PHP は Hypertext Preprocessor の略で、主に Web 開発に使用される広く使用されているサーバーサイド スクリプト言語です。開発者に、動的な Web ページやアプリケーションを作成するための強力で柔軟なプラットフォームを提供します。 PHP は HTML コードに埋め込むことができ、サーバー側の機能とクライアント側の要素をシームレスに統合できます。その構文は C や Perl に似ているため、これらの言語に精通したプログラマーにとっては比較的簡単に学習して使用できます。 PHP を使用すると、サーバー側スクリプトを Web サーバー上で実行して、ユーザーのブラウザに配信できる動的コンテンツを生成できます。さまざまなデータベースをサポートしており、データベース駆動型の Web サイトの開発に適しています。さらに、PHP は、迅速な開発を促進し、コードの再利用性を高めるオープンソース ライブラリとフレームワークの広大なエコシステムを提供します。 PHP は、強力なコミュニティ サポートと広範なドキュメントにより、世界中の Web 開発者の間で依然として人気のある選択肢です。

PHP あるディレクトリの内容全体を別のディレクトリにコピーする

ここでは、scandir() と RecursiveIteratorIterator クラスを使用して、あるディレクトリの内容全体を別のディレクトリにコピーします。

方法1

scandir() を使用する

次に、scandir() はいくつかの引数を受け取り、エラーが発生しなければ、ディレクトリ内のファイル名のリストを返します。

###文法### リーリー

    #$
  • directory (文字列): スキャンするディレクトリへのパス。

  • $
  • sorting_order (int、オプション): 結果の並べ替え順序を指定します。次のいずれかの値を取ることができます。

    SCANDIR_SORT_ASCENDING (デフォルト): 結果を昇順に並べ替えます。
  • SCANDIR_SORT_DESCENDING: 結果を降順に並べ替えます。
  • SCANDIR_SORT_NONE: 並べ替えは実​​行されません。
  • $
  • context (resource|null、オプション): stream_context_create() を使用して作成されたコンテキスト リソースを指定します。これは、scandir() 関数の動作を変更するために使用されます。指定しない場合は、null が使用されます。

    戻り値: scandir() 関数は、指定されたディレクトリ内のファイル名とディレクトリの配列を返します。これには通常のファイルとディレクトリが含まれます。結果の配列には特別なエントリが含まれます。と .. はそれぞれ現在のディレクトリと親ディレクトリを表します。
  • ###例###

    ここでは、scandir() を使用して、PHP で 1 つのディレクトリの内容全体を別のディレクトリにコピーする方法の例を示します。
  • リーリー ###出力### リーリー
コードの説明

このコードは、ソース ディレクトリの内容をターゲット ディレクトリに再帰的にコピーする役割を担う、copyDirectory という名前の関数を定義します。この関数は、まずターゲット ディレクトリが存在しないかどうかを確認し、必要に応じて mkdir() を使用してディレクトリを作成します。次に、scandir() を使用して、ソース ディレクトリ内のファイルとディレクトリのリストを取得します。 . および .. エントリを除く各項目を反復処理し、ソース ファイル パスと宛先ファイル パスを構築します。項目がディレクトリの場合、関数は新しいパスを使用してそれ自体を再帰的に呼び出します。ファイルの場合は、copy() 関数を使用して、ファイルをソースから宛先にコピーします。このプロセスは、サブディレクトリとそれぞれのファイルを含む、ソース ディレクトリのすべての内容がターゲット ディレクトリにコピーされるまで続きます。最後に、引数として指定されたソース ディレクトリと宛先ディレクトリを使用して関数が呼び出され、コピー操作が実行されます。

方法 2

RecursiveDirectoryIterator での RecursiveIteratorIterator クラスの使用

ここでは 2 つのクラスを使用してタスクを完了します。

###文法### リーリー

#$pathname (文字列): 作成するディレクトリへのパス。

$
    mode (int、オプション): 新しく作成されたディレクトリに設定する権限。 8 進数値で指定します。
  • $
  • recursive (ブール値、オプション): true に設定すると、親ディレクトリの再帰的作成が有効になります。
  • $
  • context (resource|null、オプション): stream_context_create() を使用して作成されたコンテキスト リソースを指定します。
  • 戻り値: mkdir() 関数は、成功した場合は true を返し、失敗した場合は false を返します。

  • ###例###

    上記の方法を使用した例を次に示します。 リーリー ###出力### リーリー コードの説明:

  • このコードは、ソース ディレクトリの内容をターゲット ディレクトリに再帰的にコピーする役割を担う、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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。