|
■No79975 (hide さん) に返信 > 初めて質問します。 > > .NET Framework 4.5環境で、ZipArchiveクラスによるアーカイブ作成を行って見たのですが、出来上がるzipファイルが不正な物になってしまいます。 > サンプル実装は以下の通りです。 > > FileStream fs=new FileStream( "c:\\temp\\test.zip",FileMode.Create ,FileAccess.Write ); > ZipArchive arc=new ZipArchive( fs , ZipArchiveMode.Create ); > foreach( string filename in Directory.GetFiles("c:\\" ) ) { > ZipArchiveEntry entry = arc.CreateEntry( System.IO.Path.GetFileName( filename ) ) ; > Stream stEntry=entry.Open(); > System.IO.FileStream fsRead = new FileStream( filename , FileMode.Open, FileAccess.Read); > fsRead.CopyTo( stEntry ); > fsRead.Close(); > stEntry.Close(); > } > > 上記実装にて、ファイルが格納されたZIPファイルは出来上がるのですが、何故かZIP内の各ファイルのCRC値がすべてゼロになってしまいます。結果、そのままでは「ファイルが壊れている」として展開できません。 > ただし、出来上がったZIPファイルをWinZipを使って「修復」すればCRCが入り、普通に展開できるようになります。もちろん展開されたファイルにも異常は見受けられません。 > > どうしてこういう動作になるか、ご存知の方は居られませんでしょうか。 > > C:\ を対象にしているからなんてことはないですよね?
現在の Windows では、ルートディレクトリを対象に何かを行うということは一般的には行いません。 というか、MS-DOSの時代にまでさかのぼっても、ルートディレクトリのファイルを操作するのは、 一部のシステム設定用のファイル(CONFIG.SYS と AUTOEXEC.BAT)くらいで通常のデータファイルや各種 プログラム類は、サブディレクトリを用意するのが一般的だと思います。
ま、それはともかくとして、
CreaterEntryFromFile 拡張メソッドではダメですか?
具体的には、 foreach の中を
arc.CreateEntryFromFile( filename, SYstem.IO.Path.GetFileName( filename ) );
の1行に置き換えるだけです。
|