Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Центр помощи > [С++] Поиск в имени файлов |
Автор: Горя 28.7.2009, 21:44 |
Проблема такая: есть папка, наполненная файлами без расширения. Нужен цикл, добавляющий всем файлам расширение .htm Файлов много, так что чем быстрее работает, тем лучше. При этом имя файла меняться не должно - только добавляться в конце расширение. Есть идея - осуществить поиск имён файлов в указанной папке, ища любое сочетание символов (как это делается на С++?) и добавлять к этому сочетанию расширение. Как это сделать практически, никаких мыслей ![]() |
Автор: Gordon 28.7.2009, 22:36 |
Под Windows, думаю можно использовать функции FindFirsFile, FindNextFile... А искать нужно только в самой директории или еще и вложенные просмотреть нужно? |
Автор: Gordon 29.7.2009, 10:53 | ||||
Вот попробуй, функция без дополнительных проверок. Если найдет хоть один файл (удовлетворяющий условию поиска, в данном случае, как я понял, это "*."), попытается его переименовать, потом ищет следующий файл, пытается переименовать его потом следующий и т.д. Если ни одного файла не найдено, вернет false, но если вернет true - это не значить (на 100%) что найденные файл (файл) переименованы...
Использовать можно так:
т.е. добавить всем файлам без расширения в папке "d:\dir" расширение ".htm". Короче, проверь работу у себя... p.s. Думаю суть тебе понятна. |
Автор: Горя 30.7.2009, 14:59 |
error C2601: 'AddExtention' : local function definitions are illegal Ругается на первую строчку после bool, то есть просто на фигурную скобку. Никаких библиотек, кроме иострима не надо? ![]() |
Автор: azesmcar 30.7.2009, 15:01 | ||
а iostream зачем? |
Автор: alexcoder 30.7.2009, 15:52 |
Не люби мозги. Если нужен результат, используй total commander. Выдели файлы нажми ctrl-M либо в меню файл-групповое переименование во втором слева-сверху текстовом окошке ("Маска для расширения") набери html нажми кнопку "выполнить" все! |
Автор: Горя 31.7.2009, 14:05 |
alexcoder, ага, и так делать каждый день, когда робот выкачивает файлы? Каждый день приходить к заказчику, говорить "Привет, тут я вам программку сделал, дайте-ка я ей подсоблю", и садиться переименовывать. Этапять, чувак ![]() Gordon, пробовал, выдавало 26 ошибок ![]() Сейчас библиотечку добавлю, вдруг, запашет. ... Так. Компилится без проблем. Билд не выполняет, еррор (unresolved external symbol _WinMain@16) и фатал еррор, 1 unresolved externals. Не понял, он что, вообще в паре с мейном работать не хочет? о.О |
Автор: azesmcar 31.7.2009, 14:10 | ||
адресатом не ошибся? |
Автор: Горя 31.7.2009, 15:23 |
azesmcar, ошибся, извините. Вам спасибо, прошлые ошибки исчезли. Правда, новые появились ![]() |
Автор: azesmcar 31.7.2009, 15:28 |
Ну показывайте что у вас там, разберемся. |
Автор: Горя 31.7.2009, 16:05 |
Автор: azesmcar 31.7.2009, 16:08 |
замени WinMain на int main() { ... } |
Автор: Горя 31.7.2009, 18:50 | ||
Не, ну я не совсем лох.
Приложение консольное. |
Автор: azesmcar 31.7.2009, 19:33 | ||||
Тьфу...спутал.как раз наоборот ![]() main замени на
или
в зависимости от настройки проекта (юникод/не юникод). |
Автор: Gordon 31.7.2009, 19:56 | ||
Горя, вот мой код в VS 2008:
Все компилируется пез проблем! ))) |
Автор: Горя 31.7.2009, 22:13 |
Gordon, эм... Остальная часть программы сделана через инт мейн ()... Нельзя ли что-нибудь с этим сделать? Если тупо убрать из данной программы всё, на что ругается компилятор, она попросту не работает ![]() А, да. Стыдно говорить, у меня VC++ 6,5 |
Автор: Gordon 31.7.2009, 22:30 | ||||
честно говоря, не совсем понял... Что с чем сделать? Сейчас я попставлю VC 6 и там попробую собрать... Добавлено через 13 минут и 14 секунд вот код, vc 6.0 воспринимает нормально:
|
Автор: azesmcar 31.7.2009, 22:51 |
Gordon Я написал причину на предыдущей странице. Он создает Win32 приложение, а там функция main должна быть описана как WinMain, выдается ошибка линкера, в ней все сказано. |
Автор: Gordon 31.7.2009, 23:40 | ||
Ну да. Только я думал ему нужно консольное приложение... |
Автор: Горя 1.8.2009, 06:58 |
azesmcar, да, вин32 консоль. Какой вин мейн? Gordon, вроде, он и надо... |
Автор: azesmcar 1.8.2009, 08:02 |
На предыдущей странице написано. Да, странно что для консоли он WinMain требует, наверное настройки проекта изменены, по умолчанию не должен. |
Автор: Gordon 1.8.2009, 12:28 |
Горя, может стоит заново создать проект и туда вставить код из старого... |
Автор: Горя 2.8.2009, 13:46 |
Сделал новый проект. Всё равно не уверен, будет ли восприниматься в _tmain то, что работало в main ^^ |
Автор: Gordon 2.8.2009, 15:30 |
Горя, а у тебя VC 6 создает файл с _tmain? _tmain - это, вроде, юникодовый вариант main, а тебе, кажется, нужно было определиться с выбором main или WinMain... |
Автор: Горя 2.8.2009, 18:40 |
Нет, у меня никто ничего не создаёт ![]() И нету файла заголовника stdafx, его тоже не создаёт. Создаю я пустой проект, консольное приложение. Там ничего нет вообще, даже сипипиську надо создавать. |
Автор: Горя 2.8.2009, 20:17 |
Нифига не понимаю. Компилятор ругается на _TCHAR. error C2061: syntax error : identifier '_TCHAR' |
Автор: Горя 2.8.2009, 20:34 | ||
Заработало, вот в таком виде:
Переименовал некоторые (!) файлы. В том числе один тхтшник ![]() Но это плевать, главное, что некоторые файлы без расширения расширил. PS: переименовал 131 из 530 файлов. |
Автор: Gordon 3.8.2009, 19:55 |
У меня тхтшники не переименовывает... А все (530) файлов "находятся"? Можно сделать следующее: если MoveFile завершается неудачей, вызвать GetLastError() чтобы получить информацию об ошибке... А там уже смотреть, почему происходит ошибка. |
Автор: Горя 3.8.2009, 20:48 |
Gordon, был тхтшник log.txt, стал log.txt.htm Нету больше ошибок. |
Автор: Gordon 3.8.2009, 21:31 |
Т.е. нету? Компилятор не выдает или работает без ошибок? Все файлы переименовывает? |
Автор: Горя 3.8.2009, 21:32 |
При компиляции и постройке никаких ошибок не выдаёт. Переименовывает только часть. |
Автор: Gordon 3.8.2009, 21:46 |
Может быть, файлы с такими именами уже есть в директории? Т.е. есть файлы "1" и "1.htm", тогда переименование не произойдет. |
Автор: Горя 4.8.2009, 12:24 |
Gordon, да нет, у меня ж не может там уже быть двух одинаковых файлов. При переименовании же имя никак не меняется, только добавляется .хтм. Нет, у меня папка полна файлов без расширения, естественно, с уникальными именами, и никаких больше там файлов нет. |
Автор: Gordon 4.8.2009, 20:13 |
Горя, а чем файлы, которые не переименовываются, "отличаются" от тех, которые переименовываются... Может они заняты другим приложением? |
Автор: Горя 5.8.2009, 00:30 |
Суть такая: пользуя вгет качаю форум. На форуме страницы все в хтмле. Вгет сохраняет их как viewtopic.php@pid=***, вместо звёздочек - трёхзначное число. И таких вьютопиков пятьсот с лишком штук, но все без нормального расширения оказываются (проблемы с хостом). То есть файлы все совершенно одинаковые, и их имена разнятся лишь на последние три цифры. |
Автор: Gordon 6.8.2009, 11:59 |
Горя, ну попробуй вставить в код проверку на ошибки при переименовании и посмотри почуму ошибка... p.s. честно говоря, не знаю, может MoveFileEx поможет? |
Автор: Горя 6.8.2009, 13:20 |
Стыдно спрашивать, но как её вставить? ![]() |
Автор: zim22 6.8.2009, 14:13 |
CTRL+V |
Автор: Горя 6.8.2009, 14:45 |
zim22, ![]() Только, прикиньте, ничего не вставляется. |
Автор: Gordon 6.8.2009, 15:53 |
Если возвращенное MoveFile значение не "true" тогда вызвать функцию GetLastError() для получения кода ошибки (может он что подскажет)... |
Автор: Gordon 6.8.2009, 18:42 | ||
Можно примерно так написать:
Можно еще использовать функцию "FormatMessage", а можно посмотреть описание ошибок http://ezpc.ru/win3.shtml, вроде те... |
Автор: Mad 6.8.2009, 19:08 | ||||
Вот это должно работать с любыми настройками (Юнткод, Мультибайт и обычный) :
Использовать так :
|
Автор: Горя 6.8.2009, 20:03 |
Mad, попробую. ... Вот получилось: error C2065: '_stprintf_s' : undeclared identifier Gordon, во, оказывается, чтобы ваша программа у меня работала, нужен tchar.h. Данный вами кусок работует, но не выдаёт никаких ошибок. Программка срабатывает, выпадает обычный чёрный экран и Press any key to continue. Добавлено через 11 минут и 41 секунду PS: хм. Вложенные папки тоже переименовал. Причём два раза (папка.htm.htm). |
Автор: Mad 6.8.2009, 20:19 | ||
[quote=Горя, 6.8.2009, 19:03, post1937478]Вот получилось: error C2065: '_stprintf_s' : undeclared identifier[/quoe] для VS < v9.0 убери "_s", при этом будет нормально компилиться и в 9.0 но с warning :
|
Автор: Gordon 6.8.2009, 20:40 | ||||
Там было два варианта, для VS 2008 (т.е. 9 версии) и для VC++ 6.0...
Да, папки переименовывает (плохо, что файлы без расширения)... Но у меня только один раз... ![]() |
Автор: Горя 6.8.2009, 22:21 |
Gordon, да ладно, с папок не убудет, плевать. Mad, ваша вообще никак не работает. Ничего не переименовывает. Добавлено через 3 минуты и 7 секунд Gordon, удалил уже переименованные файлы, запустил заново. Папки переименовались снова Оо Кстати, нашёл, чем они отличаются. Переименованные файлы были с именем viewtopic.php@pid=***, а те, что не переименовываются - viewtopic.php@pid=***. |
Автор: Mad 7.8.2009, 00:19 | ||||
конечно, ведь реч шла о файлах без расширения, а теперь о в денном случае расширение этих файлов "php@pid=***" (расширением файла считаеться любой набор символов после последней точки в имени файла). В вашем конкретном случае надо заменить условие
на более сложное. которое будет проверять имеет файл расширение html или нет (а не имеет расширение вообще. как сейчас)
Не стоит забывать, что функции сравнения строк чуствительны к регисту (т.е это условие не позволит переименновать файл с расширением .html, но переиминует .HTML и друоие вариации). |
Автор: zim22 7.8.2009, 07:48 |
перед сравнением строк можно привести их к одному регистру. |
Автор: Gordon 8.8.2009, 15:45 | ||
что-то я разницу не усмотрел... ![]() Добавлено через 4 минуты и 19 секунд Горя, а в каталоге только файлы без расширения, или еще какие есть? |
Автор: Горя 8.8.2009, 21:17 |
Э... Что-то я ошибся. Ну, вот, с расширениями разными, и был один .тхт (самое весёлое, что его переименовало). |
Автор: Gordon 9.8.2009, 15:15 |
Ошибся, когда на тут писал, или в наличии различий в именах? |
Автор: zim22 12.8.2009, 15:26 |
Горя, не лучше ли использовать готовое ПО? Какой-нибудь renamer c поддержкой регулярных выражений подойдёт. |
Автор: Dov 13.8.2009, 21:51 |
для этих целей нужно юзать _tcsicmp и ей подобные. |
Автор: Горя 23.8.2009, 22:06 |
Mad, пофиг на регистр, всё прописью. Gordon, в наличии разниц в именах. zim22, некуртуазно ![]() |
Автор: Gordon 26.8.2009, 20:43 |
Горя, так ты на чем остановился? |
Автор: Горя 3.9.2009, 20:39 | ||||
Mad, ваша программа не работает в таком виде:
Отличия от исходного кода на прошлой странице: 1) из _stprintf_s убрана вторая _s (методом научного тыка, tprintf и tprintf_s тоже вызывают ошибку). Если заменить _stprintf_s (_stprintf в вышеуказанном коде), то переименовываются только папки. 2) заменён if(!_tcschr(dt.cFileName, '.')) на выложенный вами. Gordon, ваш код тоже переименовывает только папки.
|
Автор: Gordon 4.9.2009, 18:48 | ||
Горя, если у тебя все файлы, которые нужно переименовать, заканчиваются на "*.php@pid=****", тогда можно так написать:
p.s. ты еще не совсем правильно код написал, после "return true;" ничего выполняться не будет... |
Автор: Горя 6.9.2009, 19:31 |
Всё заработало, огромное мерси всем участникам. |
Автор: Gordon 9.9.2009, 16:39 |
Так на чем остановлися? Где проблема была? |