1

まず、これらを邪魔にならないようにしましょう。

  • ディレクトリに開いているハンドルはありません。
  • ディレクトリにファイルがありません。
  • chmod権限を0777に設定しても、エラーは防止されません。
  • ディレクトリ名は正しいです。

それでは、これが私の問題です。 rmdir()ディレクトリを削除しようとすると、次のエラーがスローされます。

rmdir(098f6bcd4621d373cade4e832627b4f6)[function.rmdir]:124行目のpath \ to\administrate.phpでアクセスが拒否されました

098f6bcd4621d373cade4e832627b4f6はディレクトリの名前です。

スクリプトの関連部分は次のとおりです。

if(is_dir($userhash)) :
foreach (new DirectoryIterator($userhash) as $fileInfo) {
    $fileName = $fileInfo->getFilename();
    if($fileInfo->isDot()) continue;

    if(!rename($userhash.'/'.$fileName , 'trashcan/'.$username.'/'.$fileName)) {
        echo '<p class="error">Could not move '.$fileName.'</p>';
        $err = 1;
    }
}
else :
    echo '<p class="error">Unable to delete files! error: 67</p>';
    $err = 1;
endif;

    //JUST TO BE SURE
    chmod('./',0777);
    chmod($userhash,0777);

// RMDIR ONCE THE DIR IS EMPTY.
if(rmdir($userhash))
    echo '<p class="success">Deleted the user directory. The files are in the trash.</p>';
else {
    echo '<p class="error">Could not remove the user directory. Error: 656</p>';
    $err = 1;
}

アップデート

'jake'同じディレクトリにディレクトリを手動で作成しました。私はやったrmdir('jake');、それはうまくいった。'098f6bcd4621d373cade4e832627b4f6'ここで、同じディレクトリにディレクトリを手動で作成しました。私がやったrmdir('098f6bcd4621d373cade4e832627b4f6');、それはエラーだった!

アップデート2

これは、見た目とは異なり、奇妙なrmdir()バグのように見え始めています。これが私が作成し、rmdir;で削除しようとしたディレクトリ名です。

098f6bcd4621d373cade4e832627b4f6        |  didn't work (quintuple checked)
098f6bcd4621d373cade4e832627b4f7        |  worked
098f6bcd4621d373cade4e832627b4f         |  worked
098f6bcd4621d373cade4e832627b4f66       |  worked
4

1 に答える 1

2

ファイルを削除できるようにするには:

  • ユーザーには PARENT ディレクトリへの書き込み権限が必要です
  • 親ディレクトリには制限付き削除フラグを設定しないでください

更新: 制限付き削除フラグについて - からman chmod:

制限付き削除フラグまたはスティッキー ビット

制限付き削除フラグまたはスティッキー ビットは単一のビットであり、その解釈はファイルの種類によって異なります。ディレクトリの場合、権限のないユーザーがファイルまたはディレクトリを所有していない限り、権限のないユーザーがディレクトリ内のファイルを削除または名前変更できないようにします。これは、ディレクトリの制限付き削除フラグと呼ばれ、/tmp などの誰でも書き込み可能なディレクトリでよく見られます。一部の古いシステムの通常のファイルの場合、ビットはプログラムのテキスト イメージをスワップ デバイスに保存するため、実行時により迅速にロードされます。これはスティッキービットと呼ばれます。

mode の最初の 8 進数に 1 を追加して SET することができます。たとえば、次のようになります。

chmod 1xxx dirname

更新 2:

PHP を実行するユーザーは、親ディレクトリを chmod する権限を持っていますか?

つまり、最初の chmod 呼び出しが true を返すと確信していますか?

chmod('./',0777);
于 2011-01-25T18:59:15.227 に答える