Страницы

Поиск по вопросам

Показаны сообщения с ярлыком архивация. Показать все сообщения
Показаны сообщения с ярлыком архивация. Показать все сообщения

четверг, 13 февраля 2020 г.

Работа с WinRar в C#

#c_sharp #net #архивация #winrar


Подскажите, как можно работать с WinRar в C#?

Я находил вариант с использованием консольного режима, но может быть есть какая-нибудь
удобная библиотека ? 
    


Ответы

Ответ 1



Поиск rar на nuget.org выдал библиотеку SharpCompress. Согласно документации, поддерживает распаковку rar-архивов (но не упаковку). Подключив пакет, я скомпилировал следующий код: using SharpCompress.Reader; // ... using (var archive = File.OpenRead(@"D:\PathSegments.rar")) using (var reader = ReaderFactory.Open(archive)) { Console.WriteLine("Archive type: " + reader.ArchiveType); while (reader.MoveToNextEntry()) { if (!reader.Entry.IsDirectory) Console.WriteLine( "File: {0} size {1}/{2}", reader.Entry.Key, reader.Entry.CompressedSize, reader.Entry.Size)); } } который выдал: Archive type: Rar File: App.config size 135/187 File: App.xaml.cs size 159/345 File: AspectRatioDecorator.cs size 945/6224 File: Properties\AssemblyInfo.cs size 764/2288 File: PartialSegmentControl.xaml size 192/1079 ... Ещё примеры здесь.

Ответ 2



Формат RAR проприетарный. Алгоритмы распаковки и исходники UnRAR защищены авторскими правами, но доступны для бесплатного использования. Взять можно на RarLab. Упаковку в RAR можно сделать только родным архиватором. А про распаковку уже ответил VladD.

Ответ 3



Сколько не искал, ничего удобного для WinRAR не находил. Зато есть для 7-zip, может подойдет.

воскресенье, 5 января 2020 г.

Как в linux запаковать с паролем?

#linux #bash #защита #архивация


Пишу небольшой sh-скрипт для архивирования папок на яндекс:диск и задумался о том,
что tar -cvzf не поддерживает создание пароля, а складывать архивы с серверов на облако
как-то нет желания.

Как  можно запаковать каталог под линукс с использованием пароля? Только вариант
"ставить zip/unzip"?
Требований по скорости/сжатию нет (я не сжимаю вообще при архивировании), а шифрование
должно быть достаточно стойким для 2019, а не какие-то древние/поломанные давно алгоритмы.
    


Ответы

Ответ 1



Если задача стоит, только защитить содержимое паролем, то можно воспользоваться парой утилит zip/unzip. zip -e С опцией -e утилита запросит задать пароль. Смотри: $ man zip и $ man unzip для справки по другим опциям. Рабочий пример: $ touch file{1,2,3}.txt $ zip -e file.zip file* Enter password: Verify password: adding: file1.txt (stored 0%) adding: file2.txt (stored 0%) adding: file3.txt (stored 0%) $ rm file[123].txt $ unzip file.zip Archive: file.zip [file.zip] file1.txt password: extracting: file1.txt extracting: file2.txt extracting: file3.txt

вторник, 31 декабря 2019 г.

Разархивирование архива RAR программно

#cpp #архивация


Цель - программно разархивировать архив в определённую папку.
Язык, как вы наверное поняли из тэгов - C++ .
Писать взаимодействующие с архивами программы ранее не приходилось.
    


Ответы

Ответ 1



Добрый день! Вариантов несколько. Написать модуль архивации "с нуля". Очень трудоемко, поэтому не обсуждаем. Взять готовый программный модуль, интегрировать к себе. Вариантов много, например. Можно найти исходники unrar и втянуть их к себе в код. Что-нибудь такого типа Еще вариант. При установленном WinRAR (или аналогичном архиваторе) в системе можно его запускать через функцию вызова внешней программы с нужными ключами. Что-то вроде такого или такого

пятница, 27 декабря 2019 г.

Примонтировать архив как диск

#windows #архивация #диск #монтирование #поиск_программ


Хочу примонтировать архив (желательно 7z, но можно другой хороший) как виртуальный
диск в Windows. При этом должны выполняться следующие условия:


Считаем, что есть пустой архив. Когда именно он создастся - не важно.
Этот архив монтируется как виртуальный диск.
На этот диск будет записан ровно один файл.
Сжатие должно происходить непосредственно при записи.
Запись будет последовательной (но НЕ realtime).
Ожидаемый объём записываемого от 100 ГБ до 500 ГБ.
Ожидаемый объём архива в 500 раз меньше объёма записываемого файла.
На дисках не достаточно свободного места, чтобы вместить несжатый файл.
Желательно, чтобы последовательное считывание после записи тоже было возможно.


Записываться будет несжатое avi, причём обязательно под Windows.

С помощью каких программ такое можно осуществить?

Замечу, что 7zip умеет делать потоковую архивацию. Например, следующей командой можно
упаковать выводимый текст в архив cmd.7z под именем (файла) help.txt (ключ -si):

cmd /? | "C:\Program Files (x86)\7-Zip\7z.exe" a -sihelp.txt cmd.7z


Получается, что подходит любая программа, которая способна создать виртуальный диск
и выводить на stdout всё, что пишется в файл на этом диске.

PS: Этот вопрос на английском.
    


Ответы

Ответ 1



Можно попробовать использовать WebDAV. Windows умеет монтировать WebDAV-папки как сетевые диски. Начать можно с вот такого сервера (код на C#), который эмулирует пустой диск, ожидая пока ему не передадут файл: using System; using System.Globalization; using System.IO; using System.Net; using System.Xml.Linq; namespace HttpPipe { static class Program { static readonly Uri ListenUri = new Uri("http://localhost/share/"); static void Main(string[] args) { CultureInfo.DefaultThreadCurrentCulture = CultureInfo.GetCultureInfo("en-US"); var listener = new HttpListener { Prefixes = { $"{ListenUri.Scheme}://*:{ListenUri.Port}{ListenUri.PathAndQuery}" }, }; listener.Start(); bool processing = false; try { while (true) { processing = false; var ctx = listener.GetContext(); processing = true; try { var uri = ctx.Request.Url; Console.Error.WriteLine($"{ctx.Request.HttpMethod} {uri} {ctx.Request.ContentType} {ctx.Request.ContentLength64}"); var root = new Uri(uri, ListenUri.PathAndQuery); if (uri + "/" == root.ToString()) uri = root; uri = uri.MakeRelativeUri(root); if (uri.IsAbsoluteUri || uri.ToString().StartsWith("..")) throw new Exception("Неправильный URI: " + uri); if (ProcessContext(ctx, uri.ToString())) break; } finally { ctx.Response.Close(); } } } catch (Exception ex) when (processing) { Console.Error.WriteLine("ERROR: " + ex); } catch (Exception) { } listener.Stop(); } static readonly XNamespace DAV = "DAV:"; private static bool ProcessContext(HttpListenerContext ctx, string uri) { ctx.Response.SendChunked = false; switch (ctx.Request.HttpMethod) { case "OPTIONS": ctx.Response.SetStatus(HttpStatusCode.OK); ctx.Response.AddHeader("DAV", "1"); break; case "PROPFIND": if (uri != "") { ctx.Response.SetStatus(HttpStatusCode.NotFound); } else { var prop = new XElement(DAV + "prop"); prop.SetElementValue(DAV + "creationdate", DateTime.UtcNow.ToString("s") + "Z"); prop.SetElementValue(DAV + "getlastmodified", DateTime.UtcNow.ToString("R")); prop.SetElementValue(DAV + "displayname", "share"); prop.Add(new XElement(DAV + "resourcetype", new XElement(DAV + "collection"))); var response = new XElement(DAV + "response"); response.SetElementValue(DAV + "href", ListenUri.PathAndQuery); response.Add(new XElement(DAV + "propstat", new XElement(DAV + "status", "HTTP/1.1 200 OK"), prop)); ctx.Response.StatusCode = 207; ctx.Response.StatusDescription = "Multi Status"; ctx.Response.Send(new XElement(DAV + "multistatus", new XAttribute(XNamespace.Xmlns + "d", DAV), response)); } break; case "PUT": if (ctx.Request.ContentLength64 > 0) { foreach (string header in ctx.Request.Headers) { Console.Error.WriteLine($" {header}: {ctx.Request.Headers[header]}"); } using (var output = Console.OpenStandardOutput()) { ctx.Request.InputStream.CopyTo(output); } ctx.Response.SetStatus(HttpStatusCode.NoContent); return true; } ctx.Response.SetStatus(HttpStatusCode.NoContent); return false; default: ctx.Response.SetStatus(HttpStatusCode.NotImplemented); break; } return false; } static void SetStatus(this HttpListenerResponse resp, HttpStatusCode status) { resp.StatusCode = (int)status; resp.StatusDescription = status.ToString(); } static void Send(this HttpListenerResponse resp, XElement content) { var ms = new MemoryStream(); content.Save(ms); ms.Position = 0; resp.ContentType = "application/xml; charset=utf-8"; resp.ContentLength64 = ms.Length; ms.CopyTo(resp.OutputStream); } } } Когда приходит файл - он выводит его содержимое в стандартный вывод и завершает работу. Полезные ссылки: RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV) WebDAV-API Яндекс-Диска - тут есть ценные примеры

четверг, 19 декабря 2019 г.

Как создать jar-архив используя (в) Intellij idea?

#java #jar #архивация


Не могу создать создать исполняемый архив JAR .Как я понял данная проблема должна
решаться с помощью Terminal ,НО ОН У МЕНЯ И НЕ РАБОТАЕТ(не могу туда заносить текст,как
и печатать там ,так и вставлять туда скопированный текст).Также как использовать при
компиляции флаги.Также где набирать команду для создания jar-архива?
    


Ответы

Ответ 1



В идее сначала идете в File | Project Structure | Artifacts, там создаете новый artifact, jar --> From modules with dependencies Потом Build | Build artifacts

Ответ 2



По-хорошему у вас должна быть система сборки, которая сама этим занимается. Самые известные - это Maven, Gradle и Ant. Кроме простой компиляции в war/jar эти системы умеют еще много полезных штук, в том числе подчищать директории от промежуточных файлов, подправлять файлы в момент компиляции, прогонять тесты и многое другое. После этого достаточно добавить задачи в Run Configurations, и IDEA сама озаботится вызовом консольных команд, останется только запускать нужные конфигурации.

воскресенье, 8 декабря 2019 г.

Создать архив на странице

#javascript #файлы #google_chrome #архивация


У меня есть набор data-uri и ссылок, по которым я могу послать ajax-запросы, а также
немного дополнительной текстовой информации. При этом скрипт исполняется на странице.
Хотелось бы из всего этого создать единый архив (с кучей файлов) и предоставить пользователю
возможность скачать его через ObjectURL.

Насколько я представляю, самым простым форматом архива является tar. Как реализовать
архивацию в tar на клиенте?



var c1 = "Just some text file"
var b1 = new Blob([c1], {type : 'text/plain'})
var f1 = new File([b1], "file-1.txt")

var c2 = new Uint8Array([0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x01,0x03,0x00,0x00,0x00,0xFE,0xC1,0x2C,0xC8,0x00,0x00,0x00,0x06,0x50,0x4C,0x54,0x45,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x55,0xC2,0xD3,0x7E,0x00,0x00,0x00,0x16,0x49,0x44,0x41,0x54,0x78,0x5E,0x63,0xF8,0xCF,0xD0,0xC8,0xB0,0x97,0x61,0x29,0x10,0xEE,0x05,0xB2,0xFE,0x03,0x00,0x2E,0x30,0x05,0xC5,0x31,0x03,0x9F,0xF7,0x00,0x00,0x00,0x00,0x49,0x45,0x4E,0x44,0xAE,0x42,0x60,0x82])
var b2 = new Blob([c2], {type: 'image/png'})
var f2 = new File([b2], "file-1.png")

var a1 = document.getElementById("a1")
a1.href = URL.createObjectURL(f1)
a1.download = f1.name

var a2 = document.getElementById("a2")
a2.href = URL.createObjectURL(f2)
a2.download = f2.name

var aa = document.getElementById("aa")
aa.href = "data:text/plain,???"; // Архив из двух файлов
aa.download = "all-files.tar"
Download text
Download image
Download both


Ответы

Ответ 1



Есть jszip, он умеет как распаковывать так и упаковывать zip как в браузере так и на node.js. Вот пример работы с этой библиотекой, используя Ваши наработки: // создаем новый архив var zip = new JSZip(); // добавим туда текстовый файл zip.file("file-1.txt", c1); // создаем директорию images var img = zip.folder("images"); // добавим туда картинку img.file("file-1.png", c2, {base64: true}); // асинхронно получаем готовый архив zip.generateAsync({type:"blob"}).then(function(content) { // создаем ссылку для скачивания var aa = document.getElementById("aa") aa.href = URL.createObjectURL(content) aa.download = "all-files.zip" }); var c1 = "Just some text file" var b1 = new Blob([c1], {type : 'text/plain'}) var f1 = new File([b1], "file-1.txt") var c2 = new Uint8Array([0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x01,0x03,0x00,0x00,0x00,0xFE,0xC1,0x2C,0xC8,0x00,0x00,0x00,0x06,0x50,0x4C,0x54,0x45,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x55,0xC2,0xD3,0x7E,0x00,0x00,0x00,0x16,0x49,0x44,0x41,0x54,0x78,0x5E,0x63,0xF8,0xCF,0xD0,0xC8,0xB0,0x97,0x61,0x29,0x10,0xEE,0x05,0xB2,0xFE,0x03,0x00,0x2E,0x30,0x05,0xC5,0x31,0x03,0x9F,0xF7,0x00,0x00,0x00,0x00,0x49,0x45,0x4E,0x44,0xAE,0x42,0x60,0x82]) var b2 = new Blob([c2], {type: 'image/png'}) var f2 = new File([b2], "file-1.png") var a1 = document.getElementById("a1") a1.href = URL.createObjectURL(f1) a1.download = f1.name var a2 = document.getElementById("a2") a2.href = URL.createObjectURL(f2) a2.download = f2.name // создаем новый архив var zip = new JSZip(); // добавим туда текстовый файл zip.file("file-1.txt", c1); // создаем директорию images var img = zip.folder("images"); // добавим туда картинку img.file("file-1.png", c2, {base64: true}); // асинхронно получаем готовый архив zip.generateAsync({type:"blob"}).then(function(content) { // создаем ссылку для скачивания var aa = document.getElementById("aa") aa.href = URL.createObjectURL(content) aa.download = "all-files.zip" }); Download text
Download image
Download both


среда, 27 ноября 2019 г.

Распаковка архива tar.xz

#архивация #ubuntu


Столкнулся с архивом типа tar.xz. Что это такое и как это распаковывать?    


Ответы

Ответ 1



xz - это файловый формат сжатия данных с помощью алгоритма LZMA. Чтобы использовать на Убунту, надо установить xz-utils. Установка: sudo apt-get install xz-utils Распаковка: tar -xpJf archive.tar.xz

Ответ 2



В дальнейшем, чтобы не заботится о том, какой тип архива, можно поставить утилиту atool: $ sudo apt-get install atool Для распаковки (покажу на примерах): $ aunpack a.7z $ aunpack a.tag.gz $ aunpack a.zip Для архивации: $ apack a.7z file1.txt file2 dir1 Для просмотра содержимого: $ als a.7z и др.

Ответ 3



есть и универсальное решение. во всех популярных дистрибутивах операционной системы gnu/linux есть пакет dtrx («do the right extraction»). при его установке по зависимостям будут установлены и недостающие в системе распаковщики. программа самостоятельно определяет, что находится внутри файла, и умеет распаковывать tar, zip (включая самораспаковывающиеся .exe), cpio, rpm, deb, gem, 7z, cab, rar, файлы, созданные InstallShield, сжатые gzip, bzip2, lzma и compress. при обнаружении внутри архива других архивов/сжатых файлов, программа интерактивно предложит распаковать и их. использование: $ dtrx сжатый.файл.и.или.архив страница разработчика man dtrx

Ответ 4



На Linux есть unar, распаковывающий все подряд и нормально обрабатывающий русскую кодировку в zip. Для tar.xz тоже подходит.

четверг, 11 июля 2019 г.

Можно ли пометить отдельные секции исполняемого образа как незагружаемые в ОЗУ

Например в случае большого SFX-архива, до нескольких гигабайт, логично загрузить только исполняемый код распаковщика, а сам архив оставить на диске. И потом спокойно его распаковывать.
Если да, то как это сделать средствами Visual Studio? Как это вообще делается в случае SFX?


Ответ

Часто делают так. Создается EXE без дополнительных данных, а потом к нему дописывается "архив", при этом параметры секций не меняются. Загрузчик в память загрузит только сам EXE, оверлей не будет загружен, поскольку он не в секции. Запущенный EXE делает, к примеру, GetModuleHandle(NULL), получает адрес своего заголовка в памяти, парсит таблицу секций и узнает файловое смещение конца последней секции. Ровно за ним - оверлей с "архивом", который он может читать как ему угодно. Вариант номер два: после сборки в неиспользуемые поля заголовка вносится размер EXE, и запущеный процесс читает оттуда смещение до оверлея.

среда, 19 декабря 2018 г.

Разархивирование архива RAR программно

Цель - программно разархивировать архив в определённую папку. Язык, как вы наверное поняли из тэгов - C++ . Писать взаимодействующие с архивами программы ранее не приходилось.


Ответ

Добрый день!
Вариантов несколько.
Написать модуль архивации "с нуля". Очень трудоемко, поэтому не обсуждаем. Взять готовый программный модуль, интегрировать к себе. Вариантов много, например Можно найти исходники unrar и втянуть их к себе в код. Что-нибудь такого типа Еще вариант. При установленном WinRAR (или аналогичном архиваторе) в системе можно его запускать через функцию вызова внешней программы с нужными ключами. Что-то вроде такого или такого

среда, 12 декабря 2018 г.

Как создать jar-архив используя (в) Intellij idea?

Не могу создать создать исполняемый архив JAR .Как я понял данная проблема должна решаться с помощью Terminal ,НО ОН У МЕНЯ И НЕ РАБОТАЕТ(не могу туда заносить текст,как и печатать там ,так и вставлять туда скопированный текст).Также как использовать при компиляции флаги.Также где набирать команду для создания jar-архива?


Ответ

В идее сначала идете в File | Project Structure | Artifacts, там создаете новый artifact, jar --> From modules with dependencies
Потом Build | Build artifacts