Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] архивация файлов, выбраных в ListBox

Ответить
Настройки темы
Delphi - [решено] архивация файлов, выбраных в ListBox

Новый участник


Сообщения: 29
Благодарности: 2

Профиль | Отправить PM | Цитировать


Доброго времени суток уважаемые форумчане. Помогите решить проблему:

Есть процедура для архивации файлов средствами ShellApi:
Код: Выделить весь код
...
procedure PackFile(ArcName, FileName: string);
  var
    s: string;
begin
    s := 'a -dh -ep ' + ArcName + ' ' + FileName;
    ShellExecute(0, nil, 'winrar', PChar(s), nil, SW_SHOWNA);
end;
...
Есть ListBox, в который добавляются файлы для архивации
Есть обработчик событий:
Код: Выделить весь код
...
procedure TfMore.Button3Click(Sender: TObject);
  var
  a:Byte;
begin
  for  a:= 0 to ListBox1.Items.Count - 1 do begin
  PackFile('d:\Arhive\123456.rar', ListBox1.Items.Strings[a]);
  end;
end;
...
Так вот в чем обстоит проблема: Если в "боксе" выбран один файл то естественно проблем нету. Если выбраны 2 и больше, а их нужно запаковать в один архив, WinRar начинает "ругаться"
Код: Выделить весь код
Процесс не может получить доступ к Файлу, так как зтот Файл занят другим процессом.
WinRar не успел еще заархивировать первый файл как программа "подсовывает" ему следующий.

Можно ли как то решить этот вопрос по работе приведенной выше процедуры или может есть совет по иному способу архивации?
Заранее благодарен.
p.s. Вроде как и не логично "запихивать" в архив по одному файлу но другого ниче в голову не пришло.

Отправлено: 11:44, 12-10-2011

 

Аватара для ferget

Разный


Сообщения: 1294
Благодарности: 359

Профиль | Отправить PM | Цитировать


надо сперва объединить выбранные в ListBox файлы в строку через пробел

а затем эту строку подставить в PackFile()

P.S. список передается через пробел

Последний раз редактировалось ferget, 12-10-2011 в 14:28.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:15, 12-10-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


Цитата camope3:
Вроде как и не логично "запихивать" в архив по одному файлу но другого ниче в голову не пришло. »
В WinRar можно упаковывать сразу целым списком файлов в один архив.

Цитата Справка WinRar:
Общий синтаксис командной строки для архивации файлов таков:
WinRAR A [-ключи ] <Архив> [ Файлы ] [ @Файлы-списки ]
То есть вам нужно в цикле прохождения по выделенным итемам сформировать список файлов:
Код: Выделить весь код
symbol = ' ';// символ для отделения файлов ( пробел )
for  a:= 0 to ListBox1.Items.Count - 1 do begin
  files = files + ListBox1.Items.Strings[a] + symbol; // хранит строку списка файлов
  end;
PackFile('d:\Arhive\123456.rar', files); // вызываем один раз архивацию
Либо так:
Цитата Справка WinRar:
Файлы для архивации можно также перечислить не в командной строке, а в текстовом файле. В этом случае в командной строке необходимо указать имя этого файла, причём перед ним должен стоять символ @.
WinRAR A TOOLS.ZIP @Binaries
Ну тут так же в цикле формируем файл со списком, ну а далее его передаем как параметр для архивации.

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Последний раз редактировалось LilLoco, 12-10-2011 в 16:20. Причина: Уточнение символа

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:22, 12-10-2011 | #3


Новый участник


Сообщения: 29
Благодарности: 2

Профиль | Отправить PM | Цитировать


Благодарю всех откликнувшихся. LilLoco Немножко подправил Ваш код:
Код: Выделить весь код
...
procedure TfMore.Button3Click(Sender: TObject);
  var
  a:Byte;
  symbol,files:string;
begin
  symbol:=' ';//здесь символ разделителя пробел
  for  a:= 0 to ListBox1.Items.Count - 1 do begin
  files := files + ListBox1.Items.Strings[a] + symbol;
  PackFile('d:\Arhive\123456.rar', files);
  end;
end;
...
и все работает.
Еще раз всем спасибо!

Отправлено: 17:44, 12-10-2011 | #4


Новый участник


Сообщения: 29
Благодарности: 2

Профиль | Отправить PM | Цитировать


Доброго времени! Возвращаюсь обратно к созданой теме.

Работает все нормально НО, если архивирую больше трех файлов выскакивает вся та же ошибка, отчет из лога WinRar:
Код: Выделить весь код
17.10.2011 15:16:16   Невозможно открыть d:\Arhive\123456.rar
17.10.2011 15:16:16   Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.
причем файлы успешно упаковываются.

проблему "решил" отключив отчет об ошибках
Код: Выделить весь код
s := 'a -inul -ilog.\ErrRar.txt -dh -ep -m5 ' + ArcName + ' ' + FileName;
    ShellExecute(0, nil, 'winrar', PChar(s), nil, SW_SHOWNA);
Но все же не могу понять что не так. Именно до трех файлов пакует без ошибки, более трех с ошибкой но все равно пакует. Перепробовал разные манипуляции с ключами WinRar не помогло.

Отправлено: 16:23, 17-10-2011 | #5


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


camope3, Вы всё же стали паковать файлы по-отдельности, а не списком?

Отправлено: 17:35, 17-10-2011 | #6


Новый участник


Сообщения: 29
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата Iska:
camope3, Вы всё же стали паковать файлы по-отдельности, а не списком? »
Если я правильно Вас понял то, мне нужно добавить символ @ перед именем списка либо здесь:
Код: Выделить весь код
PackFile('d:\Arhive\123456.rar', files);
перед files

либо в процедуре
Код: Выделить весь код
s := 'a -ilog.\ErrWinRar.txt -dh -ep -m5 ' + ArcName + ' ' + FileName;
перед FileName???

но тогда WinRar снова выдает ошибку:
Код: Выделить весь код
17.10.2011 22:27:11   Невозможно открыть d:\Arhive\123.doc d:\Arhive\122.doc
17.10.2011 22:27:11   Синтаксическая ошибка в имени файла, имени папки или метке тома.
Не могу додуматься никак, что к чему, помогите будьте добры.

p.s. Начал извращаться дальше, выгрузил список в файл spis.txt
написал батник
Код: Выделить весь код
D:
cd d:\Arhive\
"c:\Program Files (x86)\WinRAR\WinRaR.exe" a -dh -ep 123456.rar @spis.txt
WinRaR упорно выдает ошибку
Код: Выделить весь код
 Синтаксическая ошибка в имени файла, имени папки или метке тома
текст файла spis.txt:
Код: Выделить весь код
d:\Arhive\111.doc d:\Arhive\122.doc d:\Arhive\123.doc
Проверил - разделители пробелы. Выкидываю из списка 2 файла, оставляю один - архивирует.
Я уже и незнаю где, что и как искать, просто замкнутый круг какой то

Последний раз редактировалось camope3, 18-10-2011 в 00:44.


Отправлено: 00:22, 18-10-2011 | #7


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


camope3, попробуйте привести весь получившийся итоговый код, относящийся к формированию перечня файлов и упаковке файлов.

Список Вы формировали именно так:
читать дальше »
Цитата:
Файл-список

Файлы-списки - это обычные текстовые файлы, содержащие имена файлов для обработки. Каждое имя файла должно быть указано на отдельной строке и начинаться с первой позиции строки. В файл-список допускается помещать комментарии, признак начала комментария - символы //. Например, для архивирования файлов *.txt из папки c:\work\doc, файлов *.bmp из папки c:\work\image и всех файлов из папки c:\work\misc можно создать backup.lst, содержащий следующие строки:
c:\work\doc\*.txt//резервная копия текстов

c:\work\image\*.bmp//резервная копия рисунков

c:\work\misc

После этого для архивирования достаточно будет выполнить команду:

winrar a backup @backup.lst

В одной командной строке разрешается указывать как обычные имена или группы файлов для обработки, так и файлы-списки. Если не указаны ни файлы, ни файлы-списки, то подразумевается шаблон *.* (т.е. WinRAR обработает все файлы).
Это сообщение посчитали полезным следующие участники:

Отправлено: 02:53, 18-10-2011 | #8


Новый участник


Сообщения: 29
Благодарности: 2

Профиль | Отправить PM | Цитировать


Iska Спасибо!
Код: Выделить весь код
....
ListBox1.Items.SaveToFile('spis.lst');
PackFile('d:\Arhive\123456.rar', '@spis.lst');
....
Все работает но как то немного не красиво. Файл список создается в той директории откуда выбираются файлы (файлы выбираются через Open.Execute) ,если же привязать к определенному пути скажем к папке с установленой прграммой тогда не работает.

Код: Выделить весь код
ListBox1.Items.SaveToFile(ExtractFilePath(Application.ExeName) + 'spis.lst' //сохраняет файл список в директории с программой
PackFile (d:\Arhive\123456.rar,(ExtractFilePath(Application.ExeName)+'@spis.lst'); //выдает ошибку

Последний раз редактировалось camope3, 18-10-2011 в 17:29.


Отправлено: 15:19, 18-10-2011 | #9


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


camope3: во-первых, Вы напутали с количеством скобок и кавычками:
Код: Выделить весь код
PackFile (d:\Arhive\123456.rar,(ExtractFilePath(Application.ExeName)+'@spis.lst');
во-вторых, попробуйте так (и убедитесь, что «\» правильно в итоге будут расставлены):
Код: Выделить весь код
PackFile ('d:\Arhive\123456.rar', '@'+ExtractFilePath(Application.ExeName)+'spis.lst');
Вообще-то правильно будет получить незанятое имя во временной папке пользователя, создать файл-список там, подставлять его в командную строку архиватора с полным путём.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:06, 18-10-2011 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] архивация файлов, выбраных в ListBox

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [Проблема] Архивация файлов Brb Microsoft Windows 7 4 19-08-2011 10:14
VBS/WSH/JS - [решено] Архивация файлов с последующим удалением Romano Скриптовые языки администрирования Windows 5 23-03-2011 18:03
Доступ - [решено] Архивация пользовательских файлов отключена системным администратором AlexxVP Microsoft Windows 7 2 03-03-2010 18:25
Выделение элемента в ListBox ramo Программирование и базы данных 3 07-02-2007 20:56
Listbox control in VB Skiff Программирование и базы данных 1 25-02-2003 07:18




 
Переход