обработка всех файлов и папок в каталоге

Алгоритмы: от сортировки пузырьком до численных методов

Модераторы: C_O_D_E, DeeJayC

Ответить
Аватара пользователя
demon416
Сообщения: 178
Зарегистрирован: 30 янв 2006, 14:03
Откуда: kirovskoe

Написал программу приводящюю имена файлов и папок в заданный вид
например только английские буквы без пробелов
все работает, но изза не очень хорошего алгоритма обхода папок работает очень медленно (запущенная на файловом сервере с настройкой поисправлять имена в утф16 на имена в виндовой кодировке программа работала двое суток :( )
мой алгоритм состоит в следующем :
есть массив в котором номер элемента соответствует глубине(от корневой папки), а содержимое количеству обработанных папок
при переходе в папку происходит обработка всех содержащихся в ней файлов и папок после этого пропускается столько папок сколько указано в массиве и число в массиве увеличивается на 1 , программа переходит в следующую папку
если в папке обработаны все папки программа поднимается на уровень выше
пока не обработает все папки в корневой.
если кто сталкивался с подобной задачей и нашел более быстрое решение (несчитая записи всех обработанных файлов) прошу написать сюда
ака хинт: коментируйте код, самим же легче будет разобраться ;)
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

угу. было дело. ну, я подобные задачи решал через рекурсию...
если нашли папку, то вызываем сами себя: DoCatalog( Path+'\'+fr.Name);
если файл - то обрабатываем его...
стека должно хватить, т.к. в файловой системе есть ограничение на суммарную длину (что-то около 250 символов на суммарный путь)...
Аватара пользователя
demon416
Сообщения: 178
Зарегистрирован: 30 янв 2006, 14:03
Откуда: kirovskoe

дело в том что я меняю имена папок и файлов :)
ака хинт: коментируйте код, самим же легче будет разобраться ;)
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

ну и что? возьмём наипростейший случай.
в каталоге ДВА файла и нет ни одной подпапки.
Если Вашу программу запускать несколько раз - имена файлов будут каждый раз разные? Если нет - то тогда мой способ будет прекрасно работать.
Если же каждый раз разные - то объясните почему? ;-)
Аватара пользователя
demon416
Сообщения: 178
Зарегистрирован: 30 янв 2006, 14:03
Откуда: kirovskoe

спасибо дошло :) хотя возникают сомнения насчет памяти у меня папок несколько миллионов
ака хинт: коментируйте код, самим же легче будет разобраться ;)
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

не попробовав плода — не познаешь его вкус...

Дерзайте ;-) всё в Ваших руках ;-)
я думаю, что памяти в стеке хватит ;-)
Аватара пользователя
demon416
Сообщения: 178
Зарегистрирован: 30 янв 2006, 14:03
Откуда: kirovskoe

работает но findnext теряется при переименовывании и в результате некоторые файлы обрабатываются несколько раз :(
пришлось предварительный проход папки делать
ака хинт: коментируйте код, самим же легче будет разобраться ;)
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

А зачем сразу переименовывать ? Сделай вектор пар новых названий и старых и переименовывай потом.
typedef std::Рair<std::string, std::string> PairString;
std::vector<PairString> rename_vt;
...
rename_vt.push_back(std::Рair<old_name, new_name>);
...

Я думаю идея ясна. Только чур не пинать за синтаксис, тут писал пример.
Аватара пользователя
demon416
Сообщения: 178
Зарегистрирован: 30 янв 2006, 14:03
Откуда: kirovskoe

Спасибо, уже реализовано :) (когда прошлый пост в теме оставлял)
ака хинт: коментируйте код, самим же легче будет разобраться ;)
markofka
Сообщения: 8
Зарегистрирован: 20 окт 2008, 17:02
Контактная информация:

Возможно вам поможет следующая программа. Когда-то она мне очень помогла.
Отличная программа с кучей настроек. Написана на Perl
http://www.j3e.de/linux/convmv/
пример: convmv -f cp866 -t UTF-8
Ответить