Zip архив в zennoposter

Nikitos

Client
Регистрация
15.09.2016
Сообщения
46
Благодарностей
6
Баллы
8
Добрый день. У меня стоит задача, скачать zip архив, содержащий множество файлов, и достать из него всего один файл xml и добавить эти данные в таблицу. В принципе извлечение файлов из архива находил на форуме, но проблема в том что архив тяжелый, и в нем много файлов, и таких архивов много, поэтому необходимо еще предусмотреть удаление "использованных" архивов, и лишних файлов, извлеченных из архивов. А это уж больно геморойно, да нагрузка на машину, и время обработки данных.

Так вот вопрос:
неужели нельзя как то упростить эту процедуру ? Возможно ли извлечение из архива конкретного файла с последующим удалением? Может возможно избежать извлечения вовсе.
Спасибо.
 
  • Спасибо
Реакции: ParfeniyAnton

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 367
Благодарностей
3 292
Баллы
113
Добавить в GAC:
System.IO.Compression.dll
System.IO.Compression.FileSystem.dll

Добавить в Using:
C#:
using System;
using System.IO;
using System.IO.Compression;
Cниппет:
C#:
string zipPath = @"C:\test.zip"; // путь к архиву
string targetFile = @"target.txt"; // целевой файл (только английское имя, иначе нужна перекодировка строки)
string extractPath = @"D:\targetfolder\"; // куда распаковать

using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
    archive.GetEntry(targetFile).ExtractToFile(Path.Combine(extractPath, targetFile));
}

File.Delete(@"D:\target.txt"); // удаление файла
Не поможет в плане скорости, если архив непрерывный.

upd: Видел возможность скачивать файлы без скачивания всего архива тут (портативка без интеграции в систему).
 

Nikitos

Client
Регистрация
15.09.2016
Сообщения
46
Благодарностей
6
Баллы
8
Добавить в GAC:
System.IO.Compression.dll
System.IO.Compression.FileSystem.dll

Добавить в Using:
using System;
using System.IO;
using System.IO.Compression;

Cниппет:
Код:
string zipPath = @"C:\test.zip"; // путь к архиву
string targetFile = @"target.txt"; // целевой файл (только английское имя, иначе нужна перекодировка строки)
string extractPath = @"D:\targetfolder\"; // куда распаковать

using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
    archive.GetEntry(targetFile).ExtractToFile(Path.Combine(extractPath, targetFile));
}

File.Delete(@"D:\target.txt"); // удаление файла
Не поможет в плане скорости, если архив непрерывный.

upd: Видел в некоторых платных программах, возможность скачивать файлы без скачивания всего архива, но вот бесплатных реализаций в виде либы, пока не находил...

Либо пробовать онлайн сервисы.
Спасибо большое, это то что мне нужно. Но снеппет постоянно выдает ошибку, удалось только извлечь все содержимое из архива вот так: http://zennolab.com/discussion/threads/kak-poluchit-proksi-iz-profilja-v-proekte-bez-brauzera.24517/#post-169435 но это мою проблему не решает.

Возникает еще вопрос, как спарсить содержимое архива, что найти нужный файл (имена нужных файлов всегда различно, постоянно только расширение файла - xml)
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 367
Благодарностей
3 292
Баллы
113
Но снеппет постоянно выдает ошибку
А какая ошибка? Правильно ли указаны пути? Существуют ли папки?

как спарсить содержимое архива, что найти нужный файл
Распаковать все xml файлы
Код:
string zipPath = @"c:\example\start.zip";
string extractPath = @"c:\example\extract";

using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
        if (entry.FullName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
        {
             entry.ExtractToFile(Path.Combine(extractPath, entry.FullName));
        }
    }
}
upd: Подправил.
 
Последнее редактирование:
  • Спасибо
Реакции: SHILY, Sergodjan и Nikitos

Nikitos

Client
Регистрация
15.09.2016
Сообщения
46
Благодарностей
6
Баллы
8
Код:
string zipPath = @"D:\test.zip"; // путь к архиву
string extractPath = @"D:\"; // куда распаковать

using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
if (entry.FullName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
{
entry.ExtractToFile(Path.Combine(extractPath, entry.FullName));
}
Да, все пути и папки соответствуют, в архив добавил два тестовых файла: один txt, другой xml
15.02.jpg
Ошибка: Компиляция кода Ошибка в действии "CS1513" ожидалась }". [Строка: 15, столбец: 2]
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
наверно так
C#:
string zipPath = @"D:\test.zip"; // путь к архиву
string extractPath = @"D:\"; // куда распаковать
using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
        if (entry.FullName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
        {
            entry.ExtractToFile(Path.Combine(extractPath, entry.FullName));
        }
    }
}
 
  • Спасибо
Реакции: Sergodjan и Yuriy Zymlex

ParfeniyAnton

Client
Регистрация
24.08.2014
Сообщения
300
Благодарностей
49
Баллы
28
Респект Zymlex!
Как раз понадобилось в новом проекте разархивировать zip архивы!
Воспользовался вашей инструкцией и кодом!
Благодарствую!
 
  • Спасибо
Реакции: Yuriy Zymlex

GREXA

Client
Регистрация
16.09.2017
Сообщения
276
Благодарностей
103
Баллы
43
такой вопрос . А если наоборот есть у меня 4 файла их все надо запаковать в rar архив . Как это можно сделать?
 

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
А если наоборот есть у меня 4 файла их все надо запаковать в rar архив
внутри папки winrar лежит файл rar.exe, через bat файл или вызов позволяет упаковать файлы.
 

mrstorm

Client
Регистрация
16.04.2015
Сообщения
205
Благодарностей
14
Баллы
18
наверно так
C#:
string zipPath = @"D:\test.zip"; // путь к архиву
string extractPath = @"D:\"; // куда распаковать
using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
        if (entry.FullName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
        {
            entry.ExtractToFile(Path.Combine(extractPath, entry.FullName));
        }
    }
}
Добрый день!
Вставляю код в проект, указываю ссылки на архив и куда распаковывать без переменных - все работает. Заменяю на переменные - ошибка!
"Компиляция кода Ошибка в действии "CS1002" "; expected". [Строка: 0; Cтолбец: 43]"

C#:
string zipPath = @"project.Variables["html"].Value"; // путь к архиву
string extractPath = @"project.Variables["put_RAND_papka"].Value"; // куда распаковать
using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
        if (entry.FullName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
        {
            entry.ExtractToFile(Path.Combine(extractPath, entry.FullName));
        }
    }
}
Что делаю не так?
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 443
Благодарностей
8 672
Баллы
113
  • Спасибо
Реакции: mrstorm

mrstorm

Client
Регистрация
16.04.2015
Сообщения
205
Благодарностей
14
Баллы
18
  • Спасибо
Реакции: Sergodjan

GerardFrank

Client
Регистрация
26.12.2019
Сообщения
12
Благодарностей
0
Баллы
1

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 443
Благодарностей
8 672
Баллы
113

GerardFrank

Client
Регистрация
26.12.2019
Сообщения
12
Благодарностей
0
Баллы
1
В коде по ссылке https://zennolab.com/discussion/threads/zip-arxiv-v-zennoposter.46311/post-343494
в 8-ой строке можно убрать маску (удалить расширение .xml между кавычками).
Почти получилось, но выдаёт ошибку
Выполнение действия CSharp OwnCode. Не удалось найти часть пути "C:\Work\zenno\autodownload\land\content\js\jquery-1.12.4.min.js".
С чем это может быть связано?
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 367
Благодарностей
3 292
Баллы
113
Добавьте в GAC: System.IO.Compression.FileSystem
В using'и: using System.IO.Compression;
C#:
string zipPath = project.Variables["zip"].Value; // переменная PM "zip" с путём к файлу
string extractPath = project.Variables["folder"].Value; // переменная PM "folder" с путём к папке

ZipFile.ExtractToDirectory(zipPath, extractPath);
 

GerardFrank

Client
Регистрация
26.12.2019
Сообщения
12
Благодарностей
0
Баллы
1
Спасибо люди добрые, очень помогли)
 

phillplacebo

Client
Регистрация
04.02.2020
Сообщения
25
Благодарностей
1
Баллы
3
Здравствуйте! А как сделать типа такого
C#:
string zipPath = @"D:\test.zip"; // путь к архиву
string extractPath = @"D:\"; // куда распаковать
using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
        if (entry.FullName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
        {
            entry.ExtractToFile(Path.Combine(extractPath, entry.FullName));
        }
    }
}
но чтобы брало и распаковывало например 3 (три) или любое n число любых файлов из архива? В гугле не забанили, просто 3х дневный поиск не привёл к ответу :be:
СпасибО!
 

ParfeniyAnton

Client
Регистрация
24.08.2014
Сообщения
300
Благодарностей
49
Баллы
28
Здравствуйте! А как сделать типа такого
C#:
string zipPath = @"D:\test.zip"; // путь к архиву
string extractPath = @"D:\"; // куда распаковать
using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
        if (entry.FullName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
        {
            entry.ExtractToFile(Path.Combine(extractPath, entry.FullName));
        }
    }
}
но чтобы брало и распаковывало например 3 (три) или любое n число любых файлов из архива? В гугле не забанили, просто 3х дневный поиск не привёл к ответу :be:
СпасибО!
Ты имеешь ввиду если есть вложенные архивы внутри архива? или просто внутри архива лежит неопределённое кол-во файлов и чтобы такой архив корректно распаковывался?
 

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 163
Благодарностей
743
Баллы
113
но чтобы брало и распаковывало например 3 (три) или любое n число любых файлов из архива? В гугле не забанили, просто 3х дневный поиск не привёл к ответу :be:
СпасибО!
C#:
string zipPath = @"D:\test.zip"; // путь к архиву
string extractPath = @"D:\"; // куда распаковать

using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
    // 3 - кол-во файлов для распаковки
    for (int i = 0; i < 3 && i < archive.Entries.Count; i++)              
        archive.Entries[i].ExtractToFile(Path.Combine(extractPath, archive.Entries[i].FullName));              
}
 
  • Спасибо
Реакции: phillplacebo

phillplacebo

Client
Регистрация
04.02.2020
Сообщения
25
Благодарностей
1
Баллы
3
C#:
string zipPath = @"D:\test.zip"; // путь к архиву
string extractPath = @"D:\"; // куда распаковать

using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
    // 3 - кол-во файлов для распаковки
    for (int i = 0; i < 3 && i < archive.Entries.Count; i++)             
        archive.Entries[i].ExtractToFile(Path.Combine(extractPath, archive.Entries[i].FullName));             
}
Выполнил несколько раз. Распаковывает все файлы из архива.
 

phillplacebo

Client
Регистрация
04.02.2020
Сообщения
25
Благодарностей
1
Баллы
3
Ты имеешь ввиду если есть вложенные архивы внутри архива? или просто внутри архива лежит неопределённое кол-во файлов и чтобы такой архив корректно распаковывался?
Любые файлы внутри архива. Например, архив с 40 картинками. Из него надо любые 3 (или 4, или 6 ) штуки распаковать. png или jpeg, без разницы )
 

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 163
Благодарностей
743
Баллы
113
  • Спасибо
Реакции: phillplacebo

phillplacebo

Client
Регистрация
04.02.2020
Сообщения
25
Благодарностей
1
Баллы
3
  • Спасибо
Реакции: ParfeniyAnton

ParfeniyAnton

Client
Регистрация
24.08.2014
Сообщения
300
Благодарностей
49
Баллы
28

phillplacebo

Client
Регистрация
04.02.2020
Сообщения
25
Благодарностей
1
Баллы
3
День добрый. В продолжение темы, не подскажете ли , как изменить код
C#:
string zipPath = @"D:\test.zip"; // путь к архиву
string extractPath = @"D:\"; // куда распаковать

using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
    // 3 - кол-во файлов для распаковки
    for (int i = 0; i < 3 && i < archive.Entries.Count; i++)             
        archive.Entries[i].ExtractToFile(Path.Combine(extractPath, archive.Entries[i].FullName));             
}
таким образом, чтобы брал файлы из архива в рандомном порядке?)
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
День добрый. В продолжение темы, не подскажете ли , как изменить код
C#:
string zipPath = @"D:\test.zip"; // путь к архиву
string extractPath = @"D:\"; // куда распаковать

using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
    // 3 - кол-во файлов для распаковки
    for (int i = 0; i < 3 && i < archive.Entries.Count; i++)            
        archive.Entries[i].ExtractToFile(Path.Combine(extractPath, archive.Entries[i].FullName));            
}
таким образом, чтобы брал файлы из архива в рандомном порядке?)
ну попробуй в 8-й строке рандом поставить, только там придётся и сравнение ставить, ну или с файла числа дёргать
 

phillplacebo

Client
Регистрация
04.02.2020
Сообщения
25
Благодарностей
1
Баллы
3
ну попробуй в 8-й строке рандом поставить, только там придётся и сравнение ставить, ну или с файла числа дёргать
если в 8-й строке рандом, то он же кол-во файлов будет рандомно брать, а не их порядок? Как-то бы, чтобы именно их порядок в архиве рандомно брался
 

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 163
Благодарностей
743
Баллы
113
C#:
string zipPath = @"D:\test.zip"; // путь к архиву
string extractPath = @"D:\"; // куда распаковать
var rnd = new Random();

using (System.IO.Compression.ZipArchive archive = ZipFile.OpenRead(zipPath))
{
    var entList = archive.Entries.ToList();
    // 3 - кол-во файлов для распаковки
    for (int i = 0; i < 3 && i < entList.Count; i++)
    {
        var index = rnd.Next(entList.Count);
        entList[index].ExtractToFile(Path.Combine(extractPath, entList[index].FullName));
        entList.RemoveAt(index);
    }                  
}
Как то так
 
  • Спасибо
Реакции: phillplacebo

phillplacebo

Client
Регистрация
04.02.2020
Сообщения
25
Благодарностей
1
Баллы
3

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)