スレッド表示 | フラット表示〕 全トピック 920 件中 304 番目 次≫ ≪前

ディレクリ内のファイル検索?

created: 2005-12-12 09:25 | modified: 2005-12-14 10:26 | reply: 8

[2814] ディレクリ内のファイル検索?

user: ごまゴマ | created: 2005-12-12 09:25
こんにちは。
以下のようなことを実現したいのですが、PHPで実現することは可能なのでしょうか?

あるディレクトリ内には原則1つのファイルしかないものとして、
ディレクト内を検索して、ファイルが1つだけの場合は、
その存在するファイルのファイル名、ファイルサイズ、更新日時を取得する。
ディレクトリ内のファイルが2つ以上かファイルがない場合は、エラーメッセージを返すようにする。

このようなことをしたいのですが、どうすればいいのでしょうか?
(ファイル名などの取得はできたのですが、ディレクトリ内のファイルの有無を調べることってできるのでしょうか?)
reply: 2816 返信 編集 削除

[2816] Re: ディレクリ内のファイル検索?

user: ぱぴよん | created: 2005-12-12 11:25
ごまゴマさんこんにちは。


> (ファイル名などの取得はできたのですが、ディレクトリ内のファイルの有無を調べることってできるのでしょうか?)

どのようにしてファイル名などの取得に成功したのでしょうか。
また、ファイル名などとは「ファイル名、ファイルサイズ、更新日時」のことでしょうか。
Parent: 2814  reply: 2817 返信 編集 削除

[2817] Re: ディレクリ内のファイル検索?

user: ごまゴマ | created: 2005-12-12 11:51
すいません、勘違いしていました。(^^;
ディレクトリ内にファイルがあるかないか調べて、ファイルが1つだけ存在する場合は、そのファイル名を取得します。
箇条書きにしますと、

・ディレクト内にファイルがあるかないかを調べる
  ├ファイルがない場合:エラーを返す
  ├ファイルが1つだけ存在する場合:存在するファイル名、ファイルサイズ、更新日時を取得
  └ファイルが複数存在する場合:エラーを返す

ちなみにファイルサイズ、更新日時を取得するには、以下のような方法で取得することが可能でした。
-------------------------------------------------------------------------------
 $filename="a.txt";
$size = filesize("$filename"); //ファイルサイズ
$dttm = date('Y.m.d H:i:s', filemtime("$filename")); //ファイル更新日時
-------------------------------------------------------------------------------
Parent: 2816  reply: 2818 返信 編集 削除

[2818] ディレクトリ関数

user: ぱぴよん | created: 2005-12-12 12:41
ディレクトリ関数を利用することで特定のディレクトリ内の
ファイルを調べることが出来ます。
【ディレクトリ関数:http://jp.php.net/manual/ja/ref.dir.php

◆サンプル
  $dir = "ディレクトリ名";
if(file_exists($dir)) {
if(is_dir($dir)) {
$count = 0; // ファイル数
if($dh = opendir($dir)) {
while(($file = readdir($dh)) !== false) {
if(($file == ".") || ($file == "..")) continue;
count++;
if(count > 1) break;
$filename = $file; // ファイル名
$size = filesize($filename); //ファイルサイズ
$dttm = date('Y.m.d H:i:s', filemtime($filename)); //ファイル更新日時
}
closedir($dh);
// ファイルがないとき
if($count == 0) print "ファイルが1つも存在しません";
// ファイルが1つだけのとき
else if($count == 1) print "ファイル名:{$filename}<br>ファイルサイズ:{$size}<br>更新日時:{$dttm}";
// ファイルが2つ以上あるとき
else print "ファイルが複数存在します";
}
} else {
print "ディレクトリではありません";
}
} else {
print "ディレクトリが存在しません";
}
※もっといい方法があると思います。

もし、ファイルが特定の拡張子のみを指すのでしたら
if(! preg_match("/\.php$/i", $file)) continue;
という風にスキップする処理を追加すればいいです。
Parent: 2817  reply: 2819 2821 返信 編集 削除

[2819] globとか

user: ach | created: 2005-12-12 13:57
function checkdir($dir = ".", $pattern = "*")
{
if ($entry = glob($dir."/".$pattern)) return FALSE;
if (count($entry) != 1) retnru FALSE;
retrun is_file($entry[0]) ? array($entry[0], filesize($entry),filemtime($entry)) : FALSE;
}
FALSEの代わりにエラーメッセージを返し、メインプログラムis_array or is_stringを使った分岐を作るというのも手です。

とはいえ見た目をスマートにしただけで、パピヨンさんのスクリプトのほうが早い。
特にファイル数が多くなると顕著です。
Parent: 2818  返信 編集 削除

[2821] 訂正

user: ぱぴよん | created: 2005-12-12 19:10
変数$countの一部が「count」となっていました^^;
$countにしてください。


> count++;
$count++;

> if(count > 1) break;
if($count > 1) break;
Parent: 2818  reply: 2824 返信 編集 削除

[2824] ありがとうございます^^

user: ごまゴマ | created: 2005-12-13 18:03
ぱぴよんさん、arcさん、ありがとうございます。

ディレクトリ関数があるなんて知らなかったです。(^^;
この他にも方法もあるみたいですし、いろいろと試してみます。
とりあえず、ぱぴよんさんのコードをコピーして試してみたところ、ファイルサイズがうまく取得できずにエラーになってしまいました。
ここをコメントアウトすると動くみたいですので、動作環境が原因っぽいので調べている状態です。

参考になりました。
ありがとうございます。
Parent: 2821  reply: 2825 返信 編集 削除

[2825] Re: ありがとうございます^^

user: ぱぴよん | created: 2005-12-13 19:39
> とりあえず、ぱぴよんさんのコードをコピーして試してみたところ、ファイルサイズがうまく取得できずにエラーになってしまいました。

具体的にはどういったエラーでしょうか。

私もそのままコピペで試してみると
$size = filesize($filename);  //ファイルサイズ
$dttm = date('Y.m.d H:i:s', filemtime($filename)); //ファイル更新日時
上記の2行で
Parse error: syntax error, unexpected '@' in ファイル名 on line 行数
というエラーメッセージが表示されました。

これはコメント(//)の前に全角スペースが含まれていたせいでした^^;
半角スペース2個に置き換えれば動作しました。
Parent: 2824  reply: 2826 返信 編集 削除

[2826] Re: ありがとうございます^^

user: ごまゴマ | created: 2005-12-14 10:26
>Parse error: syntax error, unexpected '@' in ファイル名 on line 行数というエラーメッセージが表示されました。
まさに、このエラーです。
全角スペースを半角に置き換えましたら、うまくいきました。
あとWindowsの環境でやっていたので、

$size = filesize("$dir" . $filename); //ファイルサイズ
$dttm = date('Y.m.d H:i:s', filemtime("$dir" . $filename)); //ファイル更新日時

これで問題なく動きました。
ありがとうございます。
Parent: 2825  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 304 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑