web-dev-qa-db-fra.com

déplacer tous les fichiers d'un dossier vers un autre?

lors du déplacement d'un fichier d'un emplacement à un autre, j'utilise

rename('path/filename', 'newpath/filename');

comment déplacez-vous tous les fichiers d'un dossier dans un autre dossier? essayé celui-ci sans résultat:

rename('path/*', 'newpath/*');
26
ajsie

Une solution légèrement verbeuse:

// Get array of all source files
$files = scandir("source");
// Identify directories
$source = "source/";
$destination = "destination/";
// Cycle through all source files
foreach ($files as $file) {
  if (in_array($file, array(".",".."))) continue;
  // If we copied this successfully, mark it for deletion
  if (copy($source.$file, $destination.$file)) {
    $delete[] = $source.$file;
  }
}
// Delete all successfully-copied files
foreach ($delete as $file) {
  unlink($file);
}
53
Sampson

Une alternative utilisant rename () et avec quelques erreurs de vérification:

$srcDir = 'dir1';
$destDir = 'dir2';

if (file_exists($destDir)) {
  if (is_dir($destDir)) {
    if (is_writable($destDir)) {
      if ($handle = opendir($srcDir)) {
        while (false !== ($file = readdir($handle))) {
          if (is_file($srcDir . '/' . $file)) {
            rename($srcDir . '/' . $file, $destDir . '/' . $file);
          }
        }
        closedir($handle);
      } else {
        echo "$srcDir could not be opened.\n";
      }
    } else {
      echo "$destDir is not writable!\n";
    }
  } else {
    echo "$destDir is not a directory!\n";
  }
} else {
  echo "$destDir does not exist\n";
}
15
GreenMatt

S'il vous plaît essayer cette solution, il a été testé avec succès: 

<?php
  $files = scandir("f1");
  $oldfolder = "f1/";
  $newfolder = "f2/";
  foreach($files as $fname) {
      if($fname != '.' && $fname != '..') {
          rename($oldfolder.$fname, $newfolder.$fname);
      }
  }
?>
12
Lakhan

essayé celui-ci ?:

     <?php

     $oldfolderpath = "old/folder";
     $newfolderpath = "new/folder";

     rename($oldfolderpath,$newfolderpath);
     ?>
1
T.Todua

J'ai donc essayé d'utiliser la fonction rename() telle que décrite et j'ai gardé l'erreur de revenir qu'il y avait no such file or directory. J'ai placé le code dans une instruction if else afin de m'assurer que les répertoires ont bien été créés. Cela ressemblait à ceci:

$tempDir = '/home/site/images/tmp/';
$permanentDir = '/home/site/images/' . $claimid; // this was stored above
mkdir($permanentDir,0775);
if(is_dir($permanentDir)){
    echo $permanentDir . ' is a directory';
    if(is_dir($tempDir)){
        echo $tempDir . ' is a directory';
    }else{
        echo $tempDir . ' is not a directory';
    }
}else{
    echo $permanentDir . ' is not a directory';
}

rename($tempDir . "*", $permanentDir);

Donc, quand j'ai relancé le code, il a été craché que les deux chemins étaient des répertoires. J'étais perplexe. J'ai parlé avec un collègue et il a suggéré, "Pourquoi ne pas simplement renommer le répertoire temporaire dans le nouveau répertoire, puisque vous souhaitez quand même déplacer tous les fichiers?"

Il s'avère que c'est ce que j'ai fini par faire. J'ai arrêté d'essayer d'utiliser le caractère générique avec la fonction rename() et d'utiliser plutôt la fonction rename() pour renommer le répertoire temporaire en répertoire permanent.

alors ça ressemble à ça.

$tempDir = '/home/site/images/tmp/';
$permanentDir = '/home/site/images/' . $claimid; // this was stored above
mkdir($permanentDir,0775);

rename($tempDir, $permanentDir);

Cela a fonctionné à merveille pour mes besoins puisque je n’ai pas besoin que l’ancien répertoire tmp y reste une fois les fichiers téléchargés et "déplacés".

J'espère que cela t'aides. Si quelqu'un sait pourquoi le caractère générique ne fonctionne pas dans la fonction rename() et pourquoi j'obtiens l'erreur mentionnée ci-dessus, veuillez me le faire savoir.

1
paviktherin

Je ne suis pas sûr que cela aide quelqu'un ou non, mais je pensais que je posterais quand même. Il y a eu un défi dans lequel j'ai eu des tas de films que j'avais achetés et téléchargés dans divers magasins en ligne, tous stockés dans un dossier, mais tous dans leurs propres sous-dossiers et ayant des conventions de dénomination différentes. Je voulais tous les déplacer dans le dossier parent et les renommer tous pour qu'ils soient beaux. Tous les sous-dossiers que j'avais réussi à renommer avec un outil de renommage en masse et un formatage de nom conditionnel. les sous-dossiers contenaient d'autres fichiers que je ne voulais pas. donc j'ai écrit le script php suivant pour, 1. renommer/déplacer tous les fichiers avec l'extension mp4 dans leur répertoire parent en leur donnant le même nom que leur dossier qui les contient, rmdir, 3. rmdir les sous-dossiers.

$handle = opendir("D:/Movies/");
while ($file = readdir($handle)) {
if ($file != "." && $file != ".." && is_dir($file)) {
    $newhandle = opendir("D:/Movies/".$file);
    while($newfile = readdir($newhandle)) {
        if ($newfile != "." && $newfile != ".." && is_file("D:/Movies/".$file."/".$newfile)) {
            $parts = explode(".",$newfile);
            if (end($parts) == "mp4") {
                if (!file_exists("D:/Movies/".$file.".mp4")) {
                    rename("D:/Movies/".$file."/".$newfile,"D:/Movies/".$file.".mp4");
                }
                else {
                    unlink("D:/Movies/".$file."/".$newfile);
                }
            }
            else { unlink("D:/Movies/".$file."/".$newfile); }
        }
        else if ($newfile != "." && $newfile != ".." && is_dir("D:/Movies/".$file."/".$newfile)) {
            $dirhandle = opendir("D:/Movies/".$file."/".$newfile);
            while ($dirfile = readdir($dirhandle)){
                if ($dirfile != "." && $dirfile != ".."){
                    unlink("D:/Movies/".$file."/".$newfile."/".$dirfile);
                }
            }
            rmdir("D:/Movies/".$file."/".$newfile);
        }
    }
    unlink("D:/Movies/".$file);
}
}
0
senya

essayez ceci: rename ('path/*', 'newpath /');

Je ne vois pas l'intérêt d'avoir un astérisque dans la destination

0
Aadith

Si le répertoire cible n'existe pas, vous devez d'abord le créer:

mkdir('newpath');
rename('path/*', 'newpath/');
0
Adam Hopkinson

Comme note de côté; Lorsque vous copiez des fichiers dans un autre dossier, leur dernière heure modifiée devient l'horodatage actuel. Donc, vous devriez toucher () les nouveaux fichiers.

... (some codes for directory looping) ...
if (copy($source.$file, $destination.$file)) {
   $delete[] = $source.$file;

   $filetimestamp = filemtime($source.$file); 
   touch($destination.$file,$filetimestamp);
}
... (some codes) ...
0
trante