Страница 1 из 1

Вопросы по zipper (архивация файлов)

СообщениеДобавлено: 11.03.2020 14:35:36
Алексей Попов
Здравствуйте.
У меня Lazarus на Linux Debian.
Программа
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var   ToZip: TZipper;
      UnZip: TUnZipper;
      List : TStringList;
begin ToZip:= TZipper.Create();
      ToZip.FileName:= '/1/MyFile1.zip';  // (Каталог "/1/" существует и доступен для записи)
      List:= TStringList.Create();
      List.Add( '/1/MyFile1.txt');        // (Файл "/1/MyFile1.txt" существует и доступен для чтения)
      ToZip.ZipFiles(List);               // Ошибка ECreateError: "Unable to create file '/1/MyFile1.zip'"

      UnZip:= TUnZipper.Create();
      UnZip.FileName:= '/1/MyFile2.zip';  // (Архивный файл "/1/MyFile2.zip" существует, проверен на распаковываемость и доступен для чтения)
      UnZip.Examine();                    // Ошибка: "Unable to open file '/1/MyFile2.zip'"
end;

компилируется без ошибок.

Выполнение вылетает на инструкциях (смотрите в коде напротив них комментарии с текстом ошибки):
ToZip.ZipFiles(List);
UnZip.Examine();

Предполагаю, проблема с работоспособностью библиотеки zlib, хотя и странно.
Кто-то сталкивался с такой проблемой, и что можете посоветовать? (кроме использовать иные библиотеки)

Re: Вопросы по zipper (архивация файлов)

СообщениеДобавлено: 11.03.2020 22:51:56
Sharfik
Проблема не в библиотеке, а коде. Начни с простого пиши правильно и полностью путь. И посмотри примеры в wiki.freepascal.org

Re: Вопросы по zipper (архивация файлов)

СообщениеДобавлено: 12.03.2020 07:48:28
Алексей Попов
Sharfik писал(а): Начни с простого пиши правильно и полностью путь.

Семён Семёныч...
Верно, пути указывал без домашнего каталога.

Надо вместо "/1" было "/home/Пользователь/1", где и находится, в действительности, всё хозяйство...

Вопрос закрыт. Спасибо.
Кстати, пример рабочий; только деструкторы добавить.

Re: Вопросы по zipper (архивация файлов)

СообщениеДобавлено: 12.03.2020 14:10:18
Vadim
Алексей Попов писал(а):Надо вместо "/1" было "/home/Пользователь/1"

Или, с расчётом на универсализм:
Код: Выделить всё
~/1

;-)

Re: Вопросы по zipper (архивация файлов)

СообщениеДобавлено: 12.03.2020 14:36:06
Дож
Это не универсально.

~ - это спец. знак для шеллов (sh, bash и др.), вместо которого они подставляют $HOME. Предназначен для того, чтобы пользователю в командной строке проще было обращаться к своей домашке.

За пределами шеллов он не имеет смысла. Если попытаться открыть файл ~/1, то программа будет искать в текущей директории директорию с названием '~', а не домашку.

Re: Вопросы по zipper (архивация файлов)

СообщениеДобавлено: 12.03.2020 18:54:32
zoltanleo
Поэтому в тестовом проекте лучше использовать строковые константы, типа
Код: Выделить всё
const
  ZipFileName = '/home/Пользователь/1/MyFile1.txt';

и использовать их при присвоении
Код: Выделить всё
List.Add( ZipFileName);

Это заодно избавит от правки одного и того же значения в неск. местах.

Re: Вопросы по zipper (архивация файлов)

СообщениеДобавлено: 13.03.2020 16:11:01
svk12
Код: Выделить всё
SysUtils.GetUserDir+'1/MyFile1.txt'