it-swarm.com.ru

Сжать один файл с помощью C #

Я использую .NET 4.5, и класс ZipFile прекрасно работает, если я пытаюсь заархивировать весь каталог с помощью «CreateFromDirectory». Однако я хочу заархивировать только один файл в каталоге. Я попытался указать на определенный файл (папка\data.txt), но это не работает. Я рассмотрел класс ZipArchive, поскольку у него есть метод «CreateEntryFromFile», но, похоже, это позволяет вам только создать запись в существующий файл. 

Нет ли способа просто заархивировать один файл, не создавая пустой zip-файл (который имеет свои проблемы), а затем используя метод «CreateEntryFromFile» ZipArchiveExtension?

** Это также предполагает, что я работаю над программой компании, которая в настоящее время не может использовать сторонние надстройки.

пример из: http://msdn.Microsoft.com/en-us/library/ms404280%28v=vs.110%29.aspx

        string startPath = @"c:\example\start";
        string zipPath = @"c:\example\result.Zip";
        string extractPath = @"c:\example\extract";

        ZipFile.CreateFromDirectory(startPath, zipPath);

        ZipFile.ExtractToDirectory(zipPath, extractPath);

Но если бы startPath был @"c:\example\start\myFile.txt;", он бы выдал ошибку, что каталог недействителен.

26
user3362735

Самый простой способ добиться этого - использовать временную папку.

Для архивирования:

  1. Создать временную папку
  2. Переместить файл в папку
  3. Папка zip
  4. Удалить папку

ДЛЯ РАСПАКОВКИ:

  1. Распаковать архив
  2. Переместить файл из временной папки в ваше местоположение
  3. Удалить временную папку
5
AlexanderBrevig

Используйте CreateEntryFromFile off для архива и используйте поток файла или памяти:

Использование файлового потока, если вы хорошо создаете Zip-файл, а затем добавляете в него:

using (FileStream fs = new FileStream(@"C:\Temp\output.Zip",FileMode.Create))
using (ZipArchive Arch = new ZipArchive(fs, ZipArchiveMode.Create))
{
    Arch.CreateEntryFromFile(@"C:\Temp\data.xml", "data.xml");
}

Или, если вам нужно сделать все в памяти и записать файл, как только это будет сделано, используйте поток памяти:

using (MemoryStream ms = new MemoryStream())
using (ZipArchive Arch = new ZipArchive(ms, ZipArchiveMode.Create))
{
    Arch.CreateEntryFromFile(@"C:\Temp\data.xml", "data.xml");
}

Затем вы можете записать MemoryStream в файл .

using (FileStream file = new FileStream("file.bin", FileMode.Create, System.IO.FileAccess.Write)) {
   byte[] bytes = new byte[ms.Length];
   ms.Read(bytes, 0, (int)ms.Length);
   file.Write(bytes, 0, bytes.Length);
   ms.Close();
}
36
John Koerner

Используя файловый (или любой) поток:

using (var Zip = ZipFile.Open("file.Zip", ZipArchiveMode.Create))
{
    var entry = Zip.CreateEntry("file.txt");
    entry.LastWriteTime = DateTimeOffset.Now;

    using (var stream= File.OpenRead(@"c:\path\to\file.txt"))
    using (var entryStream = entry.Open())
        stream.CopyTo(entryStream);
}

или короче:

// reference System.IO.Compression
using (var Zip = ZipFile.Open("file.Zip", ZipArchiveMode.Create))
    Zip.CreateEntryFromFile("file.txt", "file.txt");

убедитесь, что вы добавили ссылки на System.IO.Compression

Обновление

Также ознакомьтесь с новой документацией по API dotnet для ZipFile и ZipArchive . Там есть несколько примеров. Существует также предупреждение о ссылке System.IO.Compression.FileSystem на использование ZipFile.

Чтобы использовать класс ZipFile, вы должны ссылаться на Сборка System.IO.Compression.FileSystem в вашем проекте.

20
ziya

просто используйте следующий код для сжатия файла.

public void Compressfile()
        {
             string fileName = "Text.txt";
             string sourcePath = @"C:\SMSDBBACKUP";
             DirectoryInfo di = new DirectoryInfo(sourcePath);
             foreach (FileInfo fi in di.GetFiles())
             {
                 //for specific file 
                 if (fi.ToString() == fileName)
                 {
                     Compress(fi);
                 }
             } 
        }

public static void Compress(FileInfo fi)
        {
            // Get the stream of the source file.
            using (FileStream inFile = fi.OpenRead())
            {
                // Prevent compressing hidden and 
                // already compressed files.
                if ((File.GetAttributes(fi.FullName)
                    & FileAttributes.Hidden)
                    != FileAttributes.Hidden & fi.Extension != ".gz")
                {
                    // Create the compressed file.
                    using (FileStream outFile =
                                File.Create(fi.FullName + ".gz"))
                    {
                        using (GZipStream Compress =
                            new GZipStream(outFile,
                            CompressionMode.Compress))
                        {
                            // Copy the source file into 
                            // the compression stream.
                            inFile.CopyTo(Compress);

                            Console.WriteLine("Compressed {0} from {1} to {2} bytes.",
                                fi.Name, fi.Length.ToString(), outFile.Length.ToString());
                        }
                    }
                }
            }
        }

    }
0
Jeetendra Negi

В .NET существует несколько способов решения этой проблемы для одного файла. Если вы не хотите изучать все там, вы можете получить абстрактную библиотеку, такую ​​как SharpZipLib (давно существующая библиотека с открытым исходным кодом), sevenzipsharp (под ней требуется 7Zip libs) или DotNetZip.

0
Gregory A Beamer