4

関数によるファイルの削除に問題がありますunlink()。ファイルがキリル文字の名前の場合、関数は機能しません。

[2012 年 7 月 24 日 00:33:35 UTC] PHP 警告: unlink(/home/gtsvetan/public_html/мениджър.doc) [function.unlink]: /home/gtsvetan/public_html/deleter にそのようなファイルまたはディレクトリはありません。 php 114行目

では、名前がシリル化されているときにファイルを削除するにはどうすればよいですか?

コードは次のとおりです。

$dir = is_array($dir) ? $dir : explode(',', $dir);
foreach($dir as $dirv) {
    if(is_dir($dirv)) {
        $objects = scandir($dirv);
        foreach($objects as $object) {
            if($object != "." && $object != "..") {
                if(filetype($dirv."/".$object) == "dir") {
                    $this->delete($dirv."/".$object); 
                }
                else {
                    unlink($dirv."/".$object);
                }
            }
        }
    reset($objects);
    rmdir($dirv);
    }
    else {
        unlink($dirv);
    }
}

ソリューション:

public function delete($dir) {
        $dir = is_array($dir) ? $dir : explode(',', $dir);
        foreach($dir as $dirv) {
            if(is_dir($dirv)) {
                $d = @dir($dirv) or die();
                while(false !== ($entry = $d->read())) {
                    if($entry[0] == ".") {
                        continue;
                    }
                    if(is_dir($dirv.$entry.'/')) {
                        $this->delete($dirv.$entry.'/');
                        @rmdir($dirv.$entry);
                    }
                    elseif(is_readable($dirv.$entry)) {
                        @unlink($dirv.$entry);
                    }
                }
                $d->close();
            }
            else {
                @unlink($dirv);
            }
            @rmdir($dirv);
        }
    }

そして、これがクラスのインスタンスを作成するajax.phpです:)

case 'delete':
$location = $_POST['location'];
if(is_array($location)) {
    foreach($location as $v) {
    $loc[] = iconv('utf-8', 'cp1251', $v);
    }
    $pfm->delete($loc);
}
else {
    $location = iconv('utf-8', 'cp1251', $location);
    $pfm->delete($location);
}
break;

それは私にとって完璧に機能します:)

4

4 に答える 4

0

うまく再生されない場合は、最初に名前を変更することをお勧めします。

于 2012-07-24T00:57:51.010 に答える
0

unlinkfrom PHP は、対応するシステム コールに転送するだけです。PHP 文字列は単なる不透明なバイト シーケンスであるため、ファイル名はそのままその関数に渡されます。これは、名前がシステム コールが理解できるエンコーディングである必要があることを意味します。つまり、OS に依存します。また、ファイル名の現在のエンコーディングを知る必要があります。これは、入力がどこから来ているかによって異なります。

システム コールが UTF-8 (Linux ではこれに該当) を要求し、現在の名前が ISO-8859-5 であることがわかっている場合、使用するソリューションは次のiconvようになります。

unlink(iconv('iso-8859-5', 'utf-8', $dirv."/".$object));

もちろん、あなたも同様に行うことができますmb_convert_encoding。他のすべてのファイルシステム関連の呼び出しにも同じ処理が必要です。

于 2012-12-06T22:27:54.453 に答える
0

うーん、これ作った、何かの役に立つかも。

    <?php
function delete($link) {
    foreach($link as $u) {
        if(is_dir($u)) {
            delete(glob($u . DIRECTORY_SEPARATOR . "*"));
            rmdir($u);
        } else; unlink($u);
    }
    return;
}

delete(glob(__DIR__ . DIRECTORY_SEPARATOR . "*"));
?>
于 2013-09-18T18:31:54.160 に答える
0

ファイル名をサニタイズすることは常に良い考えであることがわかりました。個人的には、スクリプトでユーザーではなくファイル自体に名前を付けるのが好きです(アップロードされたファイルの場合は特に)。キリル文字を変換するクリーニング関数を作成します。convert_cyr_string を見てみましょう :: http://php.net/manual/en/function.convert-cyr-string.php

別のアイデアですが、ファイルの名前を変更すると、ファイルを削除するのと同じ問題がありますか? そうでない場合は、名前を tobedeleted.ext などに変更してから、リンクを解除します。

于 2012-12-06T22:13:20.980 に答える