2010-01-17 10 views
25

जब एक स्थान से एक फाइल चलती मैं का उपयोगसभी फ़ाइलों को किसी फ़ोल्डर में दूसरे स्थान पर ले जाएं?

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

कैसे आप किसी अन्य फ़ोल्डर में एक फ़ोल्डर में सभी फ़ाइलें स्थानांतरित कैसे करूं?

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

आप मूल निर्देशिका रखने के लिए की जरूरत है? – Sampson

+0

मूल फ़ोल्डर को रखना अच्छा होगा ... इस बार नहीं, लेकिन शायद एक और बार मुझे इसे रखना होगा .. मुझे संदेह हो सकता है कि आपका दृष्टिकोण क्या है =) – ajsie

+0

लेकिन मैंने देखा कि Ive गंतव्य फ़ोल्डर में फ़ाइलें मिली है I रखना की इच्छा है। और फिर आपका दृष्टिकोण काम नहीं करता है क्योंकि यह फ़ोल्डर को किसी गंतव्य फ़ोल्डर में स्थानांतरित करने की अनुमति नहीं देता है जिसमें पहले से ही – ajsie

उत्तर

52

एक थोड़ा वर्बोज़ समाधान: परिणाम के बिना यह एक कोशिश की

// 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

मेरे पास गंतव्य फ़ोल्डर में फ़ाइलें हैं और मैं उन्हें रखना चाहता हूं। फ़ाइलों को एक अस्थायी फ़ोल्डर से उस फ़ोल्डर में ले जाएं ताकि आप हर समय फ़ाइलों को जोड़ सकें। – ajsie

+0

मुझे लाइन नहीं मिलती है: अगर (in_array ($ फ़ाइल, सरणी ("।", ".."))) जारी रखें; यह क्या कर रहा हैं? – ajsie

+0

गैरनाम, इस सरणी में से दो आइटम "।" "वर्तमान" निर्देशिका का प्रतिनिधित्व करता है, और ".." "पिछली" निर्देशिका का प्रतिनिधित्व करता है। जब हम इन दोनों में आते हैं, तो हम केवल "जारी रखते हैं" का अर्थ है कि हम वर्तमान पुनरावृत्ति को छोड़ देते हैं। – Sampson

0

इस प्रयास करें: नाम बदलने ('पथ/*', 'Newpath /');

मैं गंतव्य

+0

काम नहीं किया .. "ऐसी कोई फ़ाइल या निर्देशिका नहीं" – ajsie

0

में एक तारक होने में एक बिंदु दिखाई नहीं देता तो लक्ष्य निर्देशिका मौजूद नहीं है, तो आप इसे पहले बनाने की आवश्यकता होगी:

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

"ऐसी कोई फ़ाइल या निर्देशिका नहीं" – Alvin

+1

यदि आपको कोई समस्या है, तो कुछ कोड पोस्ट करें (या एक नया प्रश्न)। –

+0

यह उत्तर मेरे लिए काम नहीं किया है। यह अच्छा होगा अगर नाम फ़ंक्शन ने ग्लोब का समर्थन किया, लेकिन PHP7 के रूप में, यह मामला प्रतीत नहीं होता है। उदाहरण: 'नाम बदलें (/home/eric/wordpress/files/.tmp-checksum/*,/home/eric/wordpress/files/core): ऐसी कोई फ़ाइल या निर्देशिका नहीं हालांकि, 'ls/home/eric/वर्डप्रेस/फाइल/.tmp-checksum/* 'बैश खोल में कई फाइलें दिखाती हैं। – Eric

15

एक वैकल्पिक नाम बदलने का उपयोग कर() और कुछ त्रुटि जाँच के साथ:

$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

तो मैं के रूप में वर्णित rename() फ़ंक्शन का उपयोग करने की कोशिश की और मैं त्रुटि वापस पाने था रखा no such file or directory मैंने कोड को एक और कथन के भीतर रखा ताकि यह सुनिश्चित किया जा सके कि वास्तव में निर्देशिकाएं बनाई गई हैं। यह इस तरह से देखा:

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

तो जब मैं कोड फिर से भाग गया, इसे थूक से बाहर है कि दोनों रास्तों निर्देशिका थे। मैं फंस गया था। मैंने एक सहकर्मी से बात की और उसने सुझाव दिया, "क्यों न केवल नई निर्देशिका में अस्थायी निर्देशिका का नाम बदलें, क्योंकि आप सभी फाइलों को वैसे भी ले जाना चाहते हैं?"

बाहर निकलता है, यही वह है जो मैंने किया। मैंने rename() फ़ंक्शन के साथ वाइल्डकार्ड का उपयोग करने की कोशिश छोड़ दी और इसके बजाय अस्थायी निर्देशिका में अस्थायी निर्देशिका का नाम बदलने के लिए बस rename() का उपयोग करें।

तो ऐसा लगता है।

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

rename($tempDir, $permanentDir); 

यह मेरी प्रयोजनों के लिए खूबसूरती से काम किया क्योंकि मैं पुराने tmp निर्देशिका फ़ाइलें अपलोड किया गया है के बाद और "चले गए" की जरूरत नहीं है वहाँ रहने के लिए।

उम्मीद है कि इससे मदद मिलती है। अगर कोई जानता है कि वाइल्डकार्ड rename() फ़ंक्शन में क्यों काम नहीं करता है और मुझे ऊपर बताई गई त्रुटि क्यों मिल रही है, तो कृपया मुझे बताएं।

0

एक साइड नोट के रूप में; जब आप किसी अन्य फ़ोल्डर में फ़ाइलों की प्रतिलिपि बनाते हैं, तो उनका अंतिम बदला समय वर्तमान टाइमस्टैम्प बन जाता है। तो आपको 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

यह एक ?:

 <?php 

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

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

सुनिश्चित नहीं हैं कि अगर यह किसी को भी मदद करता है या नहीं की कोशिश की, लेकिन मुझे किसी भी पोस्ट होता सोचा। एक चुनौती थी जहां मेरे पास फिल्मों का ढेर था, मैंने एक फ़ोल्डर में संग्रहीत विभिन्न ऑनलाइन स्टोरों के माध्यम से खरीदा और डाउनलोड किया था, लेकिन सभी अपने सबफ़ोल्डर में और सभी अलग-अलग नामकरण सम्मेलनों के साथ। मैं उन सभी को मूल फ़ोल्डर में ले जाना चाहता था और सुंदर दिखने के लिए उन सभी का नाम बदलना चाहता था। सभी उपफोल्डर्स मैं एक थोक नामकरण उपकरण और सशर्त नाम स्वरूपण के साथ नाम बदलने में कामयाब रहा।उपफोल्डर्स में उन अन्य फाइलें थीं जिन्हें मैं नहीं चाहता था। इसलिए मैंने निम्न php स्क्रिप्ट को लिखा है, 1. सभी फ़ाइलों को एक्सटेंशन mp4 के साथ उनके मूल निर्देशिका में नाम बदलें/उन्हें स्थानांतरित करें, जबकि उन्हें उनके फ़ोल्डर के समान नाम दें, 2. सबफ़ोल्डर की सामग्री हटाएं और खाली निर्देशिका के लिए निर्देशिकाओं को देखें और फिर rmdir, 3. subfolders rmdir।

$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

इस समाधान करने का प्रयास करें, यह सफलतापूर्वक परीक्षण है ::

<?php 
    $files = scandir("f1"); 
    $oldfolder = "f1/"; 
    $newfolder = "f2/"; 
    foreach($files as $fname) { 
     if($fname != '.' && $fname != '..') { 
      rename($oldfolder.$fname, $newfolder.$fname); 
     } 
    } 
?> 
संबंधित मुद्दे