سؤال

ولقد حصلت على الملفات مع مسافات في أسمائها التي هي بالفعل في خدمة بلدي. أريد أن تسميتها مع سفلية. لقد حاولت وضع مائل قبل الفضاء، ولقد حاولت استبدال المساحة مع٪ 20. لا يزال PHP يعطيني:

<اقتباس فقرة>   

لا يوجد ملف أو دليل.

إليك قانون بلدي:

$dir = './';
$dhandle = opendir($dir);
$old_files = array();

if ($dhandle) {
    while (false !== ($fname = readdir($dhandle)))
    {
        if ( ($fname != '.') && ($fname != '..') )
        {
            $old_files[] = (is_dir( "./$fname" )) ? "(Dir) {$fname}" : $fname;
        }
    }
    closedir($dhandle);
}

$new_files = str_replace(' ', '_', $old_files);
$x = 0;
foreach($old_files as $file)
{
    rename(rawurlencode($file), $new_files[$x++]);
}
هل كانت مفيدة؟

المحلول

هل أنت متأكد لا يحدث خطأ لا يوجد مثل هذا الملف إذا كنت لا تحاول إعادة تسمية؟ خطوة أولى جيدة عند التصحيح هو تبسيط المشكلة حتى انها لم عربات التي تجرها الدواب أطول.

وأنا لا أستطيع أن أقول إذا فعلت هذا لأنه لم يكن يعمل في البداية أم لا، ولكنك بالتأكيد لا ينبغي أن يكون باستخدام rawurlencode() على اسم الملف المحلي، هذا ما يضمن أن المسمار الامور. بالإضافة إلى ذلك، أنا الغريب ما تفعلونه مع "(Dir) {$fname}" - يبدو أن هذا أيضا خلل. وأظن أكثر عرضة ما تريد القيام به هو:

if ( ($fname != '.') && ($fname != '..') && !is_dir("./$fname" )) 
{
  $old_files[] = $fname;
}

ويجب أن ندرك أيضا، مع ذلك، أن ما dir عوائد هو اسم الملف <م> نسبة إلى الدليل مرت لذلك كنت بحاجة للتأكد من is_dir() وعمليات إعادة تسمية تأخذ ذلك في الاعتبار. أكثر من ذلك من المرجح كنت أريد أن أقول:

is_dir($dir.'/'.$fname);

و

rename($dir.'/'.$file,$dir.'/'.$new_files[$x++]);

نصائح أخرى

وإضافة:

print "$file\n";

وقبل بيان تسمية لمعرفة ما الذي تحصل عليه.

وبالإضافة إلى ذلك، يجب إضافة strstr ($ fname، '') لبيان إذا الخاص بك قبل إضافة الملف إلى مجموعة بحيث كنت تعمل فقط على أسماء الملفات التي تحتوي على الفضاء:

if ( ($fname != '.') && ($fname != '..') && !is_dir("./$fname" ) && strstr($fname, ' ')) 
{
  $old_files[] = $fname;
}

واعتدت على توليد الإختراق سريعة لتنظيف بعض الملفات حقا اسمه بشدة. وهنا قانون بلدي. استخدامها إذا كنت تريد.

<?php
    $dir = './';
    $dhandle = opendir($dir);
    $old_files = array();

    if ($dhandle) {
    while (false !== ($fname = readdir($dhandle))) {
        if ( ($fname != '.') && ($fname != '..') && !is_dir("./$fname" ))
             $old_files[] = $fname;
       }
       closedir($dhandle);
    }

    foreach($old_files as $file)
    {
        $new_name = str_replace(',', '', str_replace('&', '', str_replace(' ','',$file)));
        rename("./".$file, "./".$new_name);
        echo $new_name."\n";
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top