質問

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

and

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

他のヒント

追加:

print "$file\n";

renameステートメントの前に、取得する内容を確認します。

また、ファイルを配列に追加する前にifステートメントに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