Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [С++] Поиск в имени файлов, Нужна автозамена 
:(
    Опции темы
Горя
Дата 28.7.2009, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Проблема такая: есть папка, наполненная файлами без расширения.
Нужен цикл, добавляющий всем файлам расширение .htm
Файлов много, так что чем быстрее работает, тем лучше. При этом имя файла меняться не должно - только добавляться в конце расширение.

Есть идея - осуществить поиск имён файлов в указанной папке, ища любое сочетание символов (как это делается на С++?) и добавлять к этому сочетанию расширение.
Как это сделать практически, никаких мыслей smile 
PM MAIL   Вверх
Gordon
Дата 28.7.2009, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Под Windows, думаю можно использовать функции FindFirsFile, FindNextFile... А искать нужно только в самой директории или еще и вложенные просмотреть нужно?


--------------------

  
     
PM MAIL WWW   Вверх
Gordon
Дата 29.7.2009, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Вот попробуй, функция без дополнительных проверок. Если найдет хоть один файл (удовлетворяющий условию поиска, в данном случае, как я понял, это "*."), попытается его переименовать, потом ищет следующий файл, пытается переименовать его потом следующий и т.д. Если ни одного файла не найдено, вернет false, но если вернет true - это не значить (на 100%) что найденные файл (файл) переименованы...
Код

bool AddExtention(std::string dir, std::string ext)
{
    WIN32_FIND_DATAA file;    
    HANDLE hFile = FindFirstFileA(std::string(dir).append("\\*.").c_str(), &file);
    if(hFile == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    do
    {
        MoveFileA(std::string(dir).append("\\").append(file.cFileName).c_str(), 
            std::string(dir).append("\\").append(file.cFileName).append(ext).c_str());
    }while(FindNextFileA(hFile, &file));

    FindClose(hFile);

        return true;
}


Использовать можно так:

Код

AddExtention("d:\\dir", ".htm");

т.е. добавить всем файлам без расширения в папке "d:\dir" расширение ".htm".
Короче, проверь работу у себя...

p.s. Думаю суть тебе понятна.


--------------------

  
     
PM MAIL WWW   Вверх
Горя
Дата 30.7.2009, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



error C2601: 'AddExtention' : local function definitions are illegal

Ругается на первую строчку после bool, то есть просто на фигурную скобку.
Никаких библиотек, кроме иострима не надо? smile 
PM MAIL   Вверх
azesmcar
Дата 30.7.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 9
Всего: 211



Цитата(Горя @  30.7.2009,  14:59 Найти цитируемый пост)
Никаких библиотек, кроме иострима не надо? 

Код

#include <string>
#include "windows.h"


а iostream зачем?
PM   Вверх
Gordon
Дата 30.7.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Цитата(Горя @  30.7.2009,  15:59 Найти цитируемый пост)
error C2601: 'AddExtention' : local function definitions are illegal


Горя, ты походу просто функцию AddExtention "вставил" в какую-то другую, в main, например... Сделай её глобальной!




--------------------

  
     
PM MAIL WWW   Вверх
alexcoder
Дата 30.7.2009, 15:52 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 21.6.2009

Репутация: нет
Всего: нет



Не люби мозги. Если нужен результат, используй total commander.
Выдели файлы
нажми ctrl-M либо в меню файл-групповое переименование
во втором слева-сверху текстовом окошке ("Маска для расширения") набери html
нажми кнопку "выполнить"
все!
PM MAIL   Вверх
Горя
Дата 31.7.2009, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



alexcoder, ага, и так делать каждый день, когда робот выкачивает файлы? Каждый день приходить к заказчику, говорить "Привет, тут я вам программку сделал, дайте-ка я ей подсоблю", и садиться переименовывать. Этапять, чувак smile 


Gordon, пробовал, выдавало 26 ошибок smile 
Сейчас библиотечку добавлю, вдруг, запашет.
...
Так. Компилится без проблем. Билд не выполняет, еррор (unresolved external symbol _WinMain@16) и фатал еррор, 1 unresolved externals.

Не понял, он что, вообще в паре с мейном работать не хочет? о.О

Это сообщение отредактировал(а) Горя - 31.7.2009, 15:24
PM MAIL   Вверх
azesmcar
Дата 31.7.2009, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 9
Всего: 211



Цитата(Горя @  31.7.2009,  14:05 Найти цитируемый пост)
azesmcar, ага, и так делать каждый день, когда робот выкачивает файлы? Каждый день приходить к заказчику, говорить "Привет, тут я вам программку сделал, дайте-ка я ей подсоблю", и садиться переименовывать. Этапять, чувак smile 

адресатом не ошибся?

Это сообщение отредактировал(а) azesmcar - 31.7.2009, 14:19
PM   Вверх
Горя
Дата 31.7.2009, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



azesmcar, ошибся, извините. Вам спасибо, прошлые ошибки исчезли. Правда, новые появились  smile 
PM MAIL   Вверх
azesmcar
Дата 31.7.2009, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 9
Всего: 211



Цитата(Горя @  31.7.2009,  15:23 Найти цитируемый пост)
прошлые ошибки исчезли. Правда, новые появились  

Ну показывайте что у вас там, разберемся.

Это сообщение отредактировал(а) azesmcar - 31.7.2009, 15:29
PM   Вверх
Горя
Дата 31.7.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Цитата(Горя @  31.7.2009,  14:05 Найти цитируемый пост)
Так. Компилится без проблем. Билд не выполняет, еррор (unresolved external symbol _WinMain@16) и фатал еррор, 1 unresolved externals.

PM MAIL   Вверх
azesmcar
Дата 31.7.2009, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 9
Всего: 211



замени WinMain на int main() { ... }
PM   Вверх
Горя
Дата 31.7.2009, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Не, ну я не совсем лох.
Код

int main()
{
    AddExtention("c:\\dir", ".htm");

 return 0;
}

Приложение консольное.
PM MAIL   Вверх
azesmcar
Дата 31.7.2009, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 9
Всего: 211



Тьфу...спутал.как раз наоборот smile 
main замени на
Код

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)

или
Код

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR    lpCmdLine,
                     int       nCmdShow)

в зависимости от настройки проекта (юникод/не юникод).

Это сообщение отредактировал(а) azesmcar - 31.7.2009, 19:33
PM   Вверх
Gordon
Дата 31.7.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Горя, вот мой код в VS 2008:

Код

#include "stdafx.h"
#include <windows.h>
#include <string>


bool AddExtention(std::string dir, std::string ext)
{
    WIN32_FIND_DATAA file;    
    HANDLE hFile = FindFirstFileA(std::string(dir).append("\\*.").c_str(), &file);
    if(hFile == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    do
    {
        MoveFileA(std::string(dir).append("\\").append(file.cFileName).c_str(), 
            std::string(dir).append("\\").append(file.cFileName).append(ext).c_str());
    }while(FindNextFileA(hFile, &file));

    FindClose(hFile);

        return true;
}


int _tmain(int argc, _TCHAR* argv[])
{    
    AddExtention("d:\\dir", ".htm");    
    
    return 0;
}


Все компилируется пез проблем! )))


--------------------

  
     
PM MAIL WWW   Вверх
Горя
Дата 31.7.2009, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Gordon, эм... Остальная часть программы сделана через инт мейн ()... Нельзя ли что-нибудь с этим сделать?
Если тупо убрать из данной программы всё, на что ругается компилятор, она попросту не работает smile 
А, да. Стыдно говорить, у меня VC++ 6,5
PM MAIL   Вверх
Gordon
Дата 31.7.2009, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Цитата(Горя @  31.7.2009,  23:13 Найти цитируемый пост)
Остальная часть программы сделана через инт мейн ()... Нельзя ли что-нибудь с этим сделать?


честно говоря, не совсем понял... Что с чем сделать? 

Сейчас я попставлю VC 6 и там попробую собрать...

Добавлено через 13 минут и 14 секунд
вот код, vc 6.0 воспринимает нормально:

Код

#include "stdafx.h"
#include <windows.h>
#include <string>

bool AddExtention(std::string dir, std::string ext)
{
    WIN32_FIND_DATAA file;    
    HANDLE hFile = FindFirstFileA(std::string(dir).append("\\*.").c_str(), &file);
    if(hFile == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    do
    {
        MoveFileA(std::string(dir).append("\\").append(file.cFileName).c_str(), 
            std::string(dir).append("\\").append(file.cFileName).append(ext).c_str());
    }while(FindNextFileA(hFile, &file));

    FindClose(hFile);

        return true;
}

int main(int argc, char* argv[])
{
    AddExtention("d:\\dir", ".htm");

    system("pause");
    return 0;
}



--------------------

  
     
PM MAIL WWW   Вверх
azesmcar
Дата 31.7.2009, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 9
Всего: 211



Gordon

Я написал причину на предыдущей странице. Он создает Win32 приложение, а там функция main должна быть описана как WinMain, выдается ошибка линкера, в ней все сказано.
PM   Вверх
Gordon
Дата 31.7.2009, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Цитата(azesmcar @  31.7.2009,  23:51 Найти цитируемый пост)
Я написал причину на предыдущей странице. Он создает Win32 приложение, а там функция main должна быть описана как WinMain, выдается ошибка линкера, в ней все сказано.


Ну да. Только я думал ему нужно консольное приложение...


--------------------

  
     
PM MAIL WWW   Вверх
Горя
Дата 1.8.2009, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



azesmcar, да, вин32 консоль. Какой вин мейн?


Gordon, вроде, он и надо...
PM MAIL   Вверх
azesmcar
Дата 1.8.2009, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 9
Всего: 211



Цитата(Горя @  1.8.2009,  06:58 Найти цитируемый пост)
azesmcar, да, вин32 консоль. Какой вин мейн?

На предыдущей странице написано.

Цитата(Gordon @  31.7.2009,  23:40 Найти цитируемый пост)
Ну да. Только я думал ему нужно консольное приложение... 

Да, странно что для консоли он WinMain требует, наверное настройки проекта изменены, по умолчанию не должен.
PM   Вверх
Gordon
Дата 1.8.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Горя, может стоит заново создать проект и туда вставить код из старого...


--------------------

  
     
PM MAIL WWW   Вверх
Горя
Дата 2.8.2009, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Сделал новый проект. Всё равно не уверен, будет ли восприниматься в _tmain то, что работало в main ^^
PM MAIL   Вверх
Gordon
Дата 2.8.2009, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Горя, а у тебя VC 6 создает файл с _tmain? _tmain - это, вроде, юникодовый вариант main, а тебе, кажется, нужно было определиться с выбором main или WinMain...


--------------------

  
     
PM MAIL WWW   Вверх
Горя
Дата 2.8.2009, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Нет, у меня никто ничего не создаёт smile 
И нету файла заголовника stdafx, его тоже не создаёт.
Создаю я пустой проект, консольное приложение. Там ничего нет вообще, даже сипипиську надо создавать.
PM MAIL   Вверх
Горя
Дата 2.8.2009, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Нифига не понимаю. Компилятор ругается на _TCHAR. error C2061: syntax error : identifier '_TCHAR'

PM MAIL   Вверх
Горя
Дата 2.8.2009, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Заработало, вот в таком виде:
Код

#include "stdafx.h"
#include <windows.h>
#include <string>


bool AddExtention(std::string dir, std::string ext)
{
    WIN32_FIND_DATAA file;    
    HANDLE hFile = FindFirstFileA(std::string(dir).append("\\*.").c_str(), &file);
    if(hFile == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    do
    {
        MoveFileA(std::string(dir).append("\\").append(file.cFileName).c_str(), 
            std::string(dir).append("\\").append(file.cFileName).append(ext).c_str());
    }while(FindNextFileA(hFile, &file));

    FindClose(hFile);

        return true;
}


int main(int argc, char* argv[])
{    
    AddExtention("c:\\dir", ".htm");    
    
    return 0;
}


Переименовал некоторые (!) файлы. В том числе один тхтшник smile 
Но это плевать, главное, что некоторые файлы без расширения расширил.
PS: переименовал 131 из 530 файлов.

Это сообщение отредактировал(а) Горя - 2.8.2009, 20:37
PM MAIL   Вверх
Gordon
Дата 3.8.2009, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Цитата(Горя @  2.8.2009,  21:34 Найти цитируемый пост)
Переименовал некоторые (!) файлы. В том числе один тхтшник  

У меня тхтшники не переименовывает... 

Цитата(Горя @  2.8.2009,  21:34 Найти цитируемый пост)
 переименовал 131 из 530 файлов.


А все (530) файлов "находятся"? Можно сделать следующее:
если MoveFile завершается неудачей, вызвать GetLastError() чтобы получить информацию об ошибке... А там уже смотреть, почему происходит ошибка.



--------------------

  
     
PM MAIL WWW   Вверх
Горя
Дата 3.8.2009, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Gordon, был тхтшник log.txt, стал log.txt.htm

Нету больше ошибок.
PM MAIL   Вверх
Gordon
Дата 3.8.2009, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Цитата(Горя @  3.8.2009,  21:48 Найти цитируемый пост)
Нету больше ошибок.


Т.е. нету? Компилятор не выдает или работает без ошибок? Все файлы переименовывает?


--------------------

  
     
PM MAIL WWW   Вверх
Горя
Дата 3.8.2009, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



При компиляции и постройке никаких ошибок не выдаёт. Переименовывает только часть.
PM MAIL   Вверх
Gordon
Дата 3.8.2009, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Цитата(Горя @  3.8.2009,  22:32 Найти цитируемый пост)
Переименовывает только часть.


Может быть, файлы с такими именами уже есть в директории? Т.е. есть файлы "1" и "1.htm", тогда переименование не произойдет.


--------------------

  
     
PM MAIL WWW   Вверх
Горя
Дата 4.8.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Gordon, да нет, у меня ж не может там уже быть двух одинаковых файлов. При переименовании же имя никак не меняется, только добавляется .хтм. Нет, у меня папка полна файлов без расширения, естественно, с уникальными именами, и никаких больше там файлов нет.
PM MAIL   Вверх
Gordon
Дата 4.8.2009, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Горя, а чем файлы, которые не переименовываются, "отличаются" от тех, которые переименовываются... Может они заняты другим приложением? 


--------------------

  
     
PM MAIL WWW   Вверх
Горя
Дата 5.8.2009, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Суть такая: пользуя вгет качаю форум. На форуме страницы все в хтмле. Вгет сохраняет их как viewtopic.php@pid=***, вместо звёздочек - трёхзначное число. И таких вьютопиков пятьсот с лишком штук, но все без нормального расширения оказываются (проблемы с хостом).
То есть файлы все совершенно одинаковые, и их имена разнятся лишь на последние три цифры.
PM MAIL   Вверх
Gordon
Дата 6.8.2009, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Горя, ну попробуй вставить в код проверку на ошибки при переименовании и посмотри почуму ошибка... 

p.s. честно говоря, не знаю, может MoveFileEx поможет?


--------------------

  
     
PM MAIL WWW   Вверх
Горя
Дата 6.8.2009, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Стыдно спрашивать, но как её вставить? smile 
PM MAIL   Вверх
zim22
Дата 6.8.2009, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



Цитата(Горя @  6.8.2009,  13:20 Найти цитируемый пост)
как её вставить?

CTRL+V


--------------------
PM MAIL   Вверх
Горя
Дата 6.8.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



zim22,  smile 
Только, прикиньте, ничего не вставляется.
PM MAIL   Вверх
Gordon
Дата 6.8.2009, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Если возвращенное MoveFile значение не "true" тогда вызвать функцию GetLastError() для получения кода ошибки (может он что подскажет)...


--------------------

  
     
PM MAIL WWW   Вверх
Gordon
Дата 6.8.2009, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Можно примерно так написать:
Код

if(!MoveFileA(std::string(dir).append("\\").append(file.cFileName).c_str(), 
    std::string(dir).append("\\").append(file.cFileName).append(ext).c_str()))
{
    std::cout << "Error code: " << GetLastError() 
        << "\tFile name: " << file.cFileName << std::endl;            
}


Можно еще использовать функцию "FormatMessage", а можно посмотреть описание ошибок тут, вроде те...


--------------------

  
     
PM MAIL WWW   Вверх
Mad
Дата 6.8.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 1
Всего: 19



Вот это должно работать с любыми настройками (Юнткод, Мультибайт и обычный) :
Код

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

void RenameFiles(TCHAR* dir, TCHAR* newExt)
{
    TCHAR tdir[MAX_PATH];
    _stprintf_s(tdir, _T("%s/*"), dir);

    WIN32_FIND_DATA dt;
    HANDLE hFind = FindFirstFile(tdir, &dt);
    if (hFind != INVALID_HANDLE_VALUE)
    {
        do
        {
            if(!_tcschr(dt.cFileName, '.'))
            {
                TCHAR tname[MAX_PATH];
                TCHAR oname[MAX_PATH];
                _stprintf_s(tname, _T("%s/%s.%s"), dir, dt.cFileName, newExt);
                _stprintf_s(oname, _T("%s/%s"), dir, dt.cFileName);
                MoveFile(oname, tname);
            }
        } while (FindNextFile(hFind, &dt));
        FindClose(hFind);
    }
}

Использовать так :
Код

int _tmain(int argc, _TCHAR* argv[])
{
    RenameFiles(_T("g:/projects/massfilerename/testdata"), _T("html"));

    getchar();
    return 0;
}



--------------------
user posted image
PM MAIL   Вверх
Горя
Дата 6.8.2009, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Mad, попробую.
...
Вот получилось: error C2065: '_stprintf_s' : undeclared identifier

Gordon, во, оказывается, чтобы ваша программа у меня работала, нужен tchar.h.
Данный вами кусок работует, но не выдаёт никаких ошибок. Программка срабатывает, выпадает обычный чёрный экран и Press any key to continue.

Добавлено через 11 минут и 41 секунду
PS: хм. Вложенные папки тоже переименовал. Причём два раза (папка.htm.htm).

Это сообщение отредактировал(а) Горя - 6.8.2009, 20:06
PM MAIL   Вверх
Mad
Дата 6.8.2009, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 1
Всего: 19



[quote=Горя, 6.8.2009,  19:03, post1937478]Вот получилось: error C2065: '_stprintf_s' : undeclared identifier[/quoe]
для VS < v9.0 убери "_s", при этом будет нормально компилиться и в 9.0 но с warning :
Цитата

warning C4996: '_swprintf': This function or variable may be unsafe. Consider using _swprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details



--------------------
user posted image
PM MAIL   Вверх
Gordon
Дата 6.8.2009, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Цитата(Горя @  6.8.2009,  21:03 Найти цитируемый пост)
Gordon, во, оказывается, чтобы ваша программа у меня работала, нужен tchar.h.

Там было два варианта, для VS 2008 (т.е. 9 версии) и для VC++ 6.0... 

Цитата(Горя @  6.8.2009,  21:03 Найти цитируемый пост)
PS: хм. Вложенные папки тоже переименовал. Причём два раза (папка.htm.htm).

Да, папки переименовывает (плохо, что файлы без расширения)... Но у меня только один раз...  smile 




--------------------

  
     
PM MAIL WWW   Вверх
Горя
Дата 6.8.2009, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Gordon, да ладно, с папок не убудет, плевать.

Mad, ваша вообще никак не работает. Ничего не переименовывает.

Добавлено через 3 минуты и 7 секунд
Gordon, удалил уже переименованные файлы, запустил заново. Папки переименовались снова Оо

Кстати, нашёл, чем они отличаются. Переименованные файлы были с именем viewtopic.php@pid=***, а те, что не переименовываются - viewtopic.php@pid=***.
PM MAIL   Вверх
Mad
Дата 7.8.2009, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 1
Всего: 19



Цитата(Горя @  6.8.2009,  21:21 Найти цитируемый пост)
ваша вообще никак не работает

конечно, ведь реч шла о файлах без расширения, а теперь о
Цитата(Горя @  6.8.2009,  21:21 Найти цитируемый пост)
 с именем viewtopic.php@pid=***

в денном случае расширение этих файлов "php@pid=***" (расширением файла считаеться любой набор символов после последней точки в имени файла).
В вашем конкретном случае надо заменить условие 
Код

            if(!_tcschr(dt.cFileName, '.'))

на более сложное. которое будет проверять имеет файл расширение html или нет (а не имеет расширение вообще. как сейчас)
Код

    TCHAR* t=_tcschr(dt.cFileName, _T('.'));
    if((t!=NULL)&&(_tcsclen(t)==_tcsclen(newExt))&&_tcscmp(t, newExt))

Не стоит забывать, что функции сравнения строк чуствительны к регисту (т.е это условие не позволит переименновать файл с расширением .html, но переиминует .HTML и друоие вариации).


--------------------
user posted image
PM MAIL   Вверх
zim22
Дата 7.8.2009, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



Цитата(Mad @  7.8.2009,  00:19 Найти цитируемый пост)
Не стоит забывать, что функции сравнения строк чуствительны к регисту

перед сравнением строк можно привести их к одному регистру.

Это сообщение отредактировал(а) zim22 - 7.8.2009, 07:49


--------------------
PM MAIL   Вверх
Gordon
Дата 8.8.2009, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Цитата(Горя @  6.8.2009,  23:21 Найти цитируемый пост)
Кстати, нашёл, чем они отличаются. Переименованные файлы были с именем viewtopic.php@pid=***, а те, что не переименовываются - viewtopic.php@pid=***


что-то я разницу не усмотрел...  smile  может просто усталость мешает.

Добавлено через 4 минуты и 19 секунд
Горя, а в каталоге только файлы без расширения, или еще какие есть?


--------------------

  
     
PM MAIL WWW   Вверх
Горя
Дата 8.8.2009, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Цитата(Gordon @  8.8.2009,  15:45 Найти цитируемый пост)
что-то я разницу не усмотрел... может просто усталость мешает.

Э... Что-то я ошибся.

Цитата(Gordon @  8.8.2009,  15:45 Найти цитируемый пост)
а в каталоге только файлы без расширения, или еще какие есть? 

Ну, вот, с расширениями разными, и был один .тхт (самое весёлое, что его переименовало).
PM MAIL   Вверх
Gordon
Дата 9.8.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Цитата(Горя @  8.8.2009,  22:17 Найти цитируемый пост)
Э... Что-то я ошибся.


Ошибся, когда на тут писал, или в наличии различий в именах?


--------------------

  
     
PM MAIL WWW   Вверх
zim22
Дата 12.8.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



Горя, не лучше ли использовать готовое ПО? Какой-нибудь renamer c поддержкой регулярных выражений подойдёт.


--------------------
PM MAIL   Вверх
Dov
Дата 13.8.2009, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Цитата(Mad @  7.8.2009,  00:19 Найти цитируемый пост)
Не стоит забывать, что функции сравнения строк чуствительны к регисту

для этих целей нужно юзать _tcsicmp  и ей подобные.



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Горя
Дата 23.8.2009, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Mad, пофиг на регистр, всё прописью.

Gordon, в наличии разниц в именах.

zim22, некуртуазно  smile 
PM MAIL   Вверх
Gordon
Дата 26.8.2009, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Горя, так ты на чем остановился? 


--------------------

  
     
PM MAIL WWW   Вверх
Горя
Дата 3.9.2009, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Mad, ваша программа не работает в таком виде:
Код

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

void RenameFiles(TCHAR* dir, TCHAR* newExt)
{
    TCHAR tdir[MAX_PATH];
    _stprintf(tdir, _T("%s/*"), dir);

    WIN32_FIND_DATA dt;
    HANDLE hFind = FindFirstFile(tdir, &dt);
    if (hFind != INVALID_HANDLE_VALUE)
    {
        do
        {
            TCHAR* t=_tcschr(dt.cFileName, _T('.'));
            if((t!=NULL)&&(_tcsclen(t)==_tcsclen(newExt))&&_tcscmp(t, newExt))
            {
                TCHAR tname[MAX_PATH];
                TCHAR oname[MAX_PATH];
                _stprintf(tname, _T("%s/%s.%s"), dir, dt.cFileName, newExt);
                _stprintf(oname, _T("%s/%s"), dir, dt.cFileName);
                MoveFile(oname, tname);
            }
        } while (FindNextFile(hFind, &dt));
        FindClose(hFind);
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    RenameFiles(_T("ñ:/dir"), _T("html"));

    getchar();
    return 0;
}

Отличия от исходного кода на прошлой странице:
1) из _stprintf_s убрана вторая _s (методом научного тыка, tprintf и tprintf_s тоже вызывают ошибку). Если заменить _stprintf_s (_stprintf в вышеуказанном коде), то переименовываются только папки.
2) заменён if(!_tcschr(dt.cFileName, '.')) на выложенный вами.

Gordon, ваш код тоже переименовывает только папки.
Код

#include "stdafx.h"
#include <windows.h>
#include <iostream.h>
#include <tchar.h>
#include <string>


bool AddExtention(std::string dir, std::string ext)
{
    WIN32_FIND_DATAA file;    
    HANDLE hFile = FindFirstFileA(std::string(dir).append("\\*.").c_str(), &file);
    if(hFile == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    do
    {
        MoveFileA(std::string(dir).append("\\").append(file.cFileName).c_str(), 
            std::string(dir).append("\\").append(file.cFileName).append(ext).c_str());
    }while(FindNextFileA(hFile, &file));

    FindClose(hFile);

        return true;

        if(!MoveFileA(std::string(dir).append("\\").append(file.cFileName).c_str(), 
    std::string(dir).append("\\").append(file.cFileName).append(ext).c_str()))
{
    cout << "Error code: " << GetLastError() 
        << "\tFile name: " << file.cFileName << endl;            
}


}


int _tmain(int argc, _TCHAR* argv[])
{    
    AddExtention("c:\\dir", ".htm");

    
    return 0;
}

PM MAIL   Вверх
Gordon
Дата 4.9.2009, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Горя, если у тебя все файлы, которые нужно переименовать, заканчиваются на "*.php@pid=****", тогда можно так написать:

Код

bool AddExtention(std::string dir, std::string ext)
{
    WIN32_FIND_DATAA file;    
    HANDLE hFile = FindFirstFileA(std::string(dir).append("\\*.php@pid=*").c_str(), &file);
    if(hFile == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    do
    {                
        MoveFileA(std::string(dir).append("\\").append(file.cFileName).c_str(), 
            std::string(dir).append("\\").append(file.cFileName).append(ext).c_str());
    }while(FindNextFileA(hFile, &file));

    FindClose(hFile);
    
    MoveFileA(std::string(dir).append("\\").append(file.cFileName).c_str(), 
            std::string(dir).append("\\").append(file.cFileName).append(ext).c_str());
        
    return true;
}



p.s. ты еще не совсем правильно код написал, после "return true;" ничего выполняться не будет...

Это сообщение отредактировал(а) Gordon - 4.9.2009, 18:51


--------------------

  
     
PM MAIL WWW   Вверх
Горя
Дата 6.9.2009, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Всё заработало, огромное мерси всем участникам.
PM MAIL   Вверх
Gordon
Дата 9.9.2009, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: нет
Всего: 6



Цитата(Горя @  6.9.2009,  20:31 Найти цитируемый пост)
Всё заработало


Так на чем остановлися? Где проблема была?


--------------------

  
     
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1863 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.