- PR -

Zipファイル作成ができない

投稿者投稿内容
会議室デビュー日: 2008/05/29
投稿数: 12
投稿日時: 2008-08-12 10:47
いつもお世話になっております。

現在、WEBアプリケーションの開発を行っているのですが
Zip形式でのファイルのダウンロードが出来ずに困っております。

処理としましては、あらかじめフォルダを作成して、DBより必要な情報を取得、
Excelファイルを作成しフォルダに格納(場合によってはpdfファイルも作成されます)。
その後、そのフォルダ内のファイルをZip形式で圧縮して、
一括ダウンロードを行おうとしています。

しかし、Excelファイル等の作成までは上手くいくのですが、
Zipファイルを作成しダウンロードして解凍してみると
ファイルが壊れてしまっていました。
(ファイル名が途中で切れていて、拡張子すら付いていない状態です)

いろいろ試してみたのですが、自分では解決することが出来ませんでした。
そこで、何かヒントやご指導をお願いしい次第です。

ソースは以下の通りです。

↓ソース↓
/// <summary>
/// Zip圧縮メソッド
/// </summary>
/// <param name="fileDir">圧縮対象ファイルパス</param>
/// <param name="zipfileName">Zipファイル名(hogehoge.zip)</param>
/// <returns>Zipメモリストリーム</returns>
public static MemoryStream MakeZipFile(
string fileDir,
string zipfileName)
{
 //作成するZIPファイルパス
 string zipPath = fileDir + zipfileName;
 
 string[] fileLists = System.IO.Directory.GetFiles(fileDir);
 //ZipOutputStreamの作成
 java.io.FileOutputStream fos = new java.io.FileOutputStream(zipPath);
 java.util.zip.ZipOutputStream zos =
             new java.util.zip.ZipOutputStream(fos);

 //Zipにファイルを追加する
 foreach (string file in fileLists)
 {
  //ZIPに追加するときのファイル名を決定する
  string fName = System.IO.Path.GetFileName(file);
  java.util.zip.ZipEntry ze = new java.util.zip.ZipEntry(fName);
  ze.setMethod(java.util.zip.ZipEntry.DEFLATED);
  ze.setTime(System.IO.File.GetLastWriteTime(file).Date.ToFileTimeUtc());
  zos.putNextEntry(ze);
  //FileInputStreamの作成
  java.io.FileInputStream fis = new java.io.FileInputStream(file);
  //書込み
  sbyte[] buffer = new sbyte[8192];
  int len;
  while((len = fis.read(buffer, 0, buffer.Length)) > 0)
  {
   zos.write(buffer, 0, len);
  }
  //閉じる
  fis.close();
  zos.closeEntry();
 }

 zos.close();
 fos.close();
 StreamReader sr = new StreamReader(zipPath,System.Text.Encoding.Default);
 BinaryReader br = new BinaryReader(sr.BaseStream);
 
 byte[] bZip = br.ReadBytes(int.Parse(sr.BaseStream.Length.ToString()));
 MemoryStream ms = new MemoryStream(bZip);

 br.Close();
 sr.Close();
 
 return ms;
}
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-08-12 12:57
"ZipOutputStream" でこの会議室を検索し、動いているコードとの違いを見られてはいかがでしょうか。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
会議室デビュー日: 2008/05/29
投稿数: 12
投稿日時: 2008-08-12 14:22
じゃんぬさん、返信ありがとうございます。

現在、じゃんぬさんの仰るとおり検索を行い確認しています。
そこで以下の質問に目を付けてみました。

「【ASP.NET】Webサーバ側で複数Excelを圧縮したい」
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=29412&forum=7&start=0

そして、さっき気づいたのですが・・・・
Zipにする前処理で、バイト配列からBinaryWriterを使ってExcelファイルを
作成しているのですが、そのバイト配列を引数で渡して使ったほうが効果的でしょうか?

見当違いのことを言っていたらすみません。。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-08-12 14:48
引用:

烈さんの書き込み (2008-08-12 14:22) より:

そして、さっき気づいたのですが・・・・
Zipにする前処理で、バイト配列からBinaryWriterを使ってExcelファイルを
作成しているのですが、そのバイト配列を引数で渡して使ったほうが効果的でしょうか?


それは動作と関係ないですよね。 動作で困っているのですから、動作に関わるところを比較しないといけないですよね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
会議室デビュー日: 2008/05/29
投稿数: 12
投稿日時: 2008-08-12 16:12
引用:

じゃんぬねっとさんの書き込み (2008-08-12 14:48) より:
それは動作と関係ないですよね。 動作で困っているのですから、動作に関わるところを比較しないといけないですよね。




そうでした・・・すみません。気が焦ってしまって。。

先ほど挙げたところのソースと比較しながら修正してみました。
が、まだ上手くいきません。Lhaplusで解凍すると
「アーカイブのヘッダに異常がありました」と表示され解凍されませんでした。

方向は合っていますでしょうか

----------------------------------------------
public static MemoryStream ConvertZipFile(
string fileDir,
string zipfileName)
{
//圧縮ファイルフルパス
string zipPath = string.Empty;
string[] filePaths = System.IO.Directory.GetFiles(fileDir);
//作成するZIPファイルの設定
zipPath = fileDir + zipfileName;
//ZipOutputStreamの作成
java.io.FileOutputStream fos = new java.io.FileOutputStream(zipPath);
java.util.zip.ZipOutputStream zos =
new java.util.zip.ZipOutputStream(fos);
//Zipにファイルを追加する
foreach (string file in filePaths)
{
//ZIPに追加するときのファイル名を決定する
string f = System.IO.Path.GetFileName(file);
//FileInputStreamの作成
java.io.FileInputStream fis = new java.io.FileInputStream(file);
java.io.BufferedInputStream bis = new java.io.BufferedInputStream(fis);
// ファイルサイズ取得
int iFileSize = Convert.ToInt32(new System.IO.FileInfo(file).Length);
//書込み
sbyte[] buffer = new sbyte[iFileSize];
java.util.zip.CRC32 oCrc32 = new java.util.zip.CRC32();
if(bis.read(buffer, 0, iFileSize) > -1)
{
oCrc32.update(buffer, 0, iFileSize);
zos.write(buffer, 0, iFileSize);
}
java.util.zip.ZipEntry ze = new java.util.zip.ZipEntry(f);
ze.setMethod(java.util.zip.ZipEntry.DEFLATED);
ze.setSize(iFileSize);
ze.setCrc(oCrc32.getValue());
zos.putNextEntry(ze);
//閉じる
bis.close();
fis.close();
zos.closeEntry();
}
zos.close();
fos.close();
StreamReader sr = new StreamReader(zipPath,System.Text.Encoding.Default);
BinaryReader br = new BinaryReader(sr.BaseStream);
byte[] bZip = br.ReadBytes(int.Parse(sr.BaseStream.Length.ToString()));

MemoryStream ms = new MemoryStream(bZip);
br.Close();
sr.Close();
return ms;
}
----------------------------------------------
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2008-08-12 17:13
現象をもっと具体的に書いたほうが良いかと思います。
・ZIPファイルは展開できるの? できないの? どのツールで?
・文字化けの場合、「こうなるはずのファイル名がこのように化けている」
会議室デビュー日: 2008/05/29
投稿数: 12
投稿日時: 2008-08-12 17:21
引用:

スフレさんの書き込み (2008-08-12 17:13) より:
現象をもっと具体的に書いたほうが良いかと思います。
・ZIPファイルは展開できるの? できないの? どのツールで?
・文字化けの場合、「こうなるはずのファイル名がこのように化けている」



スフレさん、お返事ありがとうございます。

前回の書き込みで書いたつもりでしたが、少しまとまっていませんでした。。
申し訳ありません。
現象は、
・Zipファイルは作成される。
・解凍時にエラーが出て展開できません。
・解凍ツールは「Lhaplus」。

といった感じです。


[ メッセージ編集済み 編集者: 烈 編集日時 2008-08-12 17:22 ]
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2008-08-12 17:40
ファイル名が切れるのではなかったのでしょうか?
サーバ側に一時的に作ったzipファイルとクライアントでダウンロードしたzipファイルは一致してますか?

スキルアップ/キャリアアップ(JOB@IT)