View previous topic :: View next topic |
Author |
Message |
Reflector
Joined: 29 Nov 2009 Posts: 56
|
(Separately) Posted: Fri Dec 03, 2010 17:00 Post subject: |
|
|
Total7zip wrote: |
если можно, то расскажите как упростить список.
|
В деталях не вспомню, это делалось довольно давно и я долго сравнивал списки на предмет нахождения закономерностей, но самим кодом могу поделиться:
Code: |
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) непосредственно перед упаковкой. |
|
Back to top |
|
|
Total7zip
Joined: 27 Nov 2010 Posts: 287
|
(Separately) Posted: Fri Dec 03, 2010 17:36 Post subject: |
|
|
насколько я понял, ваш код рассчитан на то, что в списке, который передает тотал будут маски *.*
и если например есть
path1\*.*
то все, что начинется на path1 можно выкинуть.
к сожалению, этот вариант не работает.
тотал передает в плагин список файлов, не используя маски. и соответственно плагин не может предположить, что нужно взять все файлы из папки. |
|
Back to top |
|
|
Reflector
Joined: 29 Nov 2009 Posts: 56
|
(Separately) Posted: Fri Dec 03, 2010 17:40 Post subject: |
|
|
Total7zip wrote: | насколько я понял, ваш код рассчитан на то, что в списке, который передает тотал будут маски *.*
и если например есть
path1\*.*
то все, что начинется на path1 можно выкинуть.
к сожалению, этот вариант не работает.
тотал передает в плагин список файлов, не используя маски. и соответственно плагин не может предположить, что нужно взять все файлы из папки.
|
Нет, мой код рассчитан на то, что тотал иногда передает маски *.*, хотя это происходит довольно редко. К тому же я даю код из рабочего плагина |
|
Back to top |
|
|
Total7zip
Joined: 27 Nov 2010 Posts: 287
|
(Separately) Posted: Fri Dec 03, 2010 18:05 Post subject: |
|
|
ваш код сокращает количество строк только если в списке есть
path1\*.*
в этом случае код отсеивает все, что начинается с path1
допустим из списка
path1\*.*
path1\readme.txt
path1\test.bmp
ваш код выкинет две последние строчки.
а если поменять порядок так
path1\readme.txt
path1\test.bmp
path1\*.*
то не выкинет ничего.
так как маски тотал мне не дает, получается бесполезная работа.
еще ваш код переводит из Unicode в UTF8, что конечно сокращает размер, но не изменяет ни количество строк, ни их длину.
соответственно, так как мне нужно передать дальше список в unicode
по-моему это бесполезный код.
правильно?
добавлю, что код ваш из рабочего плагина, конечно рабочий, потому что ничего не отсеивает =) |
|
Back to top |
|
|
Reflector
Joined: 29 Nov 2009 Posts: 56
|
(Separately) Posted: Fri Dec 03, 2010 18:21 Post subject: |
|
|
Total7zip wrote: |
добавлю, что код ваш из рабочего плагина, конечно рабочий, потому что ничего не отсеивает =)
|
Ты мой код проверил? Думаешь когда я пишу, что из всей папки виндовс после трансформации остается одна строка, я на ходу придумываю?
Беру, для примера, каталог 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
и т.д.... |
|
Back to top |
|
|
Total7zip
Joined: 27 Nov 2010 Posts: 287
|
(Separately) Posted: Fri Dec 03, 2010 18:27 Post subject: |
|
|
тогда у вас баг -
тотал просил вас добавить
Windows\
Windows\123.zip
Windows\abc\
Windows\abc\456.zip
а вы получили на выходе вашего кода просто Windows.
то есть вместо двух файлов вы получили все содержимое папки.
согласны? |
|
Back to top |
|
|
Total7zip
Joined: 27 Nov 2010 Posts: 287
|
(Separately) Posted: Fri Dec 03, 2010 18:31 Post subject: |
|
|
возможно я не прав,
если тотал передает такие списки когда вы выделяете папку.
то есть, сначала дает папку, а потом еще и ее содержание.
надо проверить.
тогда я не понимаю зачем тотал так делает.
то есть другими словами я не прав, если передавая Windows\ тотал имеет ввиду что надо добавить все файлы из папки Windows\ |
|
Back to top |
|
|
Reflector
Joined: 29 Nov 2009 Posts: 56
|
(Separately) Posted: Fri Dec 03, 2010 18:32 Post subject: |
|
|
Total7zip wrote: | тогда у вас баг -
тотал просил вас добавить
Windows\
Windows\123.zip
Windows\abc\
Windows\abc\456.zip
а вы получили на выходе вашего кода просто Windows.
то есть вместо двух файлов вы получили все содержимое папки.
согласны?
|
Я паковал папку Windows, как тотал мог меня просить упаковать только ее часть? Он честно передал мне все ее содержимое.... |
|
Back to top |
|
|
Total7zip
Joined: 27 Nov 2010 Posts: 287
|
(Separately) Posted: Fri Dec 03, 2010 18:33 Post subject: |
|
|
но код ваш всеравно расчитан на то, что тотал передает список в определенном порядке...
если Windows\ будет в конце ничего не отсеится....
ладно, я сдаюсь, давайте в ЛС перенесем это обсуждение. |
|
Back to top |
|
|
Total7zip
Joined: 27 Nov 2010 Posts: 287
|
(Separately) Posted: Fri Dec 03, 2010 19:14 Post subject: |
|
|
Reflector, я готов извиниться если надо.
без обид.
просто ваш код расчитан на "тайное знание" о глюках тотала.
я задам вопрос на офиициальном форуме можно ли расчитывать на такое поведение, насколько это надежно и зачем это делается - сначала имя папки, а потом еще и список файлов. =)
без ответа на эти вопросы мне такой способ кажется ненадежным. это хак, работающий в конкретной версии из-за ее недокументированного поведения. |
|
Back to top |
|
|
Reflector
Joined: 29 Nov 2009 Posts: 56
|
(Separately) Posted: Fri Dec 03, 2010 19:26 Post subject: |
|
|
Total7zip wrote: |
просто ваш код расчитан на "тайное знание" о глюках тотала.
я задам вопрос на офиициальном форуме можно ли расчитывать на такое поведение, насколько это надежно и зачем это делается - сначала имя папки, а потом еще и список файлов. =)
|
Возможно имя папки передается, т.к. папки бывают пустыми, кроме того тотал их еще и сам создает... В любом случае небольшая модификация позволит упрощать списки в которых имя каталога находится в любом месте или вообще отсутствует. Ушел делать |
|
Back to top |
|
|
Total7zip
Joined: 27 Nov 2010 Posts: 287
|
(Separately) Posted: Fri Dec 03, 2010 19:41 Post subject: |
|
|
если делать такую оптимизацию, то надо по-хорошему проверять является ли путь папкой.
потому что наличие "\" в конце никем не гарантировано.
то есть как-то так -
выбрать из списка только папки.
потом отсортировать их по длине имени и потом выкидывать все что начинается с них. |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Fri Dec 03, 2010 20:33 Post subject: |
|
|
Сейчас проверил на примере встроенного ZIP - скрытые файлы и папки тотал в архив все равно помещает. Но файлы и папки, указанные в списке исключений - нет.
Кстати да, мысль о том, что тотал передает вначале имя папки для того, чтобы создать эту папку в архиве, кажется мне наиболее правдоподобной.
Но если указано имя папки, это еще ничуть не значит, что все ее содержимое потом окажется в архиве.
А сокращать список, переданный тоталом, ИМХО бесполезно - тотал перечисляет в списке файлы, причем каждый файл ровно 1 раз. И пытаться сократить число строк списка тут - пустая затея, ведь число файлов после оптимизации списка измениться не должно. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
|
Reflector
Joined: 29 Nov 2009 Posts: 56
|
(Separately) Posted: Fri Dec 03, 2010 20:43 Post subject: |
|
|
Total7zip wrote: |
если делать такую оптимизацию, то надо по-хорошему проверять является ли путь папкой.
потому что наличие "\" в конце никем не гарантировано.
|
Ладно, делай как хочешь. Я считаю, что если тотал не будет обеспечивать единообразный интерфейс, то сделать по-хорошему будет очень проблематично в любом случае. А Гислер тот еще консерватор, быть такого не может, чтобы он убрал тот же "\" просто так зная, что это может привести к несовместимости. |
|
Back to top |
|
|
Reflector
Joined: 29 Nov 2009 Posts: 56
|
(Separately) Posted: Fri Dec 03, 2010 20:56 Post subject: |
|
|
MVV wrote: |
Но если указано имя папки, это еще ничуть не значит, что все ее содержимое потом окажется в архиве.
|
Значит. Дело в том, что тотал передает относительные пути. Пакуя папку 123 целиком, ты получишь "123\" и это значит, что 123 пакуется целиком. Зайдя в эту папку, и пакуя из нее каталог 456, ты получишь "456\" и это также значит, что она пакуется целиком, т.к. нельзя находясь в 123\ выбрать только часть файлов из 456\, для этого нужно находится в 456. Но когда мы попадаем в 456, то не будет никаких "456\", ведь она считается корневой папкой, а сам путь 123\456\ передается в другой переменной...
Quote: |
А сокращать список, переданный тоталом, ИМХО бесполезно - тотал перечисляет в списке файлы, причем каждый файл ровно 1 раз. И пытаться сократить число строк списка тут - пустая затея, ведь число файлов после оптимизации списка измениться не должно.
|
Похоже ты совсем не в теме Сравни 53806 строк(в моем случае) с одной... |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|