解凍した内容を別のファイル名で保存

このQ&Aのポイント
  • 圧縮ファイルを解凍して別のファイルに保存するスクリプトを考えています
  • 指定された圧縮ファイルを解凍せずに保存するスクリプトの方法を知りたいです
  • 解凍した内容を指定したファイルに書き込む方法を教えてください
回答を見る
  • ベストアンサー

解凍した内容を別のファイル名で保存

圧縮ファイル($filename.gz)を解凍し、 解凍した内容を別のファイルに書き込み保存するスクリプトを考えています。圧縮されているファイルは解凍するとxmlファイルですが、下記のスクリプトの方法ですと解凍されず、対象のxmlファイルは0バイトです。 「概念から間違っているのかなぁ」と考えもしましたが、 ちゃんと解凍して./aaa/bbb.xmlファイルに書き込む方法がわからず質問させていただきました。 どうかご教授願います。 ※$filename.gzというのはこのスクリプトの直前で作られている圧縮ファイルです。このファイルのファイル名・内容については問題ないことを確認しています。 ============ <?php ~ touch("./aaa/bbb.xml"); $decompress = "/usr/bin/gzip -dc $filename.gz"; $result = system(escapeshellcmd($decompress)); $lastfile = fopen("./aaa/bbb.xml", "rwb+"); $lastview = fwrite($lastfile, $result); fclose($lastfile); ~ ?> ============

  • PHP
  • 回答数2
  • ありがとう数5

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

  • ベストアンサー
回答No.2

>touch("./aaa/bbb.xml"); >$lines = gzfile("$filename.gz"); >$lastfile = fopen("./aaa/bbb.xml", "rwb+"); >$lastview = fwrite($lastfile,$lines); >fclose($lastfile); >closedir($dir); >↓ >結果:Array gzfile()はgzファイル全体を配列に読み込むので、Arrayとなって当たり前です。 > $lastview = fwrite($lastfile,$lines); を foreach($lines as $line){ $txt .= $line; } $lastview = fwrite($lastfile,$txt); とすれば良いのではないでしょうか?

wf3255
質問者

お礼

あっさり解決いたしました。 私の無知度を考慮していただき、ダイレクトなアドバイスありがとうございます。

その他の回答 (1)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

system()で帰ってくるのは実行結果の最後の行だけになります。 shellにそのままファイルを作らせるのはどうでしょう system(escapeshellcmd($decompress) . "> ./aaa/bbb.xml"); 他にはpopenを使う方法もあります。 $in = popen(escapeshellcmd($decompress), "r"); セキュリティ面からはshellコマンドを使うよりgzopenやgzfileなどの関数を使ったほうが好ましいかもしれません。Safe modeがOnでも使えますし。 http://jp.php.net/manual/ja/ref.zlib.php

wf3255
質問者

お礼

私の無知により直接の解決には出来ませんでしたが、ご提案していただいたことは非常に助かりました。 本当に感謝しております。ありがとうございました。

wf3255
質問者

補足

ご解答ありがとうございます。 ご提案いただいた3種類の方法を試したところ下記の3種類の結果になりました。私のやり方がまずいと思うのですが、どれか一つでいいのでどこがまずいかご教授願います。 ========== touch("./aaa/bbb.xml"); $lines = gzfile("$filename.gz"); $lastfile = fopen("./aaa/bbb.xml", "rwb+"); $lastview = fwrite($lastfile,$lines); fclose($lastfile); closedir($dir); ↓ 結果:Array $decompress = "/usr/bin/gzip -dc $filename.gz"; system(escapeshellcmd($decompress) . "> ./aaa/bbb.xml"); closedir($dir); ↓ 結果:0バイト touch("./aaa/bbb.xml"); $decompress = "/usr/bin/gzip -dc $filename.gz"; $result = popen(escapeshellcmd($decompress), "r"); $lastfile = fopen("./aaa/bbb.xml", "rwb+"); $lastview = fwrite($lastfile, $result); fclose($lastfile); ↓ 結果:Resource id #5 ==========

関連するQ&A

  • Windowsで言う『ctrl+A→ctrl+C→違うファイルを開いてCtrl+A→Ctrl+V』

    Windowsで言う『ctrl+A→ctrl+C→違うファイルを開いてCtrl+A→Ctrl+V』と同じ動きをするスクリプトを作っています。 ctrl+A,ctrl+Cするファイルはxxx.gzです。 ctrl+A,ctrl+Vするファイルは./aaa/bbb.cccです。 <?php $lines = gzfile("xxx.gz"); $lastfile = fopen("./aaa/bbb.ccc", "rwb+"); foreach($lines as $line){ $txt .= $line; } $lastview = fwrite($lastfile,$txt); fclose($lastfile); ?> 上記の方法だと、bbb.cccファイルの内容が "あいうえおかき"で、xxx.gzファイルが "かきくけこ"の時、 スクリプト後に bbb.cccファイルは"かきくけこかき"になってしまいます。 希望は、スクリプト後のbbb.cccファイルの内容が "かきくけこ"にしたいのです。 この方法がわかりませんので教えてください。

    • ベストアンサー
    • PHP
  • gzipで圧縮されたファイルを伸張して保存

    gzipで圧縮されたファイル(sample.txt.gz)を伸張して「sample.txt」として保存し直したいのですが、スクリプト内でどういうふうに書けばいいのかわかりません。 gzipのパスは、#!/bin/gzip gunzip sample.txt.gz や gzip -d sample.txt.gz のコマンドを使うらしいことはわかったのですが、これをどうスクリプト中に書けばいいのか。。。 どなたかわかる方、教えてください。

    • ベストアンサー
    • Perl
  • ファイルの解凍及び名前変更保存方法

    sendファイルとして圧縮して配信されるファイルがあります。(例:aaa.send) このファイルはスクリプトと同階層にあるxxxというディレクトリ内に配信されます。 このファイルをバイナリモードで開き、 先頭の18バイトを削除 ↓ aaa.gzという名前に変換 ↓ 解凍 ↓ aaa.xmlというファイル名に変換 というスクリプトを考えております。 PHPは4.3.8です。 方法があればご教授ください。

    • ベストアンサー
    • PHP
  • PHPでgz形式のファイルをダウンロード→解凍出来ない

    こんにちは。ブラウザからリクエストがあった際に、 ローカルに保存されているgzip形式で圧縮した XMLファイルをPHPで読み込んで ダウンロードさせる、というプログラムを作成しております。 ダウンロードした後、解凍しようとすると 「破損ファイルです」とのメッセージが出て 解凍が出来ません。 ダウンロードしたファイルをバイナリエディタで開いてみると、 先頭に"0A"、 末尾に"0A090A" というゴミ?なんでしょうか、変なものが付いています。 (これが何かは調べても分かりませんでした。 また、このゴミを削除すると解凍出来ました) ローカルに保存したファイル、及び、PHP内の読み込みまではゴミは付いていませんでした。 //ソース抜粋 header('Content-Type: application/gzip;'); header('Content-disposition: attachment; filename=hogexml.gz'); $fp = fopen('/home/hoge/hogexml.gz', 'rb'); $str = fread($fp, filesize('/home/hoge/hogexml.gz')); $echo $str; //この時点でbin2hex()で$strをダンプしてもゴミは付いていない fclose($fp); ファイルはEUC-JPでDBから取得した文字列をUTF-8に変換してから圧縮して作成しております。 圧縮関数はgzopen(),gzwrite(),gzclose()です。 またブラウザからhttp://hogehoge_arienai.com/hogexml.gzという様に ファイルを直接指定してダウンロードした場合は問題なく解凍されました。 八方塞がり状態でどうしたら良いものかと・・(´△⊂)・. こういった現象にちょっとでも心あたりのある方おられましたら ヒントでも構いませんので、何卒ご返答の程よろしくお願い致しますす。 <PHPスクリプトの動いているサーバ> OS:FreeBSD6.1 Apache:2.0.58 PHP:5.1.2 <ダウンロードしているクライアント> WindowsXP Pro

    • ベストアンサー
    • PHP
  • renameでのPermission deniedエラー

    下記スクリプトを実行すると、『Warning: rename(./aaa/bbb.send,./aaa/bbb.send.gz) [function.rename]: Permission denied in ...line 31←renameの行数』というエラーになります。 =========== <?php $dir = opendir("./aaa"); $latestfile=0; while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; $ftime = filemtime("./aaa/$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename =$fnm; $filename = "./aaa/$latestfilename"; $fp = fopen($filename, "rwb+"); fread($fp, 18); //18バイト読み飛ばす ftruncate($fp, 0); $warn = ''; while (!feof($fp)) { $warn .= fread($fp, 8192); } rewind($fp); fwrite($fp, $warn); rename($filename,"$filename.gz"); fclose($fp); } } closedir($dir); ?> ============= renameの手前でchmodを実行させ、aaaディレクトリ及びファイル自身(./aaa/$filename)にパーミッション0777を与えても現象は変わりません。renameする$filenameにつきましても./aaa/$filenameとしたり、./aaa/$latestfilenameとしてみましたがやはり変わりませんでした。 解決策があればご教授願います。

    • ベストアンサー
    • PHP
  • tar.gzファイルの解凍

    FreeBSDを使用しています。 ダウンロードした AAA.tar.gz というファイルを解凍したいのですが、 gunzip AAA.tar.gz とすると、 gunzip: AAA.tar.gz: not in gzip format と出ます。 そこで、 file AAA.tar.gz とすると、 AAA.gz: GNU tar archive と出ました。 ですので、 tar xzvf AAA.tar.gz としてみましたが、以下のように出ます。 gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error exit delayed from previous errors どのようにして解凍すればよいのかご教授いただけませんでしょうか?よろしくお願いいたします。

  • postgresのlinux版でやっている事と同等の事をwindows

    postgresのlinux版でやっている事と同等の事をwindows版でやりたい! os:windows xp やりたい事は以下です。 圧縮して出力 $ pg_dump dbname | gzip > filename.gz 解凍のみ $ gunzip -c filename.gz 解凍してリストア $ gunzip -c filename.gz | psql dbname gzipがzipやlhaに変わってもOKです。 --format=c オプションで出力したファイルは解凍のみの方法が分かりませんでした。 圧縮ツールはwindowsの標準か追加モジュールが第一希望 第二希望はフリーソフトです。

  • 解凍ファイル

    ABファイルを解凍したいんですが 「ファイル名.ara.abはアーカイブファイルではありません。」 と出てしまいます。 今使っているソフトなんですがなんていうソフトか忘れたんですが、「.lzh .zip(pass) .bh .bz2 .cab .gz .tar .tar.bz2 .tar.gz .b64 .xxe .uue .exe .tar.gz」に圧縮できます。 abファイルは解凍できませんでしたが、aaファイルは解凍できました。 ABファイルが解凍できるソフトってないですか? 解凍お願いします。

  • 関数『readgzfile』について

    下記スクリプトを実行すると『Warning: fwrite(): supplied argument is not a valid stream resource in fwriteの行』というエラーが出ます。 ~ ・ ・ $gz = "$filename.gz"; $gz2 = gzopen("$gz", "r"); $gzdetail = readgzfile($gz); fwrite($gz, $gzdetail); gzclose($gz2); rename($gz,"$filename.xml"); ・ ・ ~ おそらく凡ミスであると思うんですが、 どうおかしいのかちょっと解決できないため、ご教授お願いいたします。 尚、このスクリプト部の直前までは正常に処理できていることを確認しております。

    • 締切済み
    • PHP
  • linux上で、複数のgz圧縮ファイルを、元のgzファイルも保持したま

    linux上で、複数のgz圧縮ファイルを、元のgzファイルも保持したまま解凍したいのですが、 > gunzip -cd *.gz のように、標準出力して元のファイルを残すのではなく、 圧縮ファイルとして元のファイルを保持したまま、解凍も行うことはできないのでしょうか? (例えば、"AAA.gz"を解凍して"AAA"と"AAA.gz"の2つをディレクトリ内に残すことはできないのでしょうか?) ご教授よろしくお願いします。

専門家に質問してみよう