• ベストアンサー

フォルダ内のファイルのコピーについて

同フォルダ内にAフォルダにaa,bb,ccというテキストファイルがあります。これをex.txtファイルにaa,bb,ccファイルの内容をコピーしたいのですが、うまくいきません。 最初はuse File::Copyでやろうとしましたが、これはディレクトリの中のファイルの指定がわからず、断念。 次にwhile文でやってみましたが、これも引数の指定がわからない状態です。 もしよければお知恵を貸してください。

質問者が選んだベストアンサー

  • ベストアンサー
  • m_mik
  • ベストアンサー率26% (31/117)
回答No.6

#3です。 試していなかったので、ちょっと確認してみました。 ファイルを開くところでディレクトリを指定していなかったのでファイルが開けずに書き込まれない状態になっていたようです。 ですので、ディレクトリの指定を追加してください。 $dir = "A"; open(OUT , "> ex.txt"); opendir(DIR , $dir); while ($file = readdir(DIR)) { open(IN , "$dir/$file"); print OUT while (<IN>); close(IN); } closedir(DIR); close(OUT);

kotikaze6
質問者

お礼

ありがとうございました。これだけ短くてわかり易いコードは 理想的でしかもやりたいことが完全にできました。 ここから更に機能を増やしていきたいと考えています。 またもし質問することがあれば宜しくお願いします。

その他の回答 (5)

  • x415f484f
  • ベストアンサー率71% (57/80)
回答No.5

ANo.4 の補足部分から引用 > 今後のためにも過程を大事にしたいので・・ > 質問の意味もわかりにくかったと思うのでもう一度整理して書きます。 なんとなくはわかるんですが、確認させてください。 以降の引用は QNo.3855079 からの引用 > Aフォルダにaa,bb,ccというテキストファイル 要するにディレクトリ構成はこうなっているのでしょうか? # ディレクトリ B は余計かもしれないですけど。 ./ |--A/ | |-- aa | |-- bb | |-- cc | |--B/ | |--dd (以下略) と、なっているものを A/aa ... B/dd... と全て見つけたいのですか? これを「工程 1」として 列挙したファイル(aa 、bb 、cc や B/dd)を読み込んで、カレントディレクトリの ex.txt に列挙したファイルの中身を追記して保存したいということでしょうか? これを「工程 2」として 「工程 1」を実現する場合は File::Find というものがあります。 使う方法は下記の URL をご覧になってください。 http://katsubemakito.net/cgiperl/2006/10/perl2.html # ただし各引数の意味がわかるまでは使わないほうがよろしいと思います。 カレントディレクトリまたは、任意のディレクトリの下層を含めて繰り返して ファイルの列挙するようなことを「"再帰的"な検索」と言います。 # 余計なことで申し訳ないですが、気になったことを記述させて頂きます。 # 細かいことはスルーすべきなのでしょうけど。 > File::Copy と、モジュールを使おうとなさっておられたのに…… > while文でやってみましたが、これも引数の指定がわからない状態 これは while 文のひき数がわからないということだったのでしょうか? ひき数についての調査はご自分でどこまでなされたのでしょうか? 勉強したいという意志をお持ちなら、焦らずにひとつひとつの持つ意味を 理解してプログラミングをされるほうがよろしいのではないでしょうか? ただコードを貼るのではなくに、ご自身が意図する動作をコメントとして 書いて頂けるとわかりやすくなります。 # 回答者の方々とのやりとりを拝見していると、努力されているのは # わかりますけど。 また、ご質問のスレッドごとにお使いの環境などを書いていただけると 助かります。 OS や Perl のバージョンによっては使えないモジュールがあるからです。 たとえば、こんな感じで <Perl> perl 5.8.8 等 <OS> linux(Fedora8) や WindowsXP 等 このような情報は、質問する方と回答する方の双方にメリットがあること だと思いますので、そうなさったらいかがでしょうか? # くどいことを申し上げたので、どうお感じになられるかは判りませんが、 # 別に意地悪で言っているのではないのです。がんばってください。

kotikaze6
質問者

補足

丁寧にありがとうございます。確認事項についてはその通りです。 工程1に関しては、何とかできました。問題は工程2です。 今日も一日かけましたが、できず・・ パールのバージョンはtelnetを使えないので見れませんでした。 Aフォルダを開く  Aフォルダ内のファイルの一覧を取得する Aフォルダ内のファイルの内容を表示 書き込み用exファイルを開く KS ファイルの内容が蓄積された配列をexファイルにプリントする print KS @line; わかりにくいかもしれません。。 自分でも思いますがこういった手順を本などを見ながら今も模索中です。 再帰的な検索がこうも難しいとは…   

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

これ, 悩むくらいなら system 使った方がはやいんじゃない?

kotikaze6
質問者

補足

今後のためにも過程を大事にしたいので・・ 質問の意味もわかりにくかったと思うのでもう一度整理して書きます。 ◎条件 試作フォルダ内にsisaku.bat sisaku.pl ex.txt Aフォルダがあって Aフォルダ内に aa.txt,bb.txt,cc.txt というテキストファイルが3つあります。 テキストファイルの内容は何でもいいのですが、例えばaa.txt には aaaaaa bb.txt には bbbbbbb tttttt ggggggg などと書き込まれている。 ★やりたいこと ex.txt ファイルに Aフォルダ内にある3つのファイル全ての内容を書き込みたい。     ex.txt aaaaaa tttttt bbbbbb gggggg ← のように 今のところ、ファイルを1個ずつ指定すれば書き込めるが、フォルダ内のファイルが例えば1000個に増えたとき、いちいち指定するのは 実用性がないので、何か方法がないかと考えて相談させてもらった次第です。 この説明で伝わったでしょうか?。。

  • m_mik
  • ベストアンサー率26% (31/117)
回答No.3

opendir()、readdir() でディレクトリの内容を取得して、ファイルの内容を読み出して書き込んでいくというのでは駄目でしょうか? open(OUT , "> ex.txt"); opendir(DIR , "A"); while ($file = readdir(DIR)) { open(IN , $file); print OUT while (<IN>); close(IN); } closedir(DIR); close(OUT); 実行していませんがこれで上手くいくでしょうか?インデントは調整してください。

kotikaze6
質問者

補足

ソースコードありがとうございます。 実行してみましたが、うまくいきませんでした。 my $dirname = '.'; opendir(DIR, $dirname) or die "$dirname: $!"; while ( my $dir = readdir(DIR)) { next unless (-f $dir); next unless ($dir =~ /.\txt$/); print $dir, "\n"; open(FILE, $dir) or die "$dir: $!"; while (my @line = <FILE>) { print @line; } close(FILE); } closedir(DIR); ↑こういうのも試しましたが、最後のファイルの内容しか書き込めません。フォルダ内のファイルの内容を表示させることは何とかできても、 表示した内容を全部書き込めないのが現状です。

  • 1582
  • ベストアンサー率10% (292/2662)
回答No.2

 いっぺんにやらず一つずつコピペしていくとかじゃだめかな

kotikaze6
質問者

補足

ファイルが100入っててもいいようにしたいので・・

noname#65902
noname#65902
回答No.1

質問が意味不明です。

kotikaze6
質問者

補足

同フォルダ内のAフォルダに ここですね。間違えました。

関連するQ&A