質問

フォルダー内のフォルダーのみをリストするスクリプトを作成しようとしています。問題は、フォルダー内にフォルダーを作成できるユーザーがいるので、基本的に私がやろうとしていることは、ユーザーがフォルダーを管理してファイルを保存する方法を持つことです...私の問題は、PHPを作成したいということです。 「ルートフォルダーはホームディレクトリであり、ホームディレクトリよりも上に行くことができないと考えてください。現在、私のPHP関数はそれを行いません、それはディレクトリのコンテンツのみを表示します...そして、ユーザーが1つのレベルを上げて、再び1つのレベルアップ...など....彼はハード全体を閲覧することができましたドライブ。

function directoryList($path) {
    $dirStruct = array();
    if(is_dir($path)) {
        $handle = opendir($path);
        while(($file = readdir($handle)) !== false) {
            if(@opendir($path.$file)) {
                chdir($path.$file);
                $absolutepath = getcwd();
                $dirStruct[] = array('path' => $absolutepath.'\\', 'name'=>$file);
            }
        }
    }
    return $dirStruct;
}
役に立ちましたか?

解決

ユーザーに絶対パスを与える代わりに、特定のベースパスに関連するパスを指定できるようにします。次に、相対パスの「/../」を削除する関数を書きます。ユーザーがサーバーにリンクを作成できない限り...)。

あなたが良くなりたい場合は、その前の要素と「..」を一致させることができます(したがって、「a /../ b」は「b」になります。 「..」の前にパス要素がない場合。

他のヒント

これが拡張するための少しのものです:

function listFolders($folderPath, $homeFolder)
{
    $folderPath = realpath($folderPath);
    $homeFolder = realpath($homeFolder);
    if(strpos($folderPath, $homeFolder) === 0) {
        return glob("$folderPath/*", GLOB_ONLYDIR);
    }
}

$dirs = listFolders('/home/gordon/code/php', '/home/gordon');
print_r($dirs);

にとって $folderPath ディレクトリをリストするフォルダーを渡します。にとって $homeFolder 最も多くのフォルダーになりたいフォルダーを渡します。に realpath両方のパスを使用すると、それらが絶対的なパスに解決されることを確認します。場合 $folderPath 下にあります $homeFolder, 、 そうして $folderPath 文字列は始まり、全体が含まれます $homeFolder ストリング。この場合、私たちだけです glob のすべてのディレクトリ $folderPath アレイに絶対的なパスを返します。


の相対パスを取得するため $folderPath から $homeFolder, 、ただしてください

ltrim(str_replace('/home/gordon/', './', '/home/gordon/code/php/'), '/');

それが戻ってきます ./code/php/.


OOPでこれをやりたい場合は、に興味があるかもしれません SPL Directoryiterator.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top