При помощи
Google Book Downloader скачал я недавно журнал про
войну с Японией.
Когда начал смотреть, оказалось, что пакетная скачка некорректно поименовала файлы. Поэтому возникла задача: из последовательности имен файлов (отсортированных по времени содания)
файл1,файл4,файл2,файл3
получить такую:
файл1,файл2,файл3,файл4
"Попрактиковаться в Qt было бы полезно" - подумал я.
В процессе написания кода, осознал пару неприятных моментов:
- Классы в С++ - УГ по сравнению с классами в Python/Ruby, приходится много лишнего писать.
- В 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());
}
}