C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: .net 元ファイルを作らずにZIPファイル作成


(過去ログ 85 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■50712 / inTopicNo.1)  .net 元ファイルを作らずにZIPファイル作成
  
□投稿者/ アサシオクマ (1回)-(2010/06/16(Wed) 07:40:10)

分類:[ASP.NET (VB)] 

開発環境visual studio 2003
言語VB

asp.netでシステムを構築していますが、
機能として画面からRDBレコードをダウンロードする中での問題です。

RDBからあるテーブルのレコード情報を.slkファイルで保存し、それを元に.zipに変換し
そのファイルをファイルダウンロードダイアログよりユーザがダウンロード出来るまでは出来ました。

やりたい事は
.slkデータを作らずにStringBuilderを使って直接.zipを作る事です。
可能でしたらご教授お願い申し上げます。

引用返信 編集キー/
■50713 / inTopicNo.2)  Re[1]: .net 元ファイルを作らずにZIPファイル作成
□投稿者/ れい (932回)-(2010/06/16(Wed) 08:53:54)
No50712 (アサシオクマ さん) に返信
> やりたい事は
> .slkデータを作らずにStringBuilderを使って直接.zipを作る事です。
> 可能でしたらご教授お願い申し上げます。

StringBuilderからMemoryStreamを作って
GZipStreamに流せばよいかと。

GZipのヘッダーとか圧縮率とかいろいろ問題はありますが。
引用返信 編集キー/
■50723 / inTopicNo.3)  Re[2]: .net 元ファイルを作らずにZIPファイル作成
□投稿者/ ぽぴ王子 (496回)-(2010/06/16(Wed) 12:25:09)
ぽぴ王子 さんの Web サイト
No50713 (れい さん) に返信
> ■No50712 (アサシオクマ さん) に返信
>>やりたい事は
>>.slkデータを作らずにStringBuilderを使って直接.zipを作る事です。
>>可能でしたらご教授お願い申し上げます。
>
> StringBuilderからMemoryStreamを作って
> GZipStreamに流せばよいかと。
>
> GZipのヘッダーとか圧縮率とかいろいろ問題はありますが。

やり方的にはそれでいいと思いますが、それだと GZip ファイル が作られるので ZIP ファイルをほしいという
要望には応えられないのかな?と思いました。
代替案であればいいのですけど、だとすれば代替案と書いておかないと期待されちゃうかしら?なんて心配を。
引用返信 編集キー/
■50732 / inTopicNo.4)  Re[3]: .net 元ファイルを作らずに
□投稿者/ アサシオクマ (2回)-(2010/06/16(Wed) 14:55:18)
2010/06/16(Wed) 14:57:22 編集(投稿者)
返信ありがとうございます。

現状はこんな感じで.slkを作っておいてそれを.zipにしています。

  Dim outStream As New java.util.zip.ZipOutputStream(New java.io.FileOutputStream(directry & filename))
 Dim Path As string="ファイル.slk"

  Private Sub putFileToZip(ByVal outStream As java.util.zip.ZipOutputStream, ByVal Path As String)

    Dim size As Integer = CInt(FileLen(Path))
    Dim inStream As New java.io.BufferedInputStream(New java.io.FileInputStream(Path))
    Dim crc As New java.util.zip.CRC32
    Dim buf(size - 1) As SByte
    If inStream.read(buf, 0, size) <> -1 Then
        crc.update(buf, 0, size)
        outStream.write(buf, 0, size)
    End If
    Dim entry As New java.util.zip.ZipEntry(System.IO.Path.GetFileName(Path))
    entry.setMethod(java.util.zip.ZipEntry.DEFLATED)
    entry.setSize(size)
    entry.setCrc(crc.getValue())
    outStream.putNextEntry(entry)

    inStream.close()
    outStream.closeEntry()
    outStream.flush()
  End Sub

=====================================
  MemoryStreamを使って
   Dim memStream As New System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes("文字列"))
  の後、putFileToZipの中身をどう変更すればいいのかさっぱりで…自分が情けない

引用返信 編集キー/
■50733 / inTopicNo.5)  Re[4]: .net 元ファイルを作らずに
□投稿者/ アサシオクマ (3回)-(2010/06/16(Wed) 15:31:48)
GZipStremでは(解凍したら文字化けしてましたが)以下の書き方で出来ました。
ZipOutputStreamだとByteとSByteの違いをどう書けば解決するかがまだ分かっておりません。

	Dim buf(1024) As Byte	' 1Kbytesずつ処理する
	' 出力ストリーム
	Dim outStream As New System.IO.FileStream(outFile, System.IO.FileMode.Create)

	' 圧縮ストリーム
	Dim compStream As New System.IO.Compression.GZipStream(outStream, System.IO.Compression.CompressionMode.Compress)

	Using memStream
		Using outStream
			Using compStream
				Do
					num = memStream.Read(buf, 0, buf.Length)
					If num <= 0 Then Exit Do
					compStream.Write(buf, 0, num)
				Loop
			End Using
		End Using
	End Using

引用返信 編集キー/
■50735 / inTopicNo.6)  Re[3]: .net 元ファイルを作らずにZIPファイル作成
□投稿者/ れい (933回)-(2010/06/16(Wed) 16:54:28)
No50723 (ぽぴ王子 さん) に返信
> やり方的にはそれでいいと思いますが、それだと GZip ファイル が作られるので ZIP ファイルをほしいという
> 要望には応えられないのかな?と思いました。
> 代替案であればいいのですけど、だとすれば代替案と書いておかないと期待されちゃうかしら?なんて心配を。

きゃー
ぽぴ王子さんのおっしゃる通り。
前投稿の私のやりかたではGZipでした。

Zipを作りたいなら
http://www.pkware.com/documents/casestudies/APPNOTE.TXT
に従ってヘッダー・内容・署名等を詰める必要があります。

圧縮せずにそのまま詰めることも可能ですし、
Deflateで圧縮して詰めることも可能です。

Deflateは.NetのDeflateStreamで可能ですが、
圧縮率はかなり悪く、私の調べたところでは大抵の場合100%を超えます。
つまり圧縮しない方がサイズが小さくなります。

なので…
実装もめんどくさくて性能もよくありません。

java.util.zip.ZipOutputStreamを使っていいのであればもっと簡単になります。

ZipOutputStreamにZipEntryを詰めて、
書きだしたい内容をZipOutputStream.writeで書けば完成するかと。

No.50732
> Dim inStream As New java.io.BufferedInputStream(New java.io.FileInputStream(Path))
この部分と
> Dim entry As New java.util.zip.ZipEntry(System.IO.Path.GetFileName(Path))
この部分の修正だけで大丈夫だと思いますが…

引用返信 編集キー/
■50738 / inTopicNo.7)  Re[4]: .net 元ファイルを作らずにZIPファイル作成
□投稿者/ かたぎり (32回)-(2010/06/16(Wed) 18:17:14)
java.utilってうまく参照できないことがあるみたいなので……

手前みそですが、以前私がZipファイル作るのに苦しんだ時の記録メモ(ブログ)がこちらに

http://blogs.wankuma.com/esten/archive/2009/09/13/181174.aspx

ブログ内のリンク先に、Zipファイル作成のためのライブラリプログラムソースと
Zipファイル作成のためのドキュメントへのリンクがあります

私はこちらのライブラリプログラムからZipファイル作成処理を実装して、
そのプログラムは現在も稼働中です。

ご参考になれば。
引用返信 編集キー/
■50793 / inTopicNo.8)  Re[4]: .net 元ファイルを作らずにZIPファイル作成
□投稿者/ アサシオクマ (5回)-(2010/06/17(Thu) 22:55:36)
No50735 (れい さん) に返信
> java.util.zip.ZipOutputStreamを使っていいのであればもっと簡単になります。
>
> ZipOutputStreamにZipEntryを詰めて、
> 書きだしたい内容をZipOutputStream.writeで書けば完成するかと。
>
> No.50732
>>Dim inStream As New java.io.BufferedInputStream(New java.io.FileInputStream(Path))
> この部分と
>>Dim entry As New java.util.zip.ZipEntry(System.IO.Path.GetFileName(Path))
> この部分の修正だけで大丈夫だと思いますが…

何とかやっとこさ上手く行きました。
ありがとうございました。

解決済み
引用返信 編集キー/
■50794 / inTopicNo.9)  Re[5]: .net 元ファイルを作らずにZIPファイル作成
□投稿者/ アサシオクマ (6回)-(2010/06/17(Thu) 22:57:06)
No50738 (かたぎり さん) に返信
> java.utilってうまく参照できないことがあるみたいなので……
>
> 手前みそですが、以前私がZipファイル作るのに苦しんだ時の記録メモ(ブログ)がこちらに
>
> http://blogs.wankuma.com/esten/archive/2009/09/13/181174.aspx
>
> ブログ内のリンク先に、Zipファイル作成のためのライブラリプログラムソースと
> Zipファイル作成のためのドキュメントへのリンクがあります
>
> 私はこちらのライブラリプログラムからZipファイル作成処理を実装して、
> そのプログラムは現在も稼働中です。
>
> ご参考になれば。

ありがとうございます。
参考にさせて頂きます。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -