Страница 7 из 68
Добавлено: Пт дек 03, 2010 16:00
Reflector
Total7zip писал(а):
если можно, то расскажите как упростить список.
В деталях не вспомню, это делалось довольно давно и я долго сравнивал списки на предмет нахождения закономерностей, но самим кодом могу поделиться:
Код: Выделить всё
void TransformList(ofstream& fout, wchar_t* lst)
{
wstring name, lastName;
size_t lastLength = 0xFFFF;
while(*lst)
{
name = wstring(lst);
size_t length = name.length();
lst += length + 1;
if(length > 3 && name.substr(length - 3) == L"*.*") name = name.substr(0, length - 4);
if(length < lastLength || lastName != name.substr(0, lastLength))
{
lastName = name;
lastLength = length;
if(name[length - 1] == L'\\') name.resize(length - 1);
fout << UnicodeToUTF8(name) << endl;
}
}
}
lst - это AddList который передает PackFiles() или DeleteList передаваемый DeleteFiles(). PackFiles также передает srcPath, я его использовал для задания текущего каталога(_wchdir) непосредственно перед упаковкой.
Добавлено: Пт дек 03, 2010 16:36
Total7zip
насколько я понял, ваш код рассчитан на то, что в списке, который передает тотал будут маски *.*
и если например есть
path1\*.*
то все, что начинется на path1 можно выкинуть.
к сожалению, этот вариант не работает.
тотал передает в плагин список файлов, не используя маски. и соответственно плагин не может предположить, что нужно взять все файлы из папки.
Добавлено: Пт дек 03, 2010 16:40
Reflector
Total7zip писал(а):насколько я понял, ваш код рассчитан на то, что в списке, который передает тотал будут маски *.*
и если например есть
path1\*.*
то все, что начинется на path1 можно выкинуть.
к сожалению, этот вариант не работает.
тотал передает в плагин список файлов, не используя маски. и соответственно плагин не может предположить, что нужно взять все файлы из папки.
Нет, мой код рассчитан на то, что тотал иногда передает маски *.*, хотя это происходит довольно редко. К тому же я даю код из рабочего плагина

Добавлено: Пт дек 03, 2010 17:05
Total7zip
ваш код сокращает количество строк только если в списке есть
path1\*.*
в этом случае код отсеивает все, что начинается с path1
допустим из списка
path1\*.*
path1\readme.txt
path1\test.bmp
ваш код выкинет две последние строчки.
а если поменять порядок так
path1\readme.txt
path1\test.bmp
path1\*.*
то не выкинет ничего.
так как маски тотал мне не дает, получается бесполезная работа.
еще ваш код переводит из Unicode в UTF8, что конечно сокращает размер, но не изменяет ни количество строк, ни их длину.
соответственно, так как мне нужно передать дальше список в unicode
по-моему это бесполезный код.
правильно?
добавлю, что код ваш из рабочего плагина, конечно рабочий, потому что ничего не отсеивает =)
Добавлено: Пт дек 03, 2010 17:21
Reflector
Total7zip писал(а):
добавлю, что код ваш из рабочего плагина, конечно рабочий, потому что ничего не отсеивает =)
Ты мой код проверил? Думаешь когда я пишу, что из всей папки виндовс после трансформации остается одна строка, я на ходу придумываю?

Беру, для примера, каталог Windows, кидаю туда один файл и папку с файлом, пакую, получаю "Windows", а тотал мне передавал:
Windows\
Windows\123.zip
Windows\abc\
Windows\abc\456.zip
Видишь тут *.* ? Идем дальше, заходим в папку Windows, выделяем все файлы, т.е. 123.zip и abc\, получаем:
123.zip
abc
А тотал передавал мне:
123.zip
abc\
abc\456.zip
и т.д....
Добавлено: Пт дек 03, 2010 17:27
Total7zip
тогда у вас баг -
тотал просил вас добавить
Windows\
Windows\123.zip
Windows\abc\
Windows\abc\456.zip
а вы получили на выходе вашего кода просто Windows.
то есть вместо двух файлов вы получили все содержимое папки.
согласны?
Добавлено: Пт дек 03, 2010 17:31
Total7zip
возможно я не прав,
если тотал передает такие списки когда вы выделяете папку.
то есть, сначала дает папку, а потом еще и ее содержание.
надо проверить.
тогда я не понимаю зачем тотал так делает.
то есть другими словами я не прав, если передавая Windows\ тотал имеет ввиду что надо добавить все файлы из папки Windows\
Добавлено: Пт дек 03, 2010 17:32
Reflector
Total7zip писал(а):тогда у вас баг -
тотал просил вас добавить
Windows\
Windows\123.zip
Windows\abc\
Windows\abc\456.zip
а вы получили на выходе вашего кода просто Windows.
то есть вместо двух файлов вы получили все содержимое папки.
согласны?
Я паковал папку Windows, как тотал мог меня просить упаковать только ее часть?

Он честно передал мне все ее содержимое....
Добавлено: Пт дек 03, 2010 17:33
Total7zip
но код ваш всеравно расчитан на то, что тотал передает список в определенном порядке...
если Windows\ будет в конце ничего не отсеится....
ладно, я сдаюсь, давайте в ЛС перенесем это обсуждение.
Добавлено: Пт дек 03, 2010 18:14
Total7zip
Reflector, я готов извиниться если надо.
без обид.
просто ваш код расчитан на "тайное знание" о глюках тотала.
я задам вопрос на офиициальном форуме можно ли расчитывать на такое поведение, насколько это надежно и зачем это делается - сначала имя папки, а потом еще и список файлов. =)
без ответа на эти вопросы мне такой способ кажется ненадежным. это хак, работающий в конкретной версии из-за ее недокументированного поведения.
Добавлено: Пт дек 03, 2010 18:26
Reflector
Total7zip писал(а):
просто ваш код расчитан на "тайное знание" о глюках тотала.
я задам вопрос на офиициальном форуме можно ли расчитывать на такое поведение, насколько это надежно и зачем это делается - сначала имя папки, а потом еще и список файлов. =)
Возможно имя папки передается, т.к. папки бывают пустыми, кроме того тотал их еще и сам создает... В любом случае небольшая модификация позволит упрощать списки в которых имя каталога находится в любом месте или вообще отсутствует. Ушел делать

Добавлено: Пт дек 03, 2010 18:41
Total7zip
если делать такую оптимизацию, то надо по-хорошему проверять является ли путь папкой.
потому что наличие "\" в конце никем не гарантировано.
то есть как-то так -
выбрать из списка только папки.
потом отсортировать их по длине имени и потом выкидывать все что начинается с них.
Добавлено: Пт дек 03, 2010 19:33
MVV
Сейчас проверил на примере встроенного ZIP - скрытые файлы и папки тотал в архив все равно помещает. Но файлы и папки, указанные в списке исключений - нет.
Кстати да, мысль о том, что тотал передает вначале имя папки для того, чтобы создать эту папку в архиве, кажется мне наиболее правдоподобной.
Но если указано имя папки, это еще ничуть не значит, что все ее содержимое потом окажется в архиве.
А сокращать список, переданный тоталом, ИМХО бесполезно - тотал перечисляет в списке файлы, причем каждый файл ровно 1 раз. И пытаться сократить число строк списка тут - пустая затея, ведь число файлов после оптимизации списка измениться не должно.
Добавлено: Пт дек 03, 2010 19:43
Reflector
Total7zip писал(а):
если делать такую оптимизацию, то надо по-хорошему проверять является ли путь папкой.
потому что наличие "" в конце никем не гарантировано.
Ладно, делай как хочешь. Я считаю, что если тотал не будет обеспечивать единообразный интерфейс, то сделать по-хорошему будет очень проблематично в любом случае. А Гислер тот еще консерватор, быть такого не может, чтобы он убрал тот же "" просто так зная, что это может привести к несовместимости.
Добавлено: Пт дек 03, 2010 19:56
Reflector
MVV писал(а):
Но если указано имя папки, это еще ничуть не значит, что все ее содержимое потом окажется в архиве.
Значит. Дело в том, что тотал передает относительные пути. Пакуя папку 123 целиком, ты получишь "123" и это значит, что 123 пакуется целиком. Зайдя в эту папку, и пакуя из нее каталог 456, ты получишь "456" и это также значит, что она пакуется целиком, т.к. нельзя находясь в 123\ выбрать только часть файлов из 456\, для этого нужно находится в 456. Но когда мы попадаем в 456, то не будет никаких "456", ведь она считается корневой папкой, а сам путь 123\456\ передается в другой переменной...
А сокращать список, переданный тоталом, ИМХО бесполезно - тотал перечисляет в списке файлы, причем каждый файл ровно 1 раз. И пытаться сократить число строк списка тут - пустая затея, ведь число файлов после оптимизации списка измениться не должно.
Похоже ты совсем не в теме

Сравни 53806 строк(в моем случае) с одной...