暗幕と、緑文字。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告|
  3. トラックバック(-)|
  4. コメント(-)

File_Archiveパッケージ(3)

承前

●フィルタ系
ここまで書いてきたアーカイブ作成等を行う時、ある一定の条件をもったファイルだけを対象にするようなフィルタが使えます。
読み込み条件をFile_Archive::filterで括って指定していきます。

・正規表現によるフィルタ(predEreg及びpredEregi)

File_Archive::extract( File_Archive::filter( File_Archive::predEreg( "etc" ) , File_Archive::read('/tmp/test') ) , File_Archive::toArchive( '/tmp/sample.zip' , File_Archive::toFiles() ) );

例は/tmp/testの下にある「etc」という文字が入ったファイル又はディレクトリをアーカイブ対象とするものです。
「etc」という文字が入ったディレクトリがあった場合は、その下のファイル及びサブディレクトリ全てをアーカイブ対象とします。また、サブディレクトリのどこかに「etc」といったファイル又はディレクトリがあった場合、/tmp/test以下の「etc」までのサブディレクトリもそのまま作られます。(ただし、それぞれの同一階層にある他の余計なファイル等はアーカイブされません)
これまで説明したアーカイブの方法だと、/tmp/test/etc/~のようになっている場合、アーカイブファイル内にetc/というディレクトリを作ってその下の全てのファイルを入れたい時に対応できませんでしたが(やり方があるのかも知れないけど、見つけられなかった)この方法だと指定したディレクトリの最上位部分からアーカイブ出来ます。(もちろん同じファイル名やディレクトリ名が他の部分にもあれば、それも引っ張ってきてしまいますが)

predEregとpredEregiの違いは大文字小文字の区別の有無です。(要はereg関数とeregi関数に渡しているだけなので)
とりあえず問題なく使用できる正規表現は.,+,{n},^,(),[-],[^],|あたりの様です。$は何故かうまく動きませんでした。

用意されているものはeregとeregiだけで、マルチバイトのファイル名には対応できません。
一応、File/Archive.phpをオーバライドする形のArchiveEx.phpとMbEreg.php、MbEregi.phpを作成してみました。(わざわざのせるほど大したもんじゃないですが)
FC2はPHPのファイルやアーカイブファイルをアップロードできませんので、テキストファイルにして置いておきます。使う時は切り貼りしてください。

ArchiveEx_etc.txt

使用する際、当然require_onceするのはArchiveEx.phpになります。
File_ArchiveクラスがFile_Archive_Exクラスになりますので、File_Archive_Ex::extract等と記述する必要があります。
標準のpredEreg等にも(というかアーカイブ時全てに)言えることですが、samba等で共有して使用している分には正常に見えているファイル名も、アーカイブしてしまえばsambaによる変換が効かなくなるので、マルチバイトのファイル名は文字化けして表示されることと思います。・・・っていう事なんだよね?(Windowsで完結している場合には気にしなくて良い問題ですが)


・対象ファイルの最低サイズを指定(predMinSize)

File_Archive::extract( File_Archive::filter( File_Archive::predMinSize( 10 * 1024 ) , File_Archive::read('/tmp/test/') ) , File_Archive::toArchive( '/tmp/sample.zip' , File_Archive::toFiles() ) );

例は10KB以上のサイズのもののみをアーカイブするもの。
10*1024という書き方はマニュアルに従ったまでで、普通にバイト数を入れてもかまいません。(この記述の方がわかりやすいというお勧めなんでしょう)


・何階層までを圧縮対象にするか(predMaxDepth)

File_Archive::extract( File_Archive::filter( File_Archive::predMaxDepth( 1 ) , File_Archive::read('/tmp/test/') ) , File_Archive::toArchive( '/tmp/sample.zip' , File_Archive::toFiles() ) );

例は1階層目までをアーカイブするもの。(/tmp/test/の次のサブディレクトリまで)


・最終更新日を指定して、それ以降の日付のファイルを対象とする(predMinTime)

File_Archive::extract( File_Archive::filter( File_Archive::predMinTime( mktime( 0,0,0,8,10,2007 ) ), File_Archive::read('/tmp/test/') ) , File_Archive::toArchive( '/tmp/sample.zip' , File_Archive::toFiles() ) );

例は、2007/8/10 0:00:00以降に更新されたファイルをアーカイブするもの。
※与える日付はmktime等でUNIXタイムスタンプにすること。


・拡張子による指定(predExtension)

File_Archive::extract( File_Archive::filter( File_Archive::predExtension( array('txt' , 'tgz') ) , File_Archive::read('/tmp/test/') ) , File_Archive::toArchive( '/tmp/sample.zip' , File_Archive::toFiles() ) );

例は、拡張子がtxtのものとtgzのもののみをアーカイブするもの。


・フィルタ条件の論理演算(predAnd,predOr,predNot,predTrue,predFalse)

File_Archive::extract( File_Archive::filter( File_Archive::predAnd( File_Archive::predMaxDepth( 1 ) , File_Archive::predMinTime( mktime( 0,0,0,8,10,2007 ) ) ), File_Archive::read('/tmp/test/') ) , File_Archive::toArchive( '/tmp/sample.zip' , File_Archive::toFiles() ) );

例はpredAndAndを使用したもの。predMaxDepthとpredMinTimeの例で説明した条件を共に満たすファイルがアーカイブ対象になります。
因みにFile_Archive::predNot( File_Archive::predMinTime(?) )とすれば?以前に更新のあったファイルを抽出するようになりますし、同じくpredMinSizeを囲んでやれば、指定したファイルサイズ以下のものを抽出するようになります。
TrueとFalseは常に真と偽を返すメソッドになります。引数は必要ありません。(イマイチ使いどころがわかりませんけど)


●削除系
既に作成したアーカイブファイルから、ファイルを削除する機能です。

・フィルタを使っての削除

File_Archive::remove( File_Archive::predEreg( 'NEWetc.txt' ) , '/tmp/sample.zip' );
File_Archive::remove( File_Archive::predExtension( 'txt' ) , '/tmp/sample.zip' );

最初の例は、アーカイブファイル内のNEWetc.txtに該当するファイル名を持つファイルの削除。
二例目は、アーカイブファイル内の拡張子txtのファイルを削除します。


・フィルタを使っての削除(インスタンス化時)

$source = File_Archive::read( '/tmp/sample.zip/' );
File_Archive::removeFromSource( File_Archive::predTrue() , $source );

例は、アーカイブファイル内の全ファイルを削除します。


・同一階層で重複しているファイルを削除する

File_Archive::removeDuplicates( '/tmp/sample.zip' );

同じアーカイブファイルにファイルの追記を行っていくと、同じ階層に同じファイル名を持ったファイルが複数存在する状態になる事があります。
そのような場合このメソッドを使用すると、最新の更新日付のファイルだけが残され、他の同名ファイルは削除されます。


・同一階層で重複しているファイルを削除する(インスタンス化時)

$source = File_Archive::read( '/tmp/sample.zip/' );
File_Archive::removeDuplicatesFromSource( $source );

結果は上と同じです。


かなりメチャクチャな順番での機能メモとなってしまいましたが、基本的にマニュアルを見ながら書いていったためです。ご容赦下さい。
ちなみにメールを送ったりする機能やCache_Liteの使用が可能だったりするようですが、あまり興味がない機能のため触りませんでした。

多分、おしまい。
スポンサーサイト
  1. 2007/08/13(月) 23:51:17|
  2. 有閑ダンディのPHPツール|
  3. トラックバック:0|
  4. コメント:0

File_Archiveパッケージ(2)

承前

●展開(解凍)系
・単純な展開

File_Archive::extract( $src = '/tmp/sample.zip/' , $dest = '/tmp/kaitou/' );

/tmp/sample.zipを/tmp/kaitou/に展開。展開先のディレクトリは予め作っておく必要があります。
※アーカイブファイルの指定時、最後に/を付けないとファイルコピー(例の場合だと/tmp/kaitou/にsample.zipがコピーされる)になってしまうため注意。


・アーカイブファイルからファイルを一つ取り出す

File_Archive::extract( $src = '/tmp/sample.zip/netatalk' , File_Archive::toFiles('/home/') );

/tmp/sample.zipにアーカイブされているnetatalkというファイルを/home/に展開します。

$src = array('/tmp/sample.zip/netatalk' , '/tmp/sample.zip/ssh' )
等として、複数同時に取り出すことも可能。

以上、静的メソッドのためインスタンス化しないで利用できます。

以下、インスタンス化したときに利用できるメソッドの使い方。

●Read系メソッド

先ずはインスタンス化。(/tmp/sample.zipを読み込み)
$source = File_Archive::read( '/tmp/sample.zip/' );

オブジェクトに対して各メソッドを発行する前の状態に戻す(next等で移動している場合の初期化)
$source->close();

ポインタがアーカイブファイル自身を指している時(?要はclose()メソッド発行後next()等をしていない状態。因みに最後のファイルを読み終わった段階でnext()を発行するとまたアーカイブファイル自身に戻ってくる)戻り値としてファイル名を返す。
$source->getDataFilename()

次のファイルの取得(最初の発行前はアーカイブファイル自身を指している)フォルダの下にあるファイルも自動で取得。ただしアーカイブファイルの中のアーカイブファイルは取得しない(完全に無視)次のファイルが無い場合は戻り値として'false'を返す。
$source->next()

戻り値として現在のファイル名を返す。
$source->getFilename()

現在のファイルにPHP標準のstat関数を発行。戻り値は(連想)配列。sizeはファイルサイズ、mtimeは最終更新日(UNIXタイムスタンプ)等々。
$source->getStat()

現在のファイルから引数バイト数のデータを読んで戻り値として返す。
$source->getData( バイト数指定 )

現在のファイルのファイルポインタを引数バイト数分スキップ(指定した引数を戻り値に返す)
$source->skip( バイト数指定 )


●ファイルコピー系
・サブディレクトリを含めるコピー

File_Archive::extract( $src = '/etc/init.d/' , $dest = '/tmp/copy/' );

/etc/init.d/の下を/tmp/copy/にコピー。
※コピー先ディレクトリが無い場合はコピーしません。


File_Archive::extract( File_Archive::read( '/etc/init.d/' , '/tmp/tmp/' ) , File_Archive::toFiles() );

こっちだと、コピー先ディレクトリが無い場合もディレクトリを作成してコピーします。
※Windows版だと1回でディレクトリ作成・コピーできますが、なぜかLinux版だと一回目ではディレクトリ作成しかしないです。


・標準出力への受け渡し

File_Archive::extract( $src = './test.html' , File_Archive::toOutput() );

ココまではFile_Archive::toFilesを使って、指定先にファイルを作成するやり方でしたが、File_Archive::toOutputを使用すれば結果を標準出力に渡すことが出来ます。
ブラウザでの実行時はファイルの保存ダイアログが開くことになるので、例の様にやればHTMLファイル等も簡単にダウンロードさせることが可能です。もちろん作成したアーカイブファイルを渡すことも可能ですので、例えばリスト状のHTMLでユーザの好きなファイルを選択させ、それをzip等で固めてダウンロードさせるといったことが容易に行えます。


[07/8/13追記]
続きを書きました。(8/13のエントリー)
  1. 2007/08/11(土) 19:22:56|
  2. 有閑ダンディのPHPツール|
  3. トラックバック:0|
  4. コメント:0

File_Archiveパッケージ(1)

先日(8/6のエントリー)インストールしたPHP PEARのFile_Archiveパッケージのマニュアル。

●File_Archive
http://poocl.la-grotte.org/index.php

絶望した。自分が英語が読めないという事実より、新しい技術情報は英語でしか書かれていないという英語偏重社会の現実に絶望した。

個人的進路絶望調査。
1.ブラッド・ピット
2.アントニオ・バンデラス
3.ショーン・コネリー
・・・絶望した(T△T)

閑話休題。


以下、File_Archiveパッケージの使い方(アーカイブファイル作成系)

当たり前ですが、先ずはrequire_onceが必要。
require_once('File/Archive.php');

●アーカイブ系
・単純なアーカイブ(アーカイブファイルは新規作成又は上書き)

File_Archive::extract( File_Archive::read('/etc/init.d/') , File_Archive::toArchive( '/tmp/sample.zip' , File_Archive::toFiles()) );
File_Archive::extract( $src = '/etc/init.d/' , File_Archive::toArchive( '/tmp/sample.zip' , File_Archive::toFiles()) );
File_Archive::extract( $src = '/etc/init.d/' , File_Archive::toArchive( 'sample.zip' , File_Archive::toFiles('/tmp/')) );

3例とも同じ結果。例では/etc/init.d/の内容を/tmp/sample.zipに保存します。
※因みに読み込み元(例では/etc/init.d/)の最後の/はあっても無くても良いです。


・既にあるアーカイブファイルに追記(追記先アーカイブファイルが無い場合は新規作成)

File_Archive::extract( $src = "/etc/rc2.d/" , $dest = "/tmp/sample.zip" );

例では/tmp/sample.zipに/etc/rc2.d/の内容を追記します。


・アーカイブ形式の変更

File_Archive::extract( $src = '/tmp/sample.zip/' , File_Archive::toArchive( '/tmp/sample.tgz' , File_Archive::toFiles()) );

例では/tmp/sample.zipを/tmp/sample.tgzにアーカイブし直します。(zipファイルも残ります)
※$src側の最後の/が無いとzipがtzgでアーカイブされる(tzgファイルの中にzipファイルがある状態)ので注意。


・同時に複数の保存先を利用する

File_Archive::extract( $src = '/etc/init.d/' , File_Archive::toArchive( 'sample.zip' , File_Archive::toMulti( File_Archive::toFiles('/tmp/') , File_Archive::toOutput() ) ) );
File_Archive::extract( $src = '/etc/init.d/' , File_Archive::toArchive( 'sample.zip' , File_Archive::toMulti( File_Archive::toFiles('/tmp/') , File_Archive::toFiles('/home/') ) ) );
File_Archive::extract( $src = '/etc/init.d/' , File_Archive::toArchive( 'sample.zip' , File_Archive::toMulti( File_Archive::toFiles('/tmp/') , File_Archive::toMulti( File_Archive::toFiles('/home/') , File_Archive::toOutput() ) ) ) );

1例目は/etc/init.d/の内容を/tmp/sample.zipと標準出力に保存。
2例目は/etc/init.d/の内容を/tmp/sample.zipと/home/sample.zipに保存。
3例目はFile_Archive::toMultiを入れ子にすることで、/etc/init.d/の内容を/tmp/sample.zipと/home/sample.zipと標準出力に保存。
※File_Archive::toOutput()が標準出力指定で、コンソールで実行したならコンソールに表示され、ブラウザで実行したならファイルの保存ダイアログが出てきます。

こういった書き方も出来るって書いてあるんですが動きません。絶望した。
File_Archive::extract( $src = '/etc/init.d/' , File_Archive::toArchive( 'sample.zip' , $dest = array( File_Archive::toFiles('/tmp/') , File_Archive::toFiles('/home/') ) ) );


・複数ディレクトリ(ファイル)を纏めてアーカイブ

File_Archive::extract( File_Archive::readMulti( array( File_Archive::read('/etc/init.d/') ,File_Archive::read('/etc/rc2.d/') ) ) , File_Archive::toArchive( '/tmp/sample.zip' , File_Archive::toFiles()) );

$src[] = '/etc/init.d/';
$src[] = '/etc/rc2.d/';
File_Archive::extract( $src , File_Archive::toArchive( '/tmp/sample.zip' , File_Archive::toFiles()) );

File_Archive::extract( $src = array( '/etc/init.d/' , '/etc/rc2.d/' ) , File_Archive::toArchive( '/tmp/sample.zip' , File_Archive::toFiles()) );

3例とも同じ結果。例では/etc/init.d/と/etc/rc2.d/の内容を/tmp/sample.zipに保存します。


なお、File_Archive::toArchiveの第3オペランドでアーカイブ形式を明示的に指定する(Tar、Gzip、Zip)ことが可能ですが、省略時は第1オペランドのアーカイブファイル名の拡張子を見て勝手に判断してくれます。


以上、静的メソッドのためインスタンス化しないで利用できます。

以下、インスタンス化したときに利用できるメソッドの使い方。

●Write系メソッド

先ずはインスタンス化。(/tmp/sample.zipを作成)
$dest = File_Archive::toArchive( '/tmp/sample.zip' , File_Archive::toFiles() );

作成した/tmp/sample.zipにsampleple/dummy.txtを追加。(ディレクトリも自動で作成します)
$dest->newFile( 'sampleple/dummy.txt' );

追加したsampleple/dummy.txtに文字列hogehogeを書込。
$dest->writeData("hogehoge");

sampleple/dummy.txtをクローズ。
$dest->close();

他にもあるのかも知れませんが、マニュアルに書いてないので不明。
元ファイルを見る限りはこれだけっぽかったけど。

[07/8/11追記]
続きを書きました。(8/11のエントリー)
  1. 2007/08/09(木) 00:14:45|
  2. 有閑ダンディのPHPツール|
  3. トラックバック:0|
  4. コメント:0

foldersearch_showimg.php

◎foldersearch_showimg.php(Folder search下フレーム画像表示用スクリプト)

##### このスクリプトの簡単な説明 #####

初めはfoldersearch_search.phpで生成したリンクから呼び出され、GETデータを取得。指定された画像ファイルを表示します。以降は現在表示している画像ファイルの前後をリンクとして表示し、自分自身を呼び出します。
画像ファイルがApacheのDocumentRootの下に無い場合は、Apache上で公開するためにhttpd.conf等でAliasをきっておく必要があります。(要はDocumentRootをもう一つ作るようなイメージですが)

Debian GNU/Linux 3.1(Sarge)のApache2だと、/etc/apache2/sites-available/defaultに
Alias /Alias名/ /実際のディレクトリ名/
<Directory "/実際のディレクトリ名/">
 Options MultiViews
 AllowOverride None
 Order allow,deny
 allow from 許可するIPアドレス
</Directory>
こんな感じ?

また、画像ファイルのサイズ(ピクセル数)を取得するためにGDライブラリを使用しています。
インストール方法はPHPのお勉強の鏡(カガミ)を参照。

画像の大きさを調整がチェックしてある際は、画像の大きさを調整して表示します(ただし検索ボタン押下時の設定を引き継いでいるため、このスクリプトが呼び出されてからチェックを入れたり外したりしても効果はありません)が、画像表示領域のサイズは自動検出ではなくて決め打ちのため、自分のブラウザに合わせた設定が必要です。(複数クライアントの時はif文などで振り分けが必要です)


##### このスクリプト解説 #####

-----/DocumentRoot/foldersearch/foldersearch_showimg.php ココカラ-----
001:<?php
002: require_once('../php/buhin/MyPrn.class.php');
003: $print_area = new MyPrn();
004:
005: if ( $_ENV['OS'] == 'Windows_NT' ) {
006:  $path_convert = 'print_area';
007: } else {
008:  require_once('../php/buhin/MyPrn.class.php' );
009:  $print_area_u8 = new MyPrn('UTF-8');
010:  $path_convert = 'print_area_u8';
011: }
012:
013: $print_area->start_html();
014:
015: if ( !( $F_H_C = @fopen("//".$_SERVER['REMOTE_ADDR']."/c\$/foldersearch_user_color.ini" , "r") ) ) {
016:  $F_H_C = @fopen("foldersearch_default_color.ini" , "r");
017:  if (!$F_H_C) {
018:   exit($print_area->conv("♪あべんど♪カラー設定ファイルが見つかりません。"));
019:  }
020: }
021:
022: while ( $readline = fgets($F_H_C) ) {
023:  $readline = str_replace("\n" , "" , $readline);
024:  $readline = str_replace("\r" , "" , $readline);
025:  $readline = explode( "," , $readline);
026:  $h_color_data[$readline[0]] = $readline[1];
027: }
028: fclose($F_H_C);
029:
030: print("<body text=\"$h_color_data[body_text]\" bgcolor=\"$h_color_data[body_bgcolor]\" link=\"$h_color_data[link_color]\" vlink=\"$h_color_data[vlink_color]\">\n");
031:
032: $c_now_file_path = stripslashes(rawurldecode($_GET[filepath]));
033: $c_now_file_path = $$path_convert->conv($c_now_file_path);
034:
035: $i_img_adjustment = $_GET[adjust];
036:
037: $c_now_dir_name = dirname($c_now_file_path);
038:
039: ereg( "/([^/]+)$" , $c_now_file_path , $c_now_file_name );
040: $c_now_file_name = $c_now_file_name[1];
041:
042: $print_area->prn_brcr($c_now_file_path);
043:
044: $a_now_file_info = getimagesize($c_now_file_path);
045:
046: $print_area->prn_brcr( 'width:' . $a_now_file_info[0] . 'pixel' . ' height:' . $a_now_file_info[1] . 'pixel' . ' File size:' . filesize($c_now_file_path) . 'byte' );
047:
048: $h_dir_handle = opendir($c_now_dir_name);
049:
050: $i_search_flg = 0;
051: $c_prev_path_name = NULL;
052:
053: while ( $c_path_name = readdir($h_dir_handle) ) {
054:
055:  if ( ( $c_path_name == '.' ) or ( $c_path_name == '..' ) ) { continue; }
056:
057:  if ( is_dir ( $c_now_dir_name . $c_path_name ) ) {
058:   continue;
059:  } else {
060:   if ( mb_eregi( "(jpg|jpeg|gif|png|bmp)$" , $c_path_name ) ) {
061:    if ( $i_search_flg == 1 ) {
062:     $i_search_flg = 2;
063:     break;
064:    }
065:    if ( $c_now_file_name == $c_path_name ) {
066:     $i_search_flg = 1;
067:    } else {
068:     $c_prev_path_name = $c_path_name;
069:    }
070:   }
071:  }
072: }
073:
074: if ( $c_prev_path_name ) {
075:  $print_area->prn( ' ' . '<A href="foldersearch_showimg.php?filepath=' . rawurlencode( $c_now_dir_name . '/' . $c_prev_path_name ) . '&adjust=' . $i_img_adjustment . '"><<</A>' );
076: } else {
077:  $print_area->prn( 'TOP' );
078: }
079: if ( $i_search_flg == 2 ) {
080:  $print_area->prn_brcr( '<A href="foldersearch_showimg.php?filepath=' . rawurlencode( $c_now_dir_name . '/' . $c_path_name ) . '&adjust=' . $i_img_adjustment . '">>></A>' );
081: } else {
082:  $print_area->prn_brcr( 'END' );
083: }
084:
085: $c_now_file_path = str_replace("/実際のディレクトリ名/" , "/Alias名/" , $c_now_file_path);
086: $c_now_file_path = str_replace( "%2F" , "/" , rawurlencode($c_now_file_path) );
087:
088: if ( $i_img_adjustment == 1 ) {
089:  $i_blowser_heigth = 850;
090:  $i_blowser_width = 1100;
091:  $i_heigth_per = $i_blowser_heigth / $a_now_file_info[1];
092:  $i_width_per = $i_blowser_width / $a_now_file_info[0];
093:
094:  if ( ( $i_heigth_per > 1 ) && ( $i_width_per > 1 ) ) {
095:   $print_area->prn_brcr( '<IMG src="' . $c_now_file_path . '" alt=""></td></tr>');
096:  } elseif ( $i_heigth_per > $i_width_per ) {
097:   $print_area->prn_brcr( '<IMG src="' . $c_now_file_path . '" alt="" height="' . $a_now_file_info[1] * $i_width_per . '" width="' . $a_now_file_info[0] * $i_width_per .'"></td></tr>');
098:  } else {
099:   $print_area->prn_brcr( '<IMG src="' . $c_now_file_path . '" alt="" height="' . $a_now_file_info[1] * $i_heigth_per . '" width="' . $a_now_file_info[0] * $i_heigth_per .'"></td></tr>');
100:  }
101: } else {
102:  $print_area->prn_brcr( '<IMG src="' . $c_now_file_path . '" alt=""></td></tr>');
103: }
104:
105: $print_area->end_html();
106:?>
-----/DocumentRoot/foldersearch/foldersearch_showimg.php ココマデ-----

32~33行目表示するファイルパスをGETデータから取得。

35行目画像の大きさを調整するか否かをGETデータから取得。

37行目ファイルパスからディレクトリ部分を抜き出す。

39~40行目ファイルパスからファイル名を抜き出す。(basename関数はファイル名が全角に対応していないみたいです)
使用するのがmb_ereg関数だとうまくいかない場合があるのでeregにしました。

42行目ファイルのフルパスを表示(画面表示一行目)

44行目GDライブラリを使用して画像のサイズ(ピクセル)を取得。

46行目ピクセル数(横×縦)、ファイル容量(バイト)を表示(画面表示二行目)

48行目表示する画像ファイルの前後を取得してリンクを生成するためにディレクトリハンドラをオープン。

50~51行目フラグ及び、現在表示しているファイルの一つの前のファイル名を保持する領域を初期化
 ※53~72行目のwhileループを抜けた際の状態
  $c_prev_path_name = NULL : 今回のファイルが最初の画像ファイルである。
  $i_search_flg = 1 : 今回のファイルが最後の画像ファイルである。
  $i_search_flg = 2 : 次の画像ファイルがある。

74~78行目現在表示している画像ファイルが最初の画像ファイルで無い場合、前の画像ファイルを呼び出すリンク(<<)を表示。最初の画像ファイルの場合は'TOP'と表示

79~83行目現在表示している画像ファイルが最後の画像ファイルで無い場合、次の画像ファイルを呼び出すリンク(>>)を表示。最後の画像ファイルの場合は'END'と表示

85~86行目簡単な説明で書いたとおり、パスをAlias名に置換します。

88~103行目画像の表示。画像の大きさを調整するする場合は、89~90行で指定したサイズに収まるように計算して表示します。(縦横の比率は崩さない)
  1. 2007/06/28(木) 23:02:13|
  2. 有閑ダンディのPHPツール|
  3. トラックバック:0|
  4. コメント:0

foldersearch_search.php

◎foldersearch_search.php(Folder search下フレーム検索結果表示用スクリプト)

##### このスクリプトの簡単な説明 #####

foldersearch_makelist.phpで作成しておいたsearch_folder.txtを読み込んで、検索対象となるディレクトリ(直下に画像ファイルがあるもののみ)を抽出し、テーブルにして表示します。
表示欄のリンク'>>'をクリックすることでfoldersearch_showimg.phpを呼び出すと、そのディレクトリの一番最初の画像ファイルを表示します。
※画像を表示するためには、画像が保存してあるディレクトリがApacheで公開されていなければいけません。(詳しくはfoldersearch_showimg.phpの説明を参照)


##### このスクリプト解説 #####

-----/DocumentRoot/foldersearch/foldersearch_search.php ココカラ-----
001:<?php
002: require_once('../php/buhin/MyPrn.class.php');
003: $print_area = new MyPrn();
004:
005: if ( $_ENV['OS'] == 'Windows_NT' ) {
006:  $path_convert = 'print_area';
007: } else {
008:  require_once('../php/buhin/MyPrn.class.php' );
009:  $print_area_u8 = new MyPrn('UTF-8');
010:  $path_convert = 'print_area_u8';
011: }
012:
013: $c_search_folder_file_path = "./search_folder.txt";
014:
015: $print_area->start_html();
016:
017: if ( !( $F_H_C = @fopen("//".$_SERVER['REMOTE_ADDR']."/c¥$/foldersearch_user_color.ini" , "r") ) ) {
018:  $F_H_C = @fopen("foldersearch_default_color.ini" , "r");
019:  if (!$F_H_C) {
020:   exit($print_area->conv("♪あべんど♪カラー設定ファイルが見つかりません。"));
021:  }
022: }
023:
024: while ( $readline = fgets($F_H_C) ) {
025:  $readline = str_replace("¥n" , "" , $readline);
026:  $readline = str_replace("¥r" , "" , $readline);
027:  $readline = explode( "," , $readline);
028:  $h_color_data[$readline[0]] = $readline[1];
029: }
030: fclose($F_H_C);
031:
032: print("<body text=¥"$h_color_data[body_text]¥" bgcolor=¥"$h_color_data[body_bgcolor]¥" link=¥"$h_color_data[link_color]¥" vlink=¥"$h_color_data[vlink_color]¥">¥n");
033:
034: if ( !( $_POST[fm_s_search_start] ) ) {
035:  $print_area->end_html();
036:  exit;
037: }
038:
039: if ( $_POST[fm_c_search_foldername] == NULL ) {
040:  $print_area->prn_brcr('検索条件を入力してください');
041:  $print_area->end_html();
042:  exit;
043: }
044:
045: if ( $_POST[fm_b_img_adjustment] ) {
046:  $i_img_adjustment = 1;
047: } else {
048:  $i_img_adjustment = 0;
049: }
050:
051: if ( $_POST[fm_b_check_test] ) {
052:  $print_area->prnr($_POST);
053:  $print_area->end_html();
054:  exit;
055: }
056:
057: $a_search_folder_list = file( $print_area->conv($c_search_folder_file_path) );
058:
059: $c_search_char = $print_area->conv( $_POST[fm_c_search_foldername] , $print_area->get_cs() );
060:
061: $print_area->prn_cr('<table border="2">');
062: $print_area->prn_cr(' <tr><th>フォルダ名</th><th>ファイル数</th><th>ファイルサイズ</th><th>表示</th></tr>');
063:
064: if ( $_POST[fm_b_cache_clear] ) {
065:  clearstatcache();
066: }
067:
068: reset($a_search_folder_list);
069: while ( list( $key , $c_search_folder_list_line ) = each($a_search_folder_list) ) {
070:
071:  if ( mb_eregi( $c_search_char , $print_area->conv($c_search_folder_list_line , $$path_convert->get_cs() ) ) ) {
072:   $c_search_folder_list_line = str_replace("¥n" , "" , $c_search_folder_list_line);
073:   $c_search_folder_list_line = str_replace("¥r" , "" , $c_search_folder_list_line);
074:
075:   $h_dir_handle = opendir($c_search_folder_list_line);
076:
077:   $i_dir_size = 0;
078:   $i_dir_file_count = 0;
079:   $c_first_file_name = NULL;
080:
081:   while ( $c_path_name = readdir($h_dir_handle) ) {
082: 
083:    if ( ( $c_path_name == '.' ) or ( $c_path_name == '..' ) ) { continue; }
084:
085:    if ( is_dir ( $c_search_folder_list_line . $c_path_name ) ) {
086:     continue;
087:    } else {
088:     if ( mb_eregi( "(jpg|jpeg|gif|png|bmp)$" , $c_path_name ) ) {
089:      $i_dir_size = $i_dir_size + filesize( $c_search_folder_list_line . $c_path_name );
090:      $i_dir_file_count++;
091:      if ( !($c_first_file_name) ) {
092:       $c_first_file_name = $c_search_folder_list_line . $c_path_name;
093:      }
094:     }
095:    }
096:   }
097:   if ( $i_dir_file_count == 0 ) { continue; }
098:
099:   $print_area->prn_cr( ' <tr><td>' . $c_search_folder_list_line . '</td><td align="right">' . $i_dir_file_count . '</td><td align="right">' . $i_dir_size . '</td><td align="center"><A href="foldersearch_showimg.php?filepath=' . rawurlencode($c_first_file_name) . '&adjust=' . $i_img_adjustment . '">>></A></td></tr>' , $$path_convert->get_cs() );
100:  }
101: }
102: $print_area->prn_cr('</table>');
103: $print_area->end_html();
104:?>
-----/DocumentRoot/foldersearch/foldersearch_search.php ココマデ-----

34~37行目POSTデータとしてfm_s_search_start(検索開始)が渡されていない時は、foldersearch_index.phpから呼び出されたと思われるため、HTML終了タグを書き出して終了。

39~43行目fm_c_search_foldername(検索対象文字列)がNULLの時は検索を行わず、エラーを表示して終了。(全件表示は'.'を指定)

45~49行目fm_b_img_adjustment(画像の大きさを調整)にチェックが入っているかどうかを、99行目でGETデータとしてfoldersearch_showimg.phpに送るため評価しておく。(チェック時'1'、非チェック時'0')

51~55行目fm_b_check_test(ちぇっく?)にチェックが入っているときはPOSTデータを表示して終了(デバッグ用ルーチン)

57行目foldersearch_makelist.phpで作成しておいたsearch_folder.txtを配列$a_search_folder_listに読み込んで、それが終了するまで69~101行目を繰り返す。

61~62行目テーブルタグの開始

64~66行目fm_b_cache_clear(clearstatcache?)にチェックが入っていた時、ファイルキャッシュをクリアする。

69~101行目$a_search_folder_listが終わるまで以下を繰り返す。

71行目ディレクトリパスが検索対象文字列を含んでいた場合、75行目でディレクトリハンドラをオープンする。

77~79行目ディレクトリに含まれる画像ファイルの総サイズ、ファイル数、最初のファイル名をクリア

81~96行目ディレクトリ直下の画像ファイル(対象は拡張子がjpg,jpeg,gif,png,bmpのもの。大文字小文字関係なし)の総サイズ、ファイル数、最初のファイル名(フルパス)を取得。

97行目対象ディレクトリの直下に画像ファイルが無かった場合は、次のディレクトリの検索(69行目からのループ)に戻る。

99行目対象ディレクトリの直下に画像ファイルがあった場合はテーブルの1ラインとして、ディレクトリパス名、ファイル数、総ファイルサイズ、最初の画像ファイルへのリンク(URLエンコードをする)を表示。

102~103行目テーブルタグを閉じて終了
  1. 2007/06/26(火) 21:36:28|
  2. 有閑ダンディのPHPツール|
  3. トラックバック:0|
  4. コメント:0
次のページ

如月

08 | 2017/09 | 10
Sun Mon Tue Wed Thu Fri Sat
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Recent Entries

Recent Comments

Recent Trackbacks

Archives

Category

なか~ま(´ー`)人(´¬`)

Search

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。