ファイルアップローダ+複数のディレクトリを削除するシステムについて
- 複数のディレクトリを削除するシステム構築の際、うまくいかない問題が発生しました。
- フォルダ構成やプログラムの処理内容に関して説明しています。
- 解決方法がわからない場合は、教えていただけると助かります。
- ベストアンサー
ファイルアップローダ+複数のディレクトリを削除するシステムについて
以下のようなフォルダ構成で、複数のディレクトリを削除するシステムを構築しよと しましたが、1ディレクトリのみしか削除できませんでした。 20090601 - xxx1.txt yyy1.txt zzz1.txt のフォルダ20090601と、ファイルxxx1.txt,yyy1.txt,zzz1.txt のみしか削除できませんでした。理想は、すべてのディレクトリ、ファイルを削除しようと、試行錯誤 しましたが、なかなかうまくいきません。 わかる人がいたら、ご教授のほどよろしくお願いします。 ============フォルダ構成==================================== 20090601 - xxx1.txt yyy1.txt zzz1.txt 20090602 - xxx2.txt yyy2.txt zzz2.txt 20090603 - xxx3.txt yyy3.txt zzz3.txt 20090604 - xxx4.txt yyy4.txt zzz4.txt $_WK_dir_name[1] = "20090601" $_WK_dir_name[2] = "20090602" $_WK_dir_name[3] = "20090603" $_WK_dir_name[4] = "20090604" ============プログラム====================================== // ファイルアップロード処理 (省略) // ディレクトリ数のカウント処理 (省略) // ディレクトリとディレクトリの中身を削除 for ($i = 1; $i < 4; $i++) { // 削除するディレクトリパスを設定 $_dir_path = './' . $_WK_dir_name[$i] . '/'; printf("★1"); // ディレクトリ・ハンドルをオープン $res_file = opendir( $_dir_path ); printf("★2"); // ディレクトリ内のファイル名を1つずつを取得 while( $file_name = readdir( $res_file ) ){ // ファイルかどうか判定する if (is_file($_dir_path . $file_name)) { unlink($_dir_path . $file_name); } } printf("★3"); closedir( $res_file ); printf("★4"); rewinddir( $res_file ); printf("★5"); // ディレクトリの中身が空になったところで、ディレクトリを削除する。 rmdir($_WK_dir_name[$i]); printf("★6"); } ============================================================
- PHP
- 回答数3
- ありがとう数3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
横からすいません。 ディレクトリの権限関係の問題はないでしょうか。 また、エラーは表示されない設定でしょうか。そうならば何らかの手段でエラーを確認できるようにしてみた方がよいです。
その他の回答 (2)
- okmotokun
- ベストアンサー率59% (92/155)
<?php $_WK_dir_name[1] = "20090601"; $_WK_dir_name[2] = "20090602"; $_WK_dir_name[3] = "20090603"; $_WK_dir_name[4] = "20090604"; for($i=1; $i<4;$i++){ // 削除するディレクトリパスを設定 $_dir_path = './' . $_WK_dir_name[$i] . '/'; // ディレクトリオープン $res_file = opendir( $_dir_path ); // ディレクトリ内のファイル名を1つずつを取得 while($file_name = readdir( $res_file )){ // ファイルかどうか判定する if(is_file($_dir_path . $file_name)){ // ファイル削除 unlink($_dir_path . $file_name); } } // ディレクトリクローズ closedir( $res_file ); // ディレクトリの中身が空になったところで、ディレクトリを削除する。 rmdir($_dir_path); } ?> これで削除できませんか。 20090604 は削除しないんですよね。forループは3回で抜けてますから。
- okmotokun
- ベストアンサー率59% (92/155)
(1) closedir してから rewinddir はエラーになりませんか。 rewinddir は要らないとおもいます。 (2) rmdir($_WK_dir_name[$i]) は rmdir($_dir_path) とすべきではありませんか。
お礼
回答ありがとうございます。さっそく試してみましたが。 ディレクトリ 20090601 - xxx1.txt - yyy1.txt - zzz1.txt しか削除できず、同じ結果となりました。 1回目のwhile文は、通り、20090601は削除できましたが、 2回目のwhile文は、スルーし、20090602以降が削除できませんでした。 また、プログラム中の // ディレクトリ・ハンドルをオープン $res_file = opendir( $_dir_path ); 直後に 「printf($res_file);」 を追記したところ、 1回目は、「Resource id #5」 2回目は、「空白」となりました。
関連するQ&A
- 特定ディレクトリのファイルを全部消去する
2日徹夜していろいろやってみましたがどうにもなりません。 どなたか助けてください! ディレクトリAの中にimageという名前のディレクトリがあります。 imageディレクトリには100前後のjpg画像があります。 ディレクトリAにおいてあるreset.phpで、imageディレクトリ内のフォルダを全部削除するにはどうしたらよいでしょうか。 以下、いろいろ試したソースですが、これだとエラーが出てしまいます。 よろしくおねがいします! $res_dir = opendir( './image' ); while( $file_name = readdir( $res_dir ) ){ unlink($file_name); }
- ベストアンサー
- PHP
- URLからディレクトリ構造をテキストとして取り出す方法
URLからディレクトリ構造をテキストとして取り出す方法 たとえば http://www.xxx.com/xxx/yyy/zzz/ といったパスから、 自動的に http://www.xxx.com ├─xxx │ ├─yyy │ │ ├─zzz のようなツリーテキストを自動的に生成する方法や ツールはありませんか。 意味不明でしたら加筆しますのでよろしくお願いします。
- ベストアンサー
- Windows系OS
- あるURLがファイルなのかディレクトリなのかが知りたい
用語の使い方が不正確かもしれませんがご容赦下さい。 例えば、http://www.foobar.jp/xxx というURLがあった場合に、xxx の部分がファイルなのか、あるいはディレクトリなのか、あるいはスクリプトなのか、を知るにはどうしたらいいでしょうか? 現在、以下のようなプログラムを作成しています。 ・あるURLを指定する。 ・そのURLが指すページの内容を取得する。 ・そのページの中にあるリンクを全て取得する。 ・取得したリンクをフルパスに変換して出力する。 この際、 ・指定したURLがホスト名のみ ・指定したURLが / で終わっている ・取得したリンクがフルパス ・取得したリンクが / で始まっている ような場合は問題ないのですが、 ・指定したURLがホスト名のみでなく、かつ / で終わらず、かつ取得したURL が / ではじまらない といった場合は、どのようにフルパスを組み立てたらいいかがわかりません。 例えば、指定したURLが「http://www.foobar.jp/xxx」、取得したリンクが「yyy/zzz」のような場合、出力すべきフルパスは以下の2種類が考えられますが... http://www.foobar.jp/xxx/yyy/zzz http://www.foobar.jp/yyy/zzz 以上よろしくお願いします。
- ベストアンサー
- Perl
- MSDOSコマンドでディレクトリ内をきれいにしたい
DOSコマンドで複数のファイルとサブディレクトリをすべてどこかのディレクトリに移動するのと削除するにはどのようなコマンドになりますでしょうか? 複数行のバッチファイルにすることを想定しておりますので複数コマンドになってもOKです。 del,moveコマンドやrmdirだけでは対応できなそうなので、、、。 (1) C:\TEST\ C:\TEST\a.txt C:\TEST\b.txt C:\TEST\XXX\xxx.txt C:\TEST\YYY\yyy.txt を C:\TEST_NEW\ C:\TEST_NEW\a.txt C:\TEST_NEW\b.txt C:\TEST_NEW\XXX\xxx.txt C:\TEST_NEW\YYY\yyy.txt に移動したいのと (2) C:\TEST\ C:\TEST\a.txt C:\TEST\b.txt C:\TEST\XXX\xxx.txt C:\TEST\YYY\yyy.txt を C:TEST\ 内を空っぽにしたいです。 C:\TEST\ の中身は毎回変わり(上記a,b,XXX,YYY,xxx,yyyの名前が変わる)、(1)と(2)のバッチファイルを作って、ときどき C:TEST\をきれいにしたいです。
- ベストアンサー
- Windows系OS
- ディレクトリ名をファイル名するバッチファイル
ディレクトリ名を取得してその名称でフォルダを作るバッチファイルを考えています。 OSはWINDOWS XPです。 こういったディレクトリがあるとします。 111~444:名称が固定のディレクトリ bbb:名称が可変するディレクトリ mmm.bat、xxx.text:111フォルダと同じところにあるファイル 111┬222─bbb┬333─yyy.text │ └zzz.text │ └bbb┬333─yyy.text └zzz.text mmm.bat xxx.text mmm.batを実行すると、111ディレクトリ以下のフォルダ名を取得し、 下記のようにフォルダを作成し、yyy.textの場所にbatファイルと同じ 所にあるxxx.textをコピーして差し替えるという動作をしたいのです。 (zzz.textは内容は違うが同じファイル名です) 444┬222─bbb┬333─xxx.text │ └zzz.text │ └bbb┬333─xxx.text └zzz.text バッチコマンドで、ディレクトリ名を取得して空のフォルダを作る所までは 下記のようにできたのですが、 444┬222─bbb─333 │ └bbb─333 二つのzzz.textのコピー方法と、yyy.textの場所にxxx.textをコピーするにはbbbという可変するディレクトリを通らなければいけないのでその取得方法がわかりません。 分かる方は是非お教えください。 言葉が足りないところは補足もいたします。 よろしくお願いいたします。
- ベストアンサー
- その他(プログラミング・開発)
- ディレクトリ構造の表示
任意のディレクトリ構造を分析してその構造(ファイル名をkey)をXMLなりハッシュに吐き出すことができるモジュールなり方法を模索しています。 XMLでいうXML::Simpleみたいなものです。 参考------------------------------------------------------ 【XML分析:XML::Simple】→【ハッシュ:Data::Dumper】 【XML分析:XML::Simple】→【XMLファイル:XML::Simple】 ---------------------------------------------------------- グーグルなどで検索してみた限りでは、任意のディレクトリ内分析をしてくれてXMLなりハッシュに吐き出してくれるモジュールはなさそう。 そこでFile::Pathを使ってディレクトリ内を洗ってその構造を動的にハッシュにしたいと考えいます。しかし残念なことに予め構造がわかっている規則的なデータを動的にハッシュにすることはできるのですが、実際に分析するまでその階層すらわからない不規則なツリー状のデータ構造を動的にハッシュ化するプログラミング能力を持ち合わせていません。 そこで質問しかないということになりました。ぜひお知恵をお借りしたいと思っています。よろしくお願いいたします。 本当に簡単ですがこのような不規則なディレクトリ構造を動的にハッシュにしたいと思っています。この例ではディレクトリ構造がわかってますが、分析するまでわからないものとしてみて頂ければと思います。 test1(dir)―――――test2(dir)――――――――data1.txt(file) | | ―data1.txt(file) ―data2.txt(file) | ―data2.txt(file) $test1 = { 'test2' => { 'data1' => { 'path' => 'test1/data.txt', 'parent_dir' => 'test2' }, 'data2' => { 'path' => 'test2/data.txt', 'parent_dir' => 'test2' }, }, 'data1' => { 'path' => 'test1/data.txt', 'parent_dir' => 'test1' }, 'data2' => { 'path' => 'test2/data.txt', 'parent_dir' => 'test1' } };
- ベストアンサー
- Perl
- 複数パターン文字列指定でログファイルの中身を削除
はじめまして。 「a.log の xxx と yyy のある行を削除」 というようなshellScriptを書いています。 a.logは以下のようになっています。 a.log 111xxx111 222yyy222 333zzz333 222yyy222 444aaa444 555bbb555 111xxx111 xxx、yyyの複数パターンで行の削除はできないでしょうか。 sedで中間ファイル(ワークファイル)を2回作成すればできるのですが… なるべく中間ファイルは作成したくありません。 最終的にはa.logを下記のようにしたいです。 a.log 333zzz333 444aaa444 555bbb555 宜しくお願い致します。
- ベストアンサー
- Solaris系OS
- Perlでディレクトリごと削除したい
telnet.cgiを使って、カレントディレクトリで、 rm -rf * を行っても、なぜか(permissin 755にも関わらず)permission denyといわれうまく削除できませんでした。 そこで、perlを使って削除を試みたいのですがどのようにすれば、削除できますか? 参考になりそうなソースを見つけたのですが、ディレクトリの中にディレクトリがある構造のためうまく削除できませんでした。 どなたか、改良していただけないでしょうか? お手数ですが、宜しくお願い致します。 #!/usr/local/bin/perl $dir = "./d/"; opendir DIR, $dir; @files = grep { !m/^(\.|\.\.)$/g } readdir DIR; close DIR; $flag = @files; if ( $flag ) { foreach $file ( @files ) { unlink "$dir$file"; } } rmdir $dir;
- ベストアンサー
- CGI
- CGIからの絶対パス
こんにちは。 perlのCGIでファイルをオープンする際のパス指定で悩んでいます。 cgiとは別のディレクトリにあるファイルをオープンしたいのですが、 このとき、 open(IN,"/home/XXX/YYY/ZZZ.dat"); というふうに絶対パスでオープンしようとすると、オープンできません。 一方、 open(IN,"../../../home/XXX/YYY/ZZZ.dat"); といった感じに相対パスにすると、オープンできます。 ファイルの場所は/home/XXX/YYY/ZZZ.datで間違いありませんし、 cgiとしてではなく、シェルから直接cgiプログラムを起動すると、 絶対パスでもオープンできます。 これはいったいどういうことが起こっているのでしょうか? ご存知の方、ご解説願えないでしょうか。
- ベストアンサー
- CGI
- directory中の大量の空ファイルのみを効率よく削除するには?
あるプログラムを作ったところ、 XXX_YYY.txt (XXXは001から200、YYYは001から050) というファイル名のfailがつくられたのですが、 必要なファイルの他に、沢山の空ファイルができてしまいました。 (空ファイルが或る場合)各XXXについて、YYYのある番号以上がすべて空になっているのですが、 そのある番号はXXXによってまちまちです。 この多量にある空ファイルのみを選択的に一気に削除するには、どのようにするのが効率的でしょうか。 「ファイルの容量が0か否かを判定して、それが真であれば削除する」という シェルスクリプト、perlスクリプト、 あるいはzshのコマンドでできるのではないかとにらんでいるのですが、 よい方法を御存じの方がいましたら、教えて頂けないでしょうか。
- ベストアンサー
- Linux系OS
お礼
回答ありがとうございます。 最初の回答と同様上記のように、実行しましたが、同じ結果となりました。 ロードポイントを見る限り以下のような動きをしています。 1回目のforループにて、 while文は、通り、20090601は削除。 2回目(以降)のforループにて、 while文は、入らず、20090602以降(20090603、20090604)が削除できませんでした。