相关疑难解决方法(0)

使用System.IO.Compression在内存中创建ZIP存档

我正在尝试使用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 c# compression zip ziparchive

163
推荐指数
5
解决办法
15万
查看次数

从byte []创建zip文件

我试图从一系列字节数组创建.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)

.net c# asp.net-mvc zip .net-4.5

46
推荐指数
2
解决办法
4万
查看次数

ZipArchive创建无效的ZIP文件

我试图从一个条目的代码创建一个新的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类有问题吗?

.net c# ziparchive windows-8

45
推荐指数
2
解决办法
4万
查看次数

使用StreamWriter实现滚动日志,并从顶部删除

我的C#winforms 4.0应用程序一直使用线程安全的编写器来执行内部调试日志信息.当我的应用程序打开时,它会删除该文件并重新创建它.当应用关闭时,它会保存文件.

我想要做的是修改我的应用程序,以便它可以附加而不是替换.这是一个简单的修复.

但是,这是我的问题:

我想保留我的日志文件AROUND 10兆字节.我的约束很简单.当您关闭文件时,如果文件大于10兆字节,则删除前10%.

是否有一种"更好"的方式,然后执行以下操作:

  1. 关闭文件
  2. 检查文件是否> 10 meg
  3. 如果是,请打开该文件
  4. 解析整个事情
  5. 剔除前10%
  6. 把文件写回来

编辑:好吧,我最后滚动自己(如下所示)移动到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# file-io logging streamwriter winforms

9
推荐指数
2
解决办法
8946
查看次数

将日志文件保持在一定大小

我有一个应用程序在自助服务终端(C#/ WPF)中的独立面​​板PC上运行.它对文本文件执行一些典型的日志记录操作.PC具有一些有限的磁盘空间来存储这些日志.

我需要做的是能够指定允许日志文件的最大大小.如果在尝试写入日志时超出最大大小,则会将新数据写入日志末尾,并从头开始清除最旧的数据.

获取文件大小没有问题,但有没有任何典型的文件操作技术来保持文件在一定的大小?

c# logging file filesize file-manipulation

7
推荐指数
2
解决办法
1万
查看次数

如何在内存中创建一个zip文件,从文件字节开始?

我尝试使用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# compression zip

5
推荐指数
1
解决办法
4464
查看次数