Heather Czerniak Ответов: 5

C# как добавить изображение, аудио, видео в zip-файл dotnetzip без исходного пути к файлу?


Я пишу приложение C# .NET WinForms, где мне нужно создать zip-файл (используя DotNetZip), состоящий из элементов следующих типов:

Система.Рисование.Изображение какое-то изображение
Microsoft.DirectX.Аудиовидеоплеер.Аудио someaudio
Microsoft.DirectX.Аудиовидеоплеер.Видео somevideo

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

byte() MediaInBytes = File.ReadAllBytes(originalfilepath);


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

Так что у меня остается два варианта:

1. Найдите способ добавить someimage, someaudio и somevideo в zip-архив, созданный с помощью DotNetZip, без предварительного преобразования их в строку Base64 или байтовый массив.
2. Найдите способ записать значения someimage, someaudio и somevideo во временный файл, чтобы я мог добавить их оттуда. Помните, что для добавления элемента в zip-файл DotNetZip он должен исходить из пути к файлу:

Ionic.Zip.ZipEntry someEntry = zip.AddFile(filepath);


Любая помощь будет очень признательна.

Что я уже пробовал:

byte() MediaInBytes = File.ReadAllBytes(someimage);

byte() MediaInBytes = File.ReadAllBytes(someaudio);

byte() MediaInBytes = File.ReadAllBytes(somevideo);

Ionic.Zip.ZipEntry someEntry = zip.AddFile(filepath);

5 Ответов

Рейтинг:
28

Heather Czerniak

Дейв,
Я знаю, что исходный путь к файлу не сохраняется в файле .zip, а только то, что находится в его конце. По-видимому, DotNetZip позволит мне добавить файл только из пути к файлу, поэтому мне нужно найти способ записать значение переменной во временный файл, чтобы я мог прочитать его в массив байтов из этого временного файла, а затем добавить массив байтов в файл .zip.


Рейтинг:
2

Dave Kreskowiak

Эммм...кажется, ты даже не представляешь как .ZIP-файлы работают. Либо это так, либо вы делаете ужасную работу по описанию проблемы.

Исходный путь не сохраняется в файле. ZIP. Если вы добавляете папки в a .ZIP относительный путь сохраняется. Это означает, что файлы распаковываются по пути относительно того, где человек, распаковывающий файл, хочет, чтобы они появились, а не по абсолютному пути, откуда исходили исходные файлы.

Вы, кажется, делаете это намного сложнее, чем на самом деле.


Рейтинг:
2

RickZeeland

Я не знаю о DotNetZip, но 7zip может это сделать, вы можете вызвать его с помощью Process.Начало().
Примеры из справки 7zip:

7z a archive1.zip subdir\
добавляет все файлы и подпапки из папки subdir в архив archive1.zip. Имена файлов в архиве будут содержать префикс subdir\.
7z a archive2.zip .\subdir\*
добавляет все файлы и подпапки из папки subdir в архив archive2.zip. Имена файлов в архиве не будут содержать префикс subdir\.
cd /D c:\dir1\
7z a c:\archive3.zip dir2\dir3\
Имена файлов в архиве c:\archive3.zip будет содержать префикс dir2\dir3\, но они не будут содержать c:\dir1 \ префикс.
---------------------------------------------------------------------
О путях к файлам
При работе с файлами вам не нужен путь к файлу, если файл находится в том же каталоге, что и файл .exe, например:
string text1 = File.ReadAllText("file.txt");


Рейтинг:
2

Heather Czerniak

Рик, если ты имеешь в виду копирование файлов в исполняемый путь приложения, это означает, что у меня все равно будет путь к файлу. Можно ли записать значение переменной DirectX Audio или DirectX Video в файл? Я прочитал значение в переменную из пути к файлу, теперь я хочу записать значение этой переменной в путь к файлу.


Рейтинг:
1

Heather Czerniak

Рик, проблема в том, что конечный пользователь может открыть zip-архив в моем приложении на другом компьютере, где эти изображения, аудио и видео файлы могут не существовать. Если они откроют zip-архив, эти файлы не загрузятся, потому что их не будет на другом компьютере. Как только я добавляю изображение, аудио или видео в файл в приложении, этот файл существует, но поскольку пользователь может открыть zip-архив на другом компьютере, полагаться на исходные пути к файлам было бы бесполезно. В результате я должен найти способ преобразовать значения переменных, которые содержат изображение, аудио или видео данные, в массивы байтов, прежде чем записывать их в zip. Таким образом, их можно легко преобразовать обратно в изображения, аудио или видео. используя временный файл.

По сути, я спрашиваю: Можно ли записать значение переменной типа Microsoft.DirectXAudioVideoPlayback.Аудио или Microsoft.DirectXAudioVideoPlayback.Видео во временный файл, чтобы я мог преобразовать его в байтовый массив, используя приведенный ниже код:

string TempFilePath = Path.GetTempFileName();

byte[] MediaInBytes = File.ReadAllBytes(TempFilePath);


RickZeeland

Вы делаете вещи слишком сложными, просто поместите свои аудио-и видеофайлы рядом с вашими приложениями .exe, чтобы вам не пришлось использовать "исходный путь к файлу".

Dave Kreskowiak

Вы также добавляете свои комментарии к другим ответам в качестве решения вашего собственного вопроса. Люди, которым вы пытаетесь ответить, не получают уведомлений о том, что вы отвечаете. Нажмите на кнопку "Задать вопрос или комментарий", чтобы ответить на решение. Таким образом, люди, которым вы отвечаете, получают уведомление о том, что вы что-то опубликовали.