当文件夹上的循环并重命名每个文件时,“系统找不到指定的文件”

I'm looping unto directories and each directory consist of multiple files that yet to be rename. Below is the code

<?php

    $path    = __DIR__.'/';
    $files = array_diff(scandir($path), array('.', '..'));

    foreach($files as $f ){
        $files2 = array_diff(scandir($path.'/'.$f), array('.', '..'));
        foreach( $files2 as $f2 ){
            rename($path.'/'.$f.'/'.$f2, $path.'/'.$f.'/'.strtolower(str_replace(' ','_',$f2)));
            echo 'success<br>';
        }
    }

above codes return an error of

The system cannot find the file specified. (code: 2)

in each directory, some of the files has the name that consist of special character(s) e.g. Velāyat-e Nūrestān.json.

Any ideas ?

Your code,in the actual state can't work because there are a lot of issues in it.I suggest to use native Directory Iterator to achieve this properly . You can use:

$root=__DIR__.'/';

$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($root));//create a recursive directory iterator

$it->rewind();

while($it->valid()) 
{
    if (
        !$it->isDot()//if file basename not in ['.','..']
        &&$it->isFile()//and is really a file and not a directory
    ) 
    {
            rename(str_replace('/','\\',$it->getPathname()),str_replace('/','\\',$it->getPath().'\\'.mb_strtolower(str_replace(' ','_',$it->getBasename()))));//try to rename  it
      echo "success";
    }

    $it->next();
}