我正在尝试使用MemoryStream如下的简单演示文本文件创建ZIP存档:
using (var memoryStream = new MemoryStream())
using (var archive = new ZipArchive(memoryStream , ZipArchiveMode.Create))
{
var demoFile = archive.CreateEntry("foo.txt");
using (var entryStream = demoFile.Open())
using (var streamWriter = new StreamWriter(entryStream))
{
streamWriter.Write("Bar!");
}
using (var fileStream = new FileStream(@"C:\Temp\test.zip", FileMode.Create))
{
stream.CopyTo(fileStream);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我运行此代码,则会创建存档文件本身,但不会创建foo.txt.
但是,如果我MemoryStream直接替换文件流,则会正确创建存档:
using (var fileStream = new FileStream(@"C:\Temp\test.zip", FileMode.Create))
using (var archive = new ZipArchive(fileStream, FileMode.Create))
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
是否可以使用a MemoryStream创建ZIP存档而不用FileStream?
我试图从一系列字节数组创建.NET 4.5(System.IO.Compression)中的Zip文件.作为一个例子,从我使用的API我结束了一个List<Attachment>,并且每个Attachment有一个名为属性Body是一个byte[].如何迭代该列表并创建包含每个附件的zip文件?
现在我的印象是我必须将每个附件写入磁盘并从中创建zip文件.
//This is great if I had the files on disk
ZipFile.CreateFromDirectory(startPath, zipPath);
//How can I create it from a series of byte arrays?
Run Code Online (Sandbox Code Playgroud) 我试图从一个条目的代码创建一个新的ZIP包,并将ZIP包保存到文件.我试图用System.IO.Compression.ZipArchive类来实现这一点.我正在使用以下代码创建ZIP包:
using (MemoryStream zipStream = new MemoryStream())
{
using (ZipArchive zip = new ZipArchive(zipStream, ZipArchiveMode.Create))
{
var entry = zip.CreateEntry("test.txt");
using (StreamWriter sw = new StreamWriter(entry.Open()))
{
sw.WriteLine(
"Etiam eros nunc, hendrerit nec malesuada vitae, pretium at ligula.");
}
Run Code Online (Sandbox Code Playgroud)
然后我将ZIP保存到WinRT中的文件:
var file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync("test.zip", CreationCollisionOption.ReplaceExisting);
zipStream.Position = 0;
using (Stream s = await file.OpenStreamForWriteAsync())
{
zipStream.CopyTo(s);
}
Run Code Online (Sandbox Code Playgroud)
或者在普通的.NET 4.5中:
using (FileStream fs = new FileStream(@"C:\Temp\test.zip", FileMode.Create))
{
zipStream.Position = 0;
zipStream.CopyTo(fs);
}
Run Code Online (Sandbox Code Playgroud)
但是,我无法在Windows资源管理器,WinRAR等中打开生成的文件.(我检查生成的文件的大小是否与zipStream的长度匹配,因此流本身已正确保存到文件中.)
我是做错了什么或者ZipArchive类有问题吗?
我的C#winforms 4.0应用程序一直使用线程安全的编写器来执行内部调试日志信息.当我的应用程序打开时,它会删除该文件并重新创建它.当应用关闭时,它会保存文件.
我想要做的是修改我的应用程序,以便它可以附加而不是替换.这是一个简单的修复.
但是,这是我的问题:
我想保留我的日志文件AROUND 10兆字节.我的约束很简单.当您关闭文件时,如果文件大于10兆字节,则删除前10%.
是否有一种"更好"的方式,然后执行以下操作:
编辑:好吧,我最后滚动自己(如下所示)移动到Log4Net的建议是一个很好的建议,但是学习新库和移动所有日志语句(数千)的时间不是时间对我试图做的小改进有效.
private static void PerformFileTrim(string filename)
{
var FileSize = Convert.ToDecimal((new System.IO.FileInfo(filename)).Length);
if (FileSize > 5000000)
{
var file = File.ReadAllLines(filename).ToList();
var AmountToCull = (int)(file.Count * 0.33);
var trimmed = file.Skip(AmountToCull).ToList();
File.WriteAllLines(filename, trimmed);
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序在自助服务终端(C#/ WPF)中的独立面板PC上运行.它对文本文件执行一些典型的日志记录操作.PC具有一些有限的磁盘空间来存储这些日志.
我需要做的是能够指定允许日志文件的最大大小.如果在尝试写入日志时超出最大大小,则会将新数据写入日志末尾,并从头开始清除最旧的数据.
获取文件大小没有问题,但有没有任何典型的文件操作技术来保持文件在一定的大小?
我尝试使用c#在内存中创建一个zip文件,但结果是一个zip文件,里面有损坏的文件.所有zip文件都在数据库中.我存储字节.文件是PDF.我的代码如下
//[extract bytes and file name for every file]
using (var zipArchiveMemoryStream = new MemoryStream())
{
using (var zipArchive = new ZipArchive(zipArchiveMemoryStream,
ZipArchiveMode.Create, true))
{
foreach (var file in fileData)
{
var zipEntry = zipArchive.CreateEntry(file.FileName);
using (var entryStream = zipEntry.Open())
{
using (var tmpMemory = new MemoryStream(file.Bytes))
{
tmpMemory.CopyTo(entryStream);
};
}
}
}
zipArchiveMemoryStream.Position = 0;
result = zipArchiveMemoryStream.GetBuffer();
//[download zip file]
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的支持
TONIGNO解决方案: 问题是我使用GetBuffer(); 而是ToArray();
using (var zipArchiveMemoryStream = new MemoryStream())
{
using (var zipArchive = new ZipArchive(zipArchiveMemoryStream, ZipArchiveMode.Create, …Run Code Online (Sandbox Code Playgroud)c# ×6
.net ×3
zip ×3
compression ×2
logging ×2
ziparchive ×2
.net-4.5 ×1
asp.net-mvc ×1
file ×1
file-io ×1
filesize ×1
streamwriter ×1
windows-8 ×1
winforms ×1