2

名前にスペースが含まれるファイルが既にサーバー上にあります。アンダースコアで名前を変更したい。スペースの前にスラッシュを入れてみました。スペースを %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++]);
}
4

3 に答える 3

2

名前の変更を試みない場合、no such file エラーは発生しませんか? デバッグ時の適切な最初のステップは、バグがなくなるまで問題を単純化することです。

最初は機能していなかったため、これを行ったかどうかはわかりませんが、間違いなく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++]);
于 2009-08-04T01:09:06.247 に答える
1

追加:

print "$file\n";

rename ステートメントの前に、何が得られているかを確認します。

また、ファイルを配列に追加する前に、if ステートメントに strstr($fname, ' ') を追加して、スペースを含むファイル名のみを操作する必要があります。

if ( ($fname != '.') && ($fname != '..') && !is_dir("./$fname" ) && strstr($fname, ' ')) 
{
  $old_files[] = $fname;
}
于 2009-08-04T01:12:23.517 に答える
1

私は、いくつかの非常に不適切な名前のファイルをクリーンアップするための簡単なハックを生成していました。これが私のコードです。必要に応じて使用してください。

<?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";
    }
于 2012-02-19T17:13:58.910 に答える