人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

「PHP」で以下のロジックのプログラムを作ってもらいたいです。
「あるディレクトリ」下のファイルとディレクトリを再帰的にすべて見て行く。
「あるディレクトリ」以下のすべてのディレクトリ対して順番に「一覧ファイル(後述)」があるかどうか存在チェックする。
「一覧ファイル」既に存在するのであれば、何もせず次へ。
「一覧ファイル」がなければ、「一覧ファイル」を作る処理へ
「一覧ファイル」はテキストファイルで、中身はその「一覧ファイル」が存在するディレクトリと同じ場所にある「ファイルの一覧」と「ディレクトリの一覧」をそれぞれ記述する
リンクファイルは処理対象外。無限ループしないようにする。
OSはLinux。
実際のコードを書いてもらいたいのですが。

●質問者: redara
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● ktoshi
●150ポイント

function getDirectorys($dir)
{
if ($handle = opendir($dir)) {

$dirsArr = array();
$linksArr = array();
$filesArr = array();

while (false !== ($entry = readdir($handle))) {

if ($entry != "." && $entry != "..") {

if (is_dir($entry)) {
$dirsArr[] = $entry;
} else if (is_link($entry)) {
$linksArr[] = $entry;
} else {
$filesArr[] = $entry;
}
}
}

writeFileList($filesArr, $linksArr);

foreach($dirsArr as $nextDir) {
getDirectorys($nextDir);
}

closedir($handle);
}
}

function writeFileList($filesArr, $linksArr)
{
print_r($filesArr);
print_r($linksArr);
}

getDirectorys('.');


a-kuma3さんのコメント
つ [http://hatenadiary.g.hatena.ne.jp/keyword/%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E8%89%B2%E4%BB%98%E3%81%91%E3%81%97%E3%81%A6%E8%A8%98%E8%BF%B0%E3%81%99%E3%82%8B%EF%BC%88%E3%82%B7%E3%83%B3%E3%82%BF%E3%83%83%E3%82%AF%E3%82%B9%E3%83%BB%E3%83%8F%E3%82%A4%E3%83%A9%E3%82%A4%E3%83%88%EF%BC%89:title=ソースコードを色付けして記述する(シンタックス・ハイライト)]

2 ● a-kuma3
●150ポイント

お言葉に甘えて、コメント欄からやってきました。


ファイルの一覧をテキスト成形するようなイメージの php スクリプトだということで、
php には -r でコードを指定して、標準入力にファイル一覧を流し込むようにしてみました。

#! /usr/bin/sh

# 基準のディレクトリ
BASE_DIR=...

# 一覧ファイルのファイル名
LIST_FILE=list.txt


list_file () {
 ls | while read f
 do
 if [ ! -d $f ]
 then
 echo $f
 fi
 done
}

list_directory () {
 ls | while read f
 do
 if [ -d $f ]
 then
 echo $f
 fi
 done
}

make_list () {
 cd $1

  # ファイル
 list_file | php -r '
 // STDIN からファイル一覧を読み込んで加工するコード
 ' > ${LIST_FILE}

  # ディレクトリ
 list_directory | php -r '
 // STDIN からディレクトリ一覧を読み込んで加工するコード
 ' >> ${LIST_FILE}
  # ↑追加書き込み

 cd ${BASE_DIR}
}


dirs=`find ${BASE_DIR} -type d -print`

for d in ${dirs}
do
 if [ ! -r ${d}/${LIST_FILE} ]
 then
 make_list ${d}
 fi
done


ファイルとディレクトリを分けて一覧にする辺りは、シェルスクリプトの方が冗長ですね ><

加工の内容によっては、ls -l の出力を加工した方が良いのかな、

ls -l | php -r '...'

とか、ファイル一覧とディレクトリ一覧の加工方法が同じだったら、php の処理をサブルーチンにした方が良いのかな、

edit_list () {
 php -r '...'
}

list_file | edit_list > ${LIST_FILE}

list_directory | edit_list >> ${LIST_FILE}

とか、いろいろ考えちゃいます。

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ