Maison >développement back-end >tutoriel php >Copiez tout le contenu d'un répertoire vers un autre répertoire en PHP

Copiez tout le contenu d'un répertoire vers un autre répertoire en PHP

WBOY
WBOYavant
2023-08-29 14:41:062153parcourir

Copiez tout le contenu dun répertoire vers un autre répertoire en PHP

Qu'est-ce que PHP ?

PHP signifie Hypertext Preprocessor et est un langage de script côté serveur largement utilisé, principalement utilisé pour le développement Web. Il fournit aux développeurs une plate-forme puissante et flexible pour créer des pages Web et des applications dynamiques. PHP peut être intégré dans du code HTML, permettant une intégration transparente des fonctionnalités côté serveur avec des éléments côté client. Sa syntaxe est similaire à celle du C et de Perl, ce qui la rend relativement facile à apprendre et à utiliser pour les programmeurs familiarisés avec ces langages. PHP permet d'exécuter des scripts côté serveur sur un serveur Web, générant ainsi un contenu dynamique pouvant être transmis au navigateur de l'utilisateur. Il prend en charge une variété de bases de données et convient au développement de sites Web basés sur des bases de données. De plus, PHP offre un vaste écosystème de bibliothèques et de frameworks open source qui facilitent un développement rapide et améliorent la réutilisabilité du code. Grâce à son solide soutien communautaire et à sa documentation complète, PHP reste un choix populaire parmi les développeurs Web du monde entier.

PHP Copiez tout le contenu d'un répertoire dans un autre répertoire

Ici, nous utilisons la classe scandir() et RecursiveIteratorIterator pour copier l'intégralité du contenu d'un répertoire vers un autre répertoire.

Méthode 1

Utilisez scandir()

Ensuite, scandir() accepte un certain nombre d'arguments et, si aucune erreur ne se produit, renvoie une liste de noms de fichiers dans le répertoire.

Grammaire

array scandir(string $directory, int $sorting_order = 
SCANDIR_SORT_ASCENDING, resource|null $context = null)
  • $directory (string) : Le chemin d'accès au répertoire à analyser.

  • $sorting_order (int, facultatif) : Spécifie l'ordre de tri des résultats. Il peut prendre l'une des valeurs suivantes :

  • SCANDIR_SORT_ASCENDING (par défaut) : trier les résultats par ordre croissant.

  • SCANDIR_SORT_DESCENDING : Trier les résultats par ordre décroissant.

  • SCANDIR_SORT_NONE : Aucun tri n'est effectué.

  • $context (resource|null, facultatif) : Spécifie la ressource de contexte créée à l'aide de stream_context_create(). Il permet de modifier le comportement de la fonction scandir(). S’il n’est pas fourni, null est utilisé.

  • Valeur de retour : la fonction scandir() renvoie un tableau de noms de fichiers et de répertoires dans le répertoire spécifié. Il comprend des fichiers et des répertoires réguliers. Le tableau résultant contient des entrées spéciales. et .. représentent respectivement le répertoire actuel et le répertoire parent.

Exemple

Voici un exemple d'utilisation de scandir() pour copier l'intégralité du contenu d'un répertoire vers un autre répertoire en 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);
?>

Sortie

There will be no output if the process is successful.

Description du code

Ce code définit une fonction appelée copyDirectory, qui est chargée de copier récursivement le contenu du répertoire source vers le répertoire cible. La fonction vérifie d'abord si le répertoire cible n'existe pas et le crée en utilisant mkdir() si nécessaire. Il utilise ensuite scandir() pour récupérer une liste de fichiers et de répertoires dans le répertoire source. Il parcourt chaque élément, à l'exclusion des entrées . et .., et construit les chemins d'accès aux fichiers source et de destination. Si l'élément est un répertoire, la fonction s'appelle de manière récursive avec le nouveau chemin. S'il s'agit d'un fichier, utilisez la fonction copy() pour copier le fichier de la source vers la destination. Ce processus se poursuit jusqu'à ce que tout le contenu du répertoire source ait été copié dans le répertoire cible, y compris les sous-répertoires et leurs fichiers respectifs. Enfin, la fonction est appelée avec les répertoires source et destination fournis comme arguments pour effectuer l'opération de copie.

Méthode 2

Utilisez la classe RecursiveIteratorIterator avec RecursiveDirectoryIterator

Ici, nous utiliserons deux classes pour accomplir la tâche.

Grammaire

bool mkdir(string $pathname, int $mode = 0777, bool $recursive = 
false, resource|null $context = null)
  • $pathname (string) : Le chemin d'accès au répertoire à créer.

  • $mode (int, facultatif) : autorisations à définir pour le répertoire nouvellement créé. Il est spécifié sous forme de valeur octale.

  • $recursive (booléen, facultatif) : si défini sur true, active la création récursive de répertoires parents.

  • $context (resource|null, facultatif) : Spécifie la ressource de contexte créée à l'aide de stream_context_create().

  • Valeur de retour : la fonction mkdir() renvoie vrai en cas de succès et faux en cas d'échec.

Exemple

Voici un exemple utilisant la méthode ci-dessus.

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

Sortie

There will be no output if the process is successful.

Description du code :

Ce code définit une fonction appelée copyDirectory, qui est chargée de copier récursivement le contenu du répertoire source vers le répertoire cible. La fonction vérifie d'abord si le répertoire cible n'existe pas et le crée en utilisant mkdir() si nécessaire. Il utilise ensuite scandir() pour récupérer une liste de fichiers et de répertoires dans le répertoire source. Il parcourt chaque élément, à l'exclusion des entrées . et .., et construit les chemins d'accès aux fichiers source et de destination. Si l'élément est un répertoire, la fonction s'appelle de manière récursive avec le nouveau chemin. S'il s'agit d'un fichier, utilisez la fonction copy() pour copier le fichier de la source vers la destination. Ce processus se poursuit jusqu'à ce que tout le contenu du répertoire source ait été copié dans le répertoire cible, y compris les sous-répertoires et leurs fichiers respectifs. Enfin, la fonction est appelée avec les répertoires source et destination fournis comme arguments pour effectuer l'opération de copie.

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

结论

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer