Как загрузить zip файл с сайта, а затем его распаковать?

255
07 ноября 2017, 23:18

Скачиваю во временную папку архив tempp.zip

 System.Net.WebClient miner = new System.Net.WebClient();
 load1.DownloadFileAsync(new Uri("http:/site.pro/tempp.zip"), 
 Path.GetTempPath() + "\\tempp.zip"); // Скачиваем в %temp%
 while (load1.IsBusy) { } // дождаться завершения загрузки

А потом пытаюсь заэкстрактить

  ZipFile.ExtractToDirectory(Path.GetTempPath() + "\\tempp.zip", Path.GetTempPath());

Но архив не хочет распаковываться ,как быть ?

Answer 1

Вот пример работы через System.Net.Http.HttpClient

class Program
{
    static void Main(string[] args)
    {
        string downloadUrl = "http://www.phantastike.com/agni_yoga/simfoniya_1/zip/";
        string pathToFile = @"D:\simfoniya.zip";
        Task.Run(async () => await DownloadFile(downloadUrl, pathToFile))
            .ContinueWith((result) => UnzipFile(pathToFile));
        Console.ReadLine();
    }
    private static async Task DownloadFile(string downloadUrl, string pathToFile)
    {
        HttpClient client = new HttpClient();
        using (HttpResponseMessage response = client.GetAsync(downloadUrl, HttpCompletionOption.ResponseHeadersRead).Result)
        {
            response.EnsureSuccessStatusCode();
            using (Stream contentStream = await response.Content.ReadAsStreamAsync(),
                fileStream = new FileStream(pathToFile, FileMode.Create, FileAccess.Write, FileShare.None, 8192, true))
            {
                var totalRead = 0L;
                var totalReads = 0L;
                var buffer = new byte[8192];
                var isMoreToRead = true;
                do
                {
                    var read = await contentStream.ReadAsync(buffer, 0, buffer.Length);
                    if (read == 0)
                    {
                        isMoreToRead = false;
                    }
                    else
                    {
                        await fileStream.WriteAsync(buffer, 0, read);
                        totalRead += read;
                        totalReads += 1;
                        if (totalReads % 10 == 0)
                        {
                            Console.WriteLine($"Загружаем файл. Загружено: {totalRead:n0}");
                        }
                    }
                }
                while (isMoreToRead);
                Console.WriteLine($"Готово! Файл загружен.");
            }
        }
    }
    private static void UnzipFile(string pathToFile)
    {
        if (!File.Exists(pathToFile))
        {
            Console.WriteLine("Указанный файл не найден.");
            return;
        }
        Console.WriteLine("Начинаем распаковку...");
        ZipFile.ExtractToDirectory(pathToFile, Path.GetDirectoryName(pathToFile));
        Console.WriteLine("Готово!");
    }
}
READ ALSO
C#: инициализация строки с JSON

C#: инициализация строки с JSON

Есть такие классы:

246
Передача объекта по ссылке в другой процесс

Передача объекта по ссылке в другой процесс

Существует ли какой-нибудь механизм передачи объектов именно по ссылке из одного процесса в другой? Чтобы несколько программ могли взаимодействовать...

252
обновление UI в потоке из ViewModel

обновление UI в потоке из ViewModel

При попытке использовать в отдельном потоке вылетает ошибка SystemWindows

453
Оптимизация реализации программы

Оптимизация реализации программы

У меня будет программа, примерную реализацию я приведу в кодеСуть программы, вначале она получает данные из БД, затем эти данные приводит...

261