Задачка переименования файлов

Mar 08, 2010 13:17

При помощи Google Book Downloader скачал я недавно журнал про войну с Японией.


Когда начал смотреть, оказалось, что пакетная скачка некорректно поименовала файлы. Поэтому возникла задача: из последовательности имен файлов (отсортированных по времени содания)
файл1,файл4,файл2,файл3
получить такую:
файл1,файл2,файл3,файл4

"Попрактиковаться в Qt было бы полезно" - подумал я.
В процессе написания кода, осознал пару неприятных моментов:
  1. Классы в С++ - УГ по сравнению с классами в Python/Ruby, приходится много лишнего писать.
  2. В Qt есть свой собственный алгоритм сортировки! Ибо Qt дублирует всё, что есть в STL для лучшей кроссплатформенности.
В заключение - сорцы:

main.cpp:

#include "BoriskrRenamer.h"
#include

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    BoriskrRenamer renamer(argv[1]);
    if (argc<2)     {
        renamer.message(QString("Parameter not found."));
        return 1;
    }
    renamer.run();
    return 0;
}

BoriskrRenamer.h:

#pragma once
#include

#include
#include
#include
#include
#include

class MyFileInfo:public QFileInfo
{
public:
    bool operator <(const MyFileInfo&other) const
    {
        return (created()    }
    MyFileInfo(const QFileInfo&other): QFileInfo(other)
    {
    }
};

class MyFileInfoList: public QList
{
public:
    MyFileInfoList(const QFileInfoList&otherList)
    {
        foreach(QFileInfo entry, otherList)
        {
            append(MyFileInfo(entry));
        }
    }
};

class BoriskrRenamer
{
public:
    BoriskrRenamer(const QString &dir);

void run();

void message( QString &text )    {
        qWarning(text.toLocal8Bit());
    }

private:

QString directory;
void rename( MyFileInfoList lstFiles, QDir &dir );
void showList( MyFileInfoList lstFiles, QDir &dir );
};

BoriskrRenamer.cpp:

#include "BoriskrRenamer.h"
#include
#include
#include
#include
#include
#include

BoriskrRenamer::BoriskrRenamer(const QString &directoryName):
    directory(directoryName)
{
}

void BoriskrRenamer::run()
{
    qWarning(directory.toLocal8Bit());
    QDir dir(directory);
    MyFileInfoList lstFiles=dir.entryInfoList(QDir::Files);

showList(lstFiles, dir);
    qSort(lstFiles);
    message(QString("after renaming:"));
    showList(lstFiles, dir);

rename(lstFiles, dir);

}

void BoriskrRenamer::showList( MyFileInfoList lstFiles, QDir &dir )
{
    foreach (QFileInfo entry, lstFiles)
    {
        QString entryAbsPath = dir.absolutePath() + "/" + entry.fileName();
        message(entryAbsPath);
    }
}

void BoriskrRenamer::rename( MyFileInfoList lstFiles, QDir &dir )
{
    int counter=0;
    foreach (QFileInfo entry, lstFiles)
    {
        counter++;
        QString name = dir.absolutePath() + "/" + entry.fileName();
        QString newName = dir.absolutePath() +
            QString("/%1_").arg(counter,3,10,QChar('0'))+
            entry.fileName();
        QString cmd="mv \""+name+"\" \""+newName+"\"";
        message(cmd);
        system(cmd.toLocal8Bit());
    }
}

быдлокод, qt

Previous post Next post
Up