- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
使用 DotNetZip 时,是否可以在调用 Save(stream) 之前获取最终的 zip 文件大小?我有一个应用程序(Window 服务),其中包流大小超过 100MB,然后将保存包并将即将到来的文件添加到新包中。
我得到了 same question for web application但不明白答案。在保存到 I/O 系统之前,是否有任何方法可以进入 DotnetZip 来查找 zip 流的大小?
最佳答案
我得到了解决方案。这是代码。现在我将创建大小小于 100MB 的包。
using System;
using System.Collections;
using System.IO;
using Ionic.Zip;
using Ionic.Zlib;
namespace ZipFileSize1
{
/// <summary>
/// This source code is generate the specified size Packages from the directory.
/// </summary>
class Program
{
/// <summary>
/// The size of Package(100MB).
/// </summary>
public static long m_packageSize = 1024 * 1024 * 100;
/// <summary>
/// Main method of program class.
/// </summary>
/// <param name="args">Command line argument</param>
static void Main(string[] args)
{
Console.WriteLine("Enter Directory Full Name for Compression : ");
var dir = Console.ReadLine();
Console.WriteLine("Zip File saved Location Directory Name : ");
var savedir = Console.ReadLine();
//generate the random zip files.
var zipFile = Path.Combine(savedir, DateTime.Now.Ticks + ".zip");
ZipFiles(dir, savedir);
Console.ReadLine();
}
/// <summary>
/// This method generate the package as per the <c>PackageSize</c> declare.
/// Currently <c>PackageSize</c> is 100MB.
/// </summary>
/// <param name="inputFolderPath">Input folder Path.</param>
/// <param name="outputFolderandFile">Output folder Path.</param>
public static void ZipFiles(string inputFolderPath, string outputFolderandFile)
{
ArrayList ar = GenerateFileList(inputFolderPath); // generate file list
int trimLength = (Directory.GetParent(inputFolderPath)).ToString().Length;
// find number of chars to remove // from original file path
trimLength += 1; //remove '\'
// Output file stream of package.
FileStream ostream;
byte[] obuffer;
// Output Zip file name.
string outPath = Path.Combine(outputFolderandFile, DateTime.Now.Ticks + ".zip");
ZipOutputStream oZipStream = new ZipOutputStream(File.Create(outPath), true); // create zip stream
// Compression level of zip file.
oZipStream.CompressionLevel = CompressionLevel.Default;
// Initialize the zip entry object.
ZipEntry oZipEntry = new ZipEntry();
// numbers of files in file list.
var counter = ar.Count;
try
{
using (ZipFile zip = new ZipFile())
{
Array.Sort(ar.ToArray()); // Sort the file list array.
foreach (string Fil in ar.ToArray()) // for each file, generate a zip entry
{
if (!Fil.EndsWith(@"/")) // if a file ends with '/' its a directory
{
if (!zip.ContainsEntry(Path.GetFullPath(Fil.ToString())))
{
oZipEntry = zip.AddEntry(Path.GetFullPath(Fil.ToString()), Fil.Remove(0, trimLength));
counter--;
try
{
if (counter > 0)
{
if (oZipStream.Position < m_packageSize)
{
oZipStream.PutNextEntry(oZipEntry.FileName);
ostream = File.OpenRead(Fil);
obuffer = new byte[ostream.Length];
ostream.Read(obuffer, 0, obuffer.Length);
oZipStream.Write(obuffer, 0, obuffer.Length);
}
if (oZipStream.Position > m_packageSize)
{
zip.RemoveEntry(oZipEntry);
oZipStream.Flush();
oZipStream.Close(); // close the zip stream.
outPath = Path.Combine(outputFolderandFile, DateTime.Now.Ticks + ".zip"); // create new output zip file when package size.
oZipStream = new ZipOutputStream(File.Create(outPath), true); // create zip stream
}
}
else
{
Console.WriteLine("No more file existed in directory");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
zip.RemoveEntry(oZipEntry.FileName);
}
}
else
{
Console.WriteLine("File Existed {0} in Zip {1}", Path.GetFullPath(Fil.ToString()), outPath);
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
oZipStream.Flush();
oZipStream.Close();// close stream
Console.WriteLine("Remain Files{0}", counter);
}
}
/// <summary>
/// This method return the list of files from the directory
/// Also read the child directory also, but not add the 0 length file.
/// </summary>
/// <param name="Dir">Name of directory.</param>
/// <returns>return the list of all files including into subdirectory files </returns>
private static ArrayList GenerateFileList(string Dir)
{
ArrayList fils = new ArrayList();
foreach (string file in Directory.GetFiles(Dir, "*.*", SearchOption.AllDirectories)) // add each file in directory
{
if (File.ReadAllBytes(file).Length > 0)
fils.Add(file);
}
return fils; // return file list
}
}
}
关于c# - DotNetZip - 在 C# 中调用 Save(stream) 之前计算最终的 zip 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10815633/
由于我对 Visual Studio 很陌生,所以这个问题可能听起来有点愚蠢: 如何安装 DotNetZip 库?我正在使用适用于 Windows 桌面的 Visual Studio Express
我有一个非常简单的程序,使用 DotNetZip(最新版本)和 C#.Net、VS2010。当它尝试保存已压缩的文件时,它已开始挂起。没有错误消息,什么也没有。它运行了很长一段时间,然后突然开始出现这
我使用 DotNetZip 库进行了快速测试,该库打开一个充满 .bmp 文件的 zip 文件并将它们转换为 .jpg 格式。 在此之前,我将所有文件写入一个文件夹,转换它们,保存 jpg 文件,然后
我正在使用 DotNetZip从 zip 文件中提取文件的库。 using(ZipFile zip = ZipFile.Read(zipLocation)) { foreach (ZipEnt
嗯! using (ZipFile zip = new ZipFile()) { // add this map file into the "images" directory in
我正在尝试压缩一堆文件并通过流使数据可用。 我希望内存占用尽可能小。 我的想法是实现一个 Stream,其中我有一堆 FileStream 对象作为数据成员。当我的 Stream 上的 Read 方法
我正在使用 C# 进行开发,并使用 Dotnetzip 的源代码在一个文件中获取应用程序。 但是在运行时,我得到了异常: System.OverflowException: Arithmetic op
我正在尝试创建一个将流式传输给用户的 DotNetZip zip 文件。在 zip 文件中,我插入了两个内存流。但是由于某种原因,当我打开 zip 文件时,它是空的。我查看了文档,发现几乎没有帮助。我
我正在使用 DotNetZip。当我正常归档具有英文名称的文件时。但是当我在结果存档中使用错误的文件名存档带有俄罗斯名称的文件时。有人说那个字符串 ZipConstants.DefaultCodePa
这个问题解决了。我的错误是在我的第二个代码块中,我使用的是 SaveProgress 而不是 ExtractProgress,并且在设置事件处理程序之前我使用的是 Zip.ExtractAll。感谢B
string desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); public
类似的问题都不是我要找的! 下面的代码有什么问题?files是文件内容的文本数组,fileNames是对应的文件名数组。 这段代码总是在倒数第二行的 Save 方法失败,但我不明白为什么流会被关闭!
我已经下载了 DotNetZip from codeplex我完全不知道下一步该怎么做。 我想提取一个.zip 存档 我知道我用的是这样的 string zipToUnpack = "C1P3SML.
当我使用 DotNetZip 创建存档时,它会将文件名中的国家字母更改为其对应的英文字母。 (Ł --> L) 这对我来说真的很糟糕,因为它破坏了我的备份应用程序。我尝试将编码更改为utf8、1252
我有一个在任务中执行压缩解压缩的方法。现在我想要取消操作的能力。但是当我调用 Cancel() 方法时,一切似乎都立即停止并且 while 永远运行: public class OsiSourceZi
我通过以下方式使用 dotnet zip: using (ZipFile zip = new ZipFile(@"E:\test2.zip")) { zip.ParallelDeflate
我正在尝试使用 DotNetZip 库将文件提取到当前工作目录的方法,虽然我似乎无法做到这一点,但它需要一个文件路径: private void unzipfiles() { using (v
问候.... 我正在用 c# 3.5 编写一个备份程序,使用的是最新的 DotNetZip。该程序的基础是在服务器上指定一个位置和跨区 zip 文件的最大大小,然后运行。从那里它应该遍历给定位置的所有
我无法想象这很难做到,但我一直无法让它发挥作用。我有一个文件类,它只存储我要压缩的文件的位置、目录和名称。我正在压缩的文件存在于磁盘上,因此 FileLocation 是完整路径。磁盘上不存在 Zip
我正在使用 DotNetZip 将文件从 MemoryStream 添加到 zip 文件,然后将该 zip 保存为 MemoryStream,以便我可以将其作为附件通过电子邮件发送.下面的代码没有错误
我是一名优秀的程序员,十分优秀!