我正在使用.Net 4.5.2 System.IO.Compression.ZipArchive类处理一些第三方ZIP文件,并且一切正常.
但是,我需要从目录条目中分离文件条目,最好不先提取它们.
有没有办法判断ZipArchive条目是否是一个没有提取它的目录?
据我所知,ZipArchiveEntry没有任何属性可以告诉它是文件还是目录.
我正在尝试使用一些字节数组数据动态创建一个zip流,并通过我的MVC动作下载.
但是,在Windows中打开时,下载的文件总是会出现以下损坏的错误.
当我尝试从7z提取时出现此错误
但请注意,从7z中提取的文件未损坏.
我正在使用ZipArchive,以下是我的代码.
private byte[] GetZippedPods(IEnumerable<POD> pods, long consignmentID)
{
using (var zipStream = new MemoryStream())
{
//Create an archive and store the stream in memory.
using (var zipArchive = new ZipArchive(zipStream, ZipArchiveMode.Create, true))
{
int index = 1;
foreach (var pod in pods)
{
var zipEntry = zipArchive.CreateEntry($"POD{consignmentID}{index++}.png", CompressionLevel.NoCompression);
using (var originalFileStream = new MemoryStream(pod.ByteData))
{
using (var zipEntryStream = zipEntry.Open())
{
originalFileStream.CopyTo(zipEntryStream);
}
}
}
return zipStream.ToArray();
}
}
}
public ActionResult DownloadPOD(long consignmentID) …Run Code Online (Sandbox Code Playgroud) 我正在使用标准的VB.NET库来提取和压缩文件.它的工作原理也是如此,但是当我必须提取文件时,问题就出现了.
我用的代码
进口:
Imports System.IO.Compression
Run Code Online (Sandbox Code Playgroud)
方法我崩溃时调用
ZipFile.ExtractToDirectory(archivedir, BaseDir)
Run Code Online (Sandbox Code Playgroud)
archivedir和BaseDir也被设置,实际上如果没有要覆盖的文件它就可以工作.这个问题恰恰出现了.
如何在不使用第三方库的情况下覆盖提取中的文件?
(注意我使用的是参考System.IO.Compression和System.IO.Compression.Filesystem)
由于文件放在已存在文件的多个文件夹中,我将避免手动
IO.File.Delete(..)
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个包含一个或多个文件的zip文件.
我正在使用.NET framework 4.5,更具体地说是System.IO.Compression命名空间.
目标是允许用户通过ASP.NET MVC应用程序下载zip文件.
正在生成zip文件并将其发送到客户端但是当我尝试通过双击它来打开它时,我收到以下错误:
Windows无法打开该文件夹.压缩(zipped)文件夹...无效.
这是我的代码:
[HttpGet]
public FileResult Download()
{
var fileOne = CreateFile(VegieType.POTATO);
var fileTwo = CreateFile(VegieType.ONION);
var fileThree = CreateFile(VegieType.CARROT);
IEnumerable<FileContentResult> files = new List<FileContentResult>() { fileOne, fileTwo, fileThree };
var zip = CreateZip(files);
return zip;
}
private FileContentResult CreateFile(VegieType vType)
{
string fileName = string.Empty;
string fileContent = string.Empty;
switch (vType)
{
case VegieType.BATATA:
fileName = "batata.csv";
fileContent = "THIS,IS,A,POTATO";
break;
case VegieType.CEBOLA:
fileName = "cebola.csv";
fileContent = "THIS,IS,AN,ONION";
break;
case VegieType.CENOURA:
fileName …Run Code Online (Sandbox Code Playgroud) 我正在使用下面的代码下载一些 zip 存档:
$client = new-object System.Net.WebClient
$client.DownloadFile("https://chromedriver.storage.googleapis.com/$LatestChromeRelease/chromedriver_win32.zip","D:\MyFolder.zip")
Run Code Online (Sandbox Code Playgroud)
结果我得到了包含所需文件的 ZIP 存档“MyFolder.zip”(让我们想象一下“test.txt”)。
如何将这个特定文件从 ZIP 存档提取到给定文件夹中?
我正在开发一个项目来压缩从几个 mb 到几个 GB 的文件,我正在尝试使用 powershell 将它们压缩成 .zip。我遇到的主要问题是使用压缩存档对单个文件大小有 2 GB 上限,我想知道是否有另一种方法来压缩文件。
编辑:
因此,对于这个项目,我们希望实现一个系统,从 Outlook 获取 .pst 文件并将其压缩为 .zip 并将其上传到服务器。上传后,它们将从新设备中拉出并再次提取到 .pst 文件中。
powershell zip system.io.compression compress-archive system.io.compression.zipfile
在执行以下代码时..我在OpenRead语句中遇到异常:
找不到中央目录记录的结尾。
但是,我可以通过 Windows 资源管理器毫无问题地打开 zip 文件。
有什么想法吗?
string zipPath = @"c:\testfiles\MMM_C13000_2016M08.zip";
using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
}
}
Run Code Online (Sandbox Code Playgroud) 首先,我想说我已经尝试寻找解决方案,我没有找到一个我不必解压缩,添加我的文件夹,然后再拉链.我没有使用任何第三方库.如果可能的话,我想使用system.io.compression来做这个...如果不是,我会使用dotnetzip作为我的最后手段.
TL;博士.我希望能够将包含文件的目录添加到已创建的zip文件中.这可以使用system.io.compression库吗?
编辑:
using (FileStream zipToOpen = new FileStream(zipfile, FileMode.Open))
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
{
ZipArchiveEntry readmeEntry = archive.CreateEntry("testFolder/");
}
}
Run Code Online (Sandbox Code Playgroud)
所以,使用这段代码我可以在里面创建一个文件夹,但它里面没有任何文件.我现在的问题是我是否必须再次运行此代码才能将我的源文件夹中的每个文件都放到zip文件夹中,或者有更好的方法吗?
.NET 4.5添加了新的类来处理zip存档.现在你可以这样做:
using (ZipArchive archive = ZipFile.OpenRead(zipFilePath))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
// Extract it to the file
entry.ExtractToFile(entry.Name);
// or do whatever you want
using (Stream stream = entry.Open())
{
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
显然,如果您使用大型存档,则可能需要几秒甚至几分钟才能从存档中读取文件.因此,如果您正在编写一些GUI应用程序(WinForms或WPF),您可能会在单独的线程中运行此类代码,否则您将阻止UI线程并使您的应用程序用户非常沮丧.
但是,此代码中的所有I/O操作都将在2016年被视为"不酷" 的阻塞模式下执行.因此,有两个问题:
System.IO.Compression类(或者可能与其他第三方.NET库)获得异步I/O ?更新:
回答Peter Duniho的回答:是的,你是对的.出于某种原因,我没有考虑这个选项:
using (Stream zipStream = entry.Open())
using (FileStream fileStream = new FileStream(...))
{
await zipStream.CopyToAsync(fileStream);
}
Run Code Online (Sandbox Code Playgroud)
绝对有效.谢谢!
顺便说说
await Task.Run(() => entry.ExtractToFile(entry.Name));
Run Code Online (Sandbox Code Playgroud)
还会 是CPU限制的阻塞I/O操作,只是在单独的线程中 在I/O操作期间消耗线程池中的线程.
但是,我可以看到.NET的开发人员仍然使用阻塞I/O进行某些归档操作(例如,此代码枚举归档中的条目,例如:dotnet @ github上的ZipArchive.cs …
我正在尝试压缩和解压缩一些信息。
对于压缩,我使用了代码项目,它似乎有效。我现在正在压缩字符串。
对于解压缩,我想压缩一个 Stream
这就是我目前所拥有的
var zipString = _compressor.Compress(request);
using (var sw = new StreamWriter(req.GetRequestStream()))
{
sw.Write(zipString);
sw.Close();
}
WebResponse respStream = req.GetResponse();
Stream resp = respStream.GetResponseStream();
resp = _compressor.UnCompress(resp);
Run Code Online (Sandbox Code Playgroud)
这是压缩的代码
public string Compress(string s)
{
//Transforming string into byte
var byteArray = new byte[s.Length];
var indexBa = 0;
foreach (var item in s.ToCharArray())
{
byteArray[indexBa++] = (byte) item;
}
//prepare for compress
var ms = new MemoryStream();
var sw = new …Run Code Online (Sandbox Code Playgroud) 我们有一个 Asp.Net MVC 项目,最近从 .Net 4.6.1 升级到 .Net 4.8。它对我们解决方案中也已升级的其他项目有一些依赖。MVC 项目本身使用 System.IO.Compression 来压缩一些文件,就像它所依赖的其他项目之一一样。
\n自从升级以来,我们发现 System.IO.Compression 出现了一些奇怪的行为。如果我们构建新的解决方案,它不会自动将 System.IO. Compression.dll 和 System.IO. Compression.FileSystem.dll 复制到输出 bin 文件夹。这会导致尝试执行 zipping\xe2\x80\xa6 的代码行出现运行时异常
\nSystem.IO.FileNotFoundException:“无法加载文件或程序集“System.IO.Compression,版本= 4.2.0.0,文化=中性,PublicKeyToken = b77a5c561934e089”或其依赖项之一。该系统找不到指定的文件。'
\n如果 dll 甚至没有复制到 bin 文件夹,我想这并不奇怪。
\n如果我在 MVC 项目引用中的 System.IO.Compression.dll 和 System.IO.Compression.FileSystem.dll 上将“复制本地”属性设置为 true,则文件将从
\n将“C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework.NETFramework\\v4.8”复制到bin文件夹中,但应用程序首次启动时浏览器中显示以下错误\xe2\ x80\xa6
\n[BadImageFormatException: Cannot load a reference assembly for execution.]\n\n[BadImageFormatException: Could not load file or assembly 'System.IO.Compression' or one of its dependencies. Reference assemblies should not be loaded …Run Code Online (Sandbox Code Playgroud) 官方 C# 文档指出,ZipFile.CreateFromDirectory()作为中间步骤,在磁盘上创建一个 zip 文件。但是,我需要我的系统在磁盘空间至关重要的设备上运行。我可以以某种方式在内存中创建 Zipfile 吗?
c# ×8
.net ×7
compression ×4
zip ×4
asp.net-mvc ×2
powershell ×2
.net-4.8 ×1
asynchronous ×1
c#-4.0 ×1
diskspace ×1
gzip ×1
io ×1
system.io.compression.zipfile ×1
unzip ×1
vb.net ×1