:: Visual Foxpro, Foxpro for DOS
Получить CRC файла в архиве 7zip программно
VeterVFP
Автор

Сообщений: 413
Откуда: Москва
Дата регистрации: 26.12.2006
Приветствую всех.

В программе использую 7zip для распаковки архивов через консольную 7za.exe.
Есть задача получить CRC файла внутри архива 7zip, не распаковывая его.
Единственный вариант, который пока пришел в голову - сохранять результат вывода по ключу "l" в файл через перенаправление ">" и его потом парсить.
cRunProc= '"7za.exe"'
cZipNm= 'archiv.7z'
cFileNm= 'fl.txt'
cWorkDir= 'c:\1\result'
cInfoFileNm= 'CRC.txt'
cRunParamStr= ' l -slt "'+ cZipNm+ '" "'+ cFileNm+ '" > "'+ ADDBS(cWorkDir)+ cInfoFileNm+ '" '
**Запуск файла (с ожиданием завершения (через WinAPI))
lErr= NOT API_RunAndWait(cRunProc + cRunParamStr, '', .t.)

Но проблема в том, что через API_RunAndWait файл не создается. Хотя, вставив сформированную строку в CMD окно - отрабатывает норм.
При этом команда распаковки архива отрабатывает нормально через тот же API_RunAndWait.

Где ошибка?
Или можно получить CRC без перенаправления в текст файл?
Ratings: 0 negative/0 positive
Re: Получить CRC файла в архиве 7zip программно
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
VeterVFP
Но проблема в том, что через API_RunAndWait файл не создается. Хотя, вставив сформированную строку в CMD окно - отрабатывает норм.
Программно создайте bat- или cmd-файл с той же строкой, которую вы запускаете через API_RunAndWait.
А в API_RunAndWait запускайте этот bat-файл.

Есть также хорошие шансы, что достаточно просто добавить
cmd /C 
в начало вашей строки, то есть строка запуска будет такой:
cmd /C 7za.exe  и так далее

PS
Пишу не слишком уверенно, потому что понятия не имею, что такое API_RunAndWait.
Но для метода Run объекта WScript.Shell всё написанное выше работает:
ws = CreateObject('WScript.Shell')
ws.Run('cmd /C 7z l -slt arc.7z >outfile.txt',2,.T.)



Исправлено 5 раз(а). Последнее : akvvohinc, 03.11.22 21:10
Ratings: 0 negative/0 positive
Re: Получить CRC файла в архиве 7zip программно
VeterVFP
Автор

Сообщений: 413
Откуда: Москва
Дата регистрации: 26.12.2006
akvvohinc
Но для метода Run объекта WScript.Shell всё написанное выше работает:
ws = CreateObject('WScript.Shell')
ws.Run('cmd /C 7z l -slt arc.7z >outfile.txt',2,.T.)

У меня не сработало. Может из-за экранирования кавычками? Но без них нельзя, т.к. и путь к самому 7zip и к файлу и к папке результата могут, конечно, содержать пробелы.
Я поэтому и указал собираемую строку как

*Строка запуска (с кавычками, если есть пробелы в названии папки/файла)
cRunProc= '"7za.exe"'
...
cRunParamStr= ' l -slt "'+ cZipNm+ '" "'+ cFileNm+ '" > "'+ ADDBS(cWorkDir)+ cInfoFileNm+ '" '
Сработает ли у вас если добавить "экран"?
Ratings: 0 negative/0 positive
Re: Получить CRC файла в архиве 7zip программно
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
VeterVFP
У меня не сработало. Может из-за экранирования кавычками?
Да, у меня с путями, имеющими пробел, вариант с CMD /C тоже не сработал.

Но вариант с bat-файлом отработал нормально:
Создаю test.bat с требуемой командой (добавил пробелы во все компоненты):
STRTOFILE(["c:\Program Files (x86)\7z\7z.exe" l -slt "c:\Program Files (x86)\7z\111 222\arc 111.7z" >"output file.txt"],[test.bat])

а далее:
ws = CreateObject('WScript.Shell')
ws.Run('test.bat',2,.T.)

И на выходе получаю нормальный output file.txt.



Исправлено 3 раз(а). Последнее : akvvohinc, 08.11.22 19:21
Ratings: 0 negative/2 positive
Re: Получить CRC файла в архиве 7zip программно
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
()

> STRTOFILE(["c:\Program Files (x86)\7z\7z.exe" l -slt "c:\Program Files (x86)\7z\111 222\arc 111.7z" >"output file.txt"],[test.bat])

попытался понять...

m.p = "c:\Program Files (x86)\7z\7z.exe" && программа пакования
m.f = "c:\Program Files (x86)\7z\111 222\arc 111.7z" && вроде файл, откуда FROM
m.t = "c:\Program Files (x86)\7z\111 222\arc 111.7z" && вроде в TO
m.o = "output file.txt" && ошибки процесса
m.x = [test.bat] && хз

Теперь переведу строку фокса (макросами) в читаемое:
STRTOFILE([&p l -slt &f > &o], [test.bat])
STRTOFILE("&p l -slt &f > &o", "test.bat")
стало что-то читаемое (скрыл внутренности фокса и ОС... или хз чего)...
не понял про нумерацию строк, как в басике...
не обращайте внимания
Ratings: 0 negative/0 positive
Re: Получить CRC файла в архиве 7zip программно
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
попытался понять...
К сожалению, тебе это не удалось:
FROM - это просто файл архива, с которым работает архиватор;
TO - не существует;
"ошибки процесса" - просто стандартный вывод архиватора, в данном случае туда запишется нужная инфа о файлах архива.

Цитата:
стало что-то читаемое
Читаемое, но нерабочее - имена файлов должны быть в кавычках.
Ratings: 0 negative/1 positive
Re: Получить CRC файла в архиве 7zip программно
VeterVFP
Автор

Сообщений: 413
Откуда: Москва
Дата регистрации: 26.12.2006
akvvohinc
Но вариант с bat-файлом отработал нормально:
Создаю test.bat с требуемой командой (добавил пробелы во все компоненты):
STRTOFILE(["c:\Program Files (x86)\7z\7z.exe" l -slt "c:\Program Files (x86)\7z\111 222\arc 111.7z" >"output file.txt"],[test.bat])

а далее:
ws = CreateObject('WScript.Shell')
ws.Run('test.bat',2,.T.)

И на выходе получаю нормальный output file.txt.

Да, это помогло. Спасибо за идею.
Только добавил перевод кодовой страницы в 1251, чтобы рус буквы тоже корректно обрабатывались:
#DEFINE CRLF CHR(13)+CHR(10)
cWorkDir= 'C:\Тест папка\'
cRunParamStr= ' l -slt "'+ cZipNm+ '" '+ cFileNm+ ' >"'+ cWorkDir+ cInfoFileNm+ '" '
*Создание файла с тех. инфой по архиву/файлу
*(Запуск через создание CMD-файла, т.к. напрямую не срабатывает (почему ?))
*(добавление 'CHCP 1251' - для корректной обработки РУС букв)
STRTOFILE('CHCP 1251'+ CRLF+ cRunProc + cRunParamStr, cWorkDir+ '_CRC.cmd')
lErr= NOT API_RunAndWait(cWorkDir+ '_CRC.cmd', '', .t.)
Ratings: 0 negative/0 positive
Re: Получить CRC файла в архиве 7zip программно
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
akvvohinc
Цитата:
попытался понять...
К сожалению, тебе это не удалось:
FROM - это просто файл архива, с которым работает архиватор;
TO - не существует;
"ошибки процесса" - просто стандартный вывод архиватора, в данном случае туда запишется нужная инфа о файлах архива.

Цитата:
стало что-то читаемое
Читаемое, но нерабочее - имена файлов должны быть в кавычках.

Ааа, это да! А так?
STRTOFILE('"&p" l -slt "&f" > "&o"', "test.bat")
Ratings: 0 negative/0 positive
Re: Получить CRC файла в архиве 7zip программно
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
of63
STRTOFILE('"&p" l -slt "&f" > "&o"', "test.bat")
Собирать строку с помощью макроподстановки - это круть. Да еще и из однобуквенных переменных...

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Получить CRC файла в архиве 7zip программно
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Что (или кто) запрещает?
() на языке однобуквенных переменных построена вся физика и математика

Доб. А это читать проще?
STRTOFILE(["c:\Program Files (x86)\7z\7z.exe" l -slt "c:\Program Files (x86)\7z\111 222\arc 111.7z" >"output file.txt"],[test.bat])

> Собирать строку с помощью макроподстановки - это круть.
Это фокс ФПД так был задуман, мудрыми умами. Причем они сделали даже переменную "m" и "m.m" адекватно "понимаемыми". Писали интерпретатор "фокс" монстры.



Исправлено 2 раз(а). Последнее : of63, 10.11.22 20:20
Ratings: 0 negative/0 positive
Re: Получить CRC файла в архиве 7zip программно
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Ааа, это да! А так?
STRTOFILE('"&p" l -slt "&f" > "&o"', "test.bat")
А так стало рабочим, но нечитаемым.
Три кавычки подряд только комп разберёт, поэтому я использовал квадратные скобки.
Да и использовать в одной команде для одной строки - одинарные кавычки, а для другой - двойные, некомильфо (винегрет).



Исправлено 1 раз(а). Последнее : akvvohinc, 10.11.22 20:18
Ratings: 0 negative/0 positive
Re: Получить CRC файла в архиве 7zip программно
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
там не три кавычки, я обрамил выражение в одиночные кавычки, и наставил внутри выражения двойных кавычек, как ты заметил. Да, можно квадратные скобки применить вместо одиночных кавычек (фокс "милосерд" ) ) для удобствап наблюдения в шрифте... какой тут... хз
Ratings: 0 negative/0 positive
Re: Получить CRC файла в архиве 7zip программно
dimag

Сообщений: 464
Откуда: Одинцово
Дата регистрации: 17.12.2002
Мое мнение лучше использовать
STRTOFILE(textmerge([<<p>> l -slt <<f>> > <<o>>]), [test.bat])
ну хотя бы потому, что в дебагере сразу видно значение.

------------------
Глупость - это не отсутствие ума, это такой ум.
Ratings: 0 negative/0 positive
Re: Получить CRC файла в архиве 7zip программно
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
"В дебагере" - это при подведении мышки к имени переменной высвечивается ТулТипТекст - значение переменной, об этом ?
Это работает и в строке и в строке с использованием макросов (префикс & перед переменной), и в комментарии тоже работает (если в комментарии написать [&& ... m.x] то мы увидим значение переменной X) ... Иногда этот механизм не работает просто (внутри выражения, кмк), независимо от макропрефикса...

Доб. Пытался привыкнуть к TEXTMERGE, но количество служебных символов напрягло, и сам вызов ф-ии (TEXTMERGE) указывать надо. А тут один символ - амперсанд, приятно...

Доб. Компактность выражений (состоящих из подвыражений) дорогого стОит. в фоксе это сделано хорошо (макроподстановки, и их культивирование на первом использовании фокса). Не для начала войн за старо/ново язы, это уже не важно, важен процесс, преемственность, чтеное старых ошибок, борьба с новыми... генезис...



Исправлено 2 раз(а). Последнее : of63, 15.11.22 18:13
Ratings: 0 negative/0 positive
Re: Получить CRC файла в архиве 7zip программно
dimag

Сообщений: 464
Откуда: Одинцово
Дата регистрации: 17.12.2002
of63
"В дебагере" - это при подведении мышки к имени переменной высвечивается ТулТипТекст - значение переменной, об этом ?
Это работает и в строке и в строке с использованием макросов (префикс & перед переменной), и в комментарии тоже работает (если в комментарии написать [&& ... m.x] то мы увидим значение переменной X) ... Иногда этот механизм не работает просто (внутри выражения, кмк), независимо от макропрефикса...

Доб. Пытался привыкнуть к TEXTMERGE, но количество служебных символов напрягло, и сам вызов ф-ии (TEXTMERGE) указывать надо. А тут один символ - амперсанд, приятно...

Бывает нужно посмотреть все выражение в целом, очень удобно.
[attachment 36437 textm1.PNG]
Плюс
lcSQL = textmerge([SELECT <<lcFields>> FROM <<lcTable>>])
удобачитаемость кода выше. Ну в целом кому как, не настаиваю.

------------------
Глупость - это не отсутствие ума, это такой ум.
Ratings: 0 negative/2 positive
Re: Получить CRC файла в архиве 7zip программно
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Плюсанул, про "кому как"

() Бывает нужно посмотреть все выражение в целом
Для этого и упрощал, чтобы не видеть все в целом, в дебагере )

Про писание прог (алгоритм, "программный" путь решения задачи - это песня до конца жизни, задачи жизненные, пожизненные ) ) - все подчиненные бывшие и нынешние жалуются, что "заставляют делать не так, как я хочу [это, де, правильно]" (я не сильно заставляю).

Не знаю как спорить. Только Насилие, как в школе, "преемственность" (обьяснение своих ошибок, решений, недосказанностей официальной т.з., в т.ч. на этом форуме (хотя наши его не читают))
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 33 dafni_2004  (Гостей: 32)

© 2000-2024 Fox Club 
Яндекс.Метрика