• ベストアンサー
  • 暇なときにでも

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

圧縮ファイル($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); ~ ?> ============

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数130
  • ありがとう数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); とすれば良いのではないでしょうか?

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • ファイルの解凍及び名前変更保存方法

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

    • ベストアンサー
    • PHP
  • 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
  • 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の標準か追加モジュールが第一希望 第二希望はフリーソフトです。

その他の回答 (1)

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

質問者からの補足

ご解答ありがとうございます。 ご提案いただいた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

  • 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
  • if文でのハンドラ取得

    初歩的な質問で申し訳ございません。 ディレクトリ./aaaの中にあるファイル名のうち、.bbbという拡張子のファイルが存在した際(複数存在することはありません)に下記の処理を実行するスクリプトを作成したいのです。 自分で試みると1行目の$filenameが上手く取得できず、エラーが多数発生してIEが固まってしまいます。 下記スクリプト前のif分の中でどのように$filenameを取得したらよいかをご教授願います。 ===処理==== $fp = fopen($filename, "rb+"); fread($fp, 204); $warn = ''; while (!feof($fp)) { $warn .= fread($fp, 8192); } rewind($fp); fwrite($fp, $warn); ftruncate($fp, ftell($fp)); fclose($fp); rename($filename,"$filename.gz"); $lines = gzfile("$filename.gz"); $lastfile = fopen("./aaa/ggg.yyy", "wb"); foreach($lines as $line){ $txt .= $line; } $lastview = fwrite($lastfile,$txt); fclose($lastfile); chmod("./aaa/ggg.yyy", 0755); closedir($dir); ===処理====

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

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

    • ベストアンサー
    • Perl
  • 関数『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
  • 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
  • 解凍できなくて困ってます

    圧縮ファイルで (ファイル名).pdf.gz と (ファイル名).ps.gz というのをwindows上で解凍したいのですが どうしたら言いのでしょうか? 教えて下さい!!

  • 別名での解凍は ???

    +Lhacaで圧縮した自己解凍書庫を『 aaa.EXE 』とします これを解凍すると『 aaa 』ホルダーが出来ますが、別名の『 bbb 』ホルダーに自動解凍したいのです ⇒ 手作業で『 aaa 』を『 bbb 』に名称変更するのはNG 可能でしょうか? もし可能であればその方法は??? 参考になる資料が御座いましたら、お教え願います 

  • Windows版のgzipについて

    Windows版のgzipについて os:win xp-pro gzip「http://www.gzip.org/」 windows版で 標準入力からの情報を圧縮しようとするとおかしくなります。 以前にpostgresからのダンプ圧縮としてマニュアルに載っているコマンド(linux用)をWindowsでも出来ないかと質問させて頂いたところ、 gzipのWindows版を紹介して頂きました。 <ダンプ圧縮コマンド> pg_dump dbname | gzip > filename.gz <試行1> Windows版のgzipをインストール後、試してみました。 pg_dump.exe --host=localhost --username=postgres template1 | gzip.exe > C:?Temp?test_dump.gz しかし、C:?Temp?test_dump.gzを解凍できません。 一旦、テキストで出した後、改めて圧縮すると解凍できます。 pg_dump.exe --host=localhost --username=postgres template1 > C:?Temp?test_dump gzip.exe C:?Temp?test_dump <試行2> 一旦、postgresの事は忘れて、適当なテキストファイルを用意し、標準入力から圧縮しました。 type c:?temp?test.txt | gzip.exe > c:?temp?test.txt.gz 結果は、やはり解凍できません。 シンプルに圧縮してみました。 gzip.exe c:?temp?test.txt c:?temp?test.txt.gzを解凍する事ができました。 どうしたものでしょうか? 何かやり方が悪いのでしょうか?

  • UNIXで圧縮したgzipをWINDOWSで解凍する方法

    - UNIXで圧縮したgzip形式のファイルを、WINDOWS上で解凍して 使いたいのですが、解凍方法、若しくは、解凍ツールをご存知の方が いらっしゃいましたら、是非教えてください。 特に、gzip形式にこだわっている訳ではないので、UNIXで圧縮したファイルを WINDOWS上で解凍する方法でも構いません。 実際に使用するファイルは、ORACLEのインポートデータです。 どうぞ、どんなアドバイスでも結構です、宜しくお願いいたします。 -

  • 解凍

    インストールしたファイルがdmp形式でした。 マニュアルには「dmp.gzの形式で保存」とあるのですが.gzでなく.dmpで終わっています。 今までは圧縮されていてもWクリックすれば解凍されていたのですが今回はWクリックしても何も起こりません。 こういった場合はどうしたらいいのでしょうか? どなたか教えて下さい。お願いします。

    • 締切済み
    • Mac