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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [С++] Поиск в имени файлов, Нужна автозамена 
:(
    Опции темы
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.1711 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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