2010-01-17 22 views
25

wenn eine Datei von einem Ort zum anderen zu bewegen i verwendenVerschieben Sie alle Dateien in einem Ordner auf einen anderen?

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

wie Sie alle Dateien in einem Ordner in einen anderen Ordner zu verschieben? diese ein ergebnislos versucht:

rename('path/*', 'newpath/*'); 
+0

Haben Sie das ursprüngliche Verzeichnis halten müssen? – Sampson

+0

wäre es gut, den ursprünglichen Ordner zu behalten ... nicht dieses Mal, aber vielleicht ein anderes Mal ich muss es behalten..ich kann vermuten, was Ihr Ansatz ist =) – ajsie

+0

aber ich bemerkte, dass ive Dateien im Zielordner, dass ich behalten wollen. und dann funktioniert Ihr Ansatz nicht, weil es nicht erlaubt, den Ordner in einen Zielordner zu verschieben, der bereits Dateien enthält – ajsie

Antwort

52

Eine leicht ausführliche Lösung:

// 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); 
} 
+0

Ich habe Dateien im Zielordner und ich möchte sie behalten. Verschieben Sie einfach die Dateien aus einem temporären Ordner in diesen Ordner, damit Sie jederzeit Dateien hinzufügen können. – ajsie

+0

Ich bekomme die Zeile nicht: if (in_array ($ file, array (".", ".."))) fortfahren; Was macht es? – ajsie

+0

Noname, zwei der Elemente in diesem Array werden "." repräsentiert "aktuelles" Verzeichnis und ".." repräsentiert "vorheriges" Verzeichnis. Wenn wir auf diese stoßen, "fahren wir einfach fort", was bedeutet, dass wir die aktuelle Iteration überspringen. – Sampson

0

versuchen, dieses: Umbenennungs ('path/*', 'newpath /');

Ich sehe keinen Punkt in einen Stern mit in der Ziel

+0

hat nicht funktioniert .. "Keine solche Datei oder Verzeichnis" – ajsie

0

Wenn das Zielverzeichnis nicht vorhanden ist, werden Sie es zuerst erstellen müssen:

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

"Keine solche Datei oder Verzeichnis" – Alvin

+1

Wenn Sie ein Problem haben, senden Sie einen Code (oder eine neue Frage). –

+0

Diese Antwort hat nicht für mich funktioniert. Es wäre toll, wenn die Umbenennungsfunktion Globs unterstützt, aber ab PHP7 scheint das nicht der Fall zu sein. Beispiel: 'rename (/home/eric/wordpress/files/.tmp-checksum/*,/home/eric/wordpress/files/core): Keine solche Datei oder dieses Verzeichnis' Allerdings läuft' ls/home/eric/wordpress/files/.tmp-checksum/* 'in einer Bash-Shell zeigt viele Dateien. – Eric

15

Eine alternative Verwendung umbenennen() und mit einem gewissen Fehlerprüfung:

$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"; 
} 
1

so habe ich versucht, die rename() Funktion zu verwenden, wie beschrieben und ich hielt den Fehler immer wieder, dass war es no such file or directory. Ich habe den Code in eine if else-Anweisung eingefügt, um sicherzustellen, dass ich die Verzeichnisse wirklich erstellt habe. Es sah wie folgt aus:

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

Also, wenn ich den Code wieder lief, es auszuspucken, dass beide Wege Verzeichnisse waren. Ich war ratlos. Ich sprach mit einem Kollegen und er schlug vor: "Warum nicht einfach das temporäre Verzeichnis in das neue Verzeichnis umbenennen, da Sie sowieso alle Dateien verschieben möchten?"

Stellt sich heraus, das ist, was ich getan habe. Ich habe es aufgegeben, den Platzhalter mit der rename() Funktion zu verwenden und stattdessen einfach das rename() verwenden, um das temporäre Verzeichnis in das permanente umzubenennen.

so sieht es so aus.

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

rename($tempDir, $permanentDir); 

Das funktionierte wunderbar für meine Zwecke, da ich die alte tmp-Verzeichnis nicht brauchen, dort zu bleiben, nachdem die Dateien und „bewegt“ hochgeladen.

Hoffe, das hilft. Wenn jemand weiß, warum der Platzhalter in der rename() Funktion nicht funktioniert und warum ich den oben genannten Fehler erhalten habe, lassen Sie es mich bitte wissen.

0

Als eine Randnotiz; Wenn Sie Dateien in einen anderen Ordner kopieren, wird die zuletzt geänderte Zeit zum aktuellen Zeitstempel. Sie sollten also die neuen Dateien touch().

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

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

versucht, diese ?:

 <?php 

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

    rename($oldfolderpath,$newfolderpath); 
    ?> 
0

nicht sicher, ob dies jemand hilft oder nicht, aber ich dachte sowieso schreiben würde. Ich hatte eine Herausforderung, bei der ich jede Menge Filme habe, die ich gekauft und über verschiedene Online-Shops heruntergeladen habe, die alle in einem Ordner gespeichert sind, aber alle in ihren eigenen Unterordnern und alle mit unterschiedlichen Namenskonventionen. Ich wollte alle in den übergeordneten Ordner verschieben und sie alle umbenennen, um hübsch auszusehen. Alle Unterordner, die ich umbenannt habe, wurden mit einem Bulk-Umbenennungstool und der Formatierung von bedingten Namen umbenannt.Die Unterordner hatten andere Dateien in ihnen, die ich nicht wollte. Also habe ich das folgende php-Skript geschrieben, um 1. alle Dateien mit der Erweiterung mp4 umzubenennen/in ihr übergeordnetes Verzeichnis zu verschieben und ihnen den gleichen Namen zu geben wie ihr Ordner, 2. den Inhalt von Unterordnern lösche und nach Verzeichnissen suche, die leer sind und dann rmdir, 3. rmdir die Unterordner.

$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); 
} 
} 
11

Bitte versuchen Sie diese Lösung, wird es erfolgreich getestet ::

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