0

フォルダ内のフォルダのみを一覧表示するスクリプトを作成しようとしています。私にはフォルダ内にフォルダを作成できるユーザーがいるので、基本的に私がやろうとしているのは、ユーザーがフォルダを管理してファイルを保存する方法を用意することです...私の問題は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;
}
4

2 に答える 2

2

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

素敵になりたい場合は、「..」をその前の要素と一致させるか(つまり、「a /../ b」は「b」になります。つまり、「..」は「a」を削除します)、無視します。その前にパス要素がない場合は「..」。

于 2010-06-28T15:59:13.953 に答える
0

ここに拡張する少しの何かがあります:

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でこれを実行したい場合は、SPLDirectoryIteratorに興味があるかもしれませ

于 2010-06-30T23:36:09.407 に答える