Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Herr от Май 13, 2010, 22:40



Название: Добавление всех файлов из заданного каталога
Отправлено: Herr от Май 13, 2010, 22:40
Необходимо задавать в файловом диалоге каталог и на выходе получать добавление в программу всех файлов определенного типа из заданного каталога.

Как я понял, QFileDialog::getExistingDirectory возвращает лишь сам адрес каталога, а несколько файлов можно добавить только через QFileDialog::getOpenFileNames и то путем ручного выделения каждого файла.

Можете посоветовать выход из этой ситуации?


Название: Re: Добавление всех файлов из заданного каталога
Отправлено: nixman05 от Май 14, 2010, 00:00
Можно попробовать реализовать через QFileSystemModel http://doc.qt.nokia.com/4.6/qfilesystemmodel.html (http://doc.qt.nokia.com/4.6/qfilesystemmodel.html)

например

Код
C++ (Qt)
QFileSystemModel *fileModel=new QFileSystemModel();
fileModel->setRootPath(path_to_files);
 

затем, для того, чтобы получить имя файла используется fileName ( const QModelIndex & index ) const
(или filePath( const QModelIndex & index)  для получения полного пути)


также можно устанавливать фильтры при помощи setFilter и setNameFilter


Название: Re: Добавление всех файлов из заданного каталога
Отправлено: garryHotDog от Май 14, 2010, 06:07
Кол-во файлов можно получить с помощью QDir:
Цитировать
QStringList   entryList ( const QStringList & nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort ) const
но это получение файлов\директорий в текущей директории, без поддиректорий....более сложный и рекурсивный вариант (вхождение в поддиректории):
Код
C++ (Qt)
//------------------------------------------------------------
// Просканируем директорию(рекурсивно)
//------------------------------------------------------------
void CDirController::ScanDir
(
QFileInfoList &AFileInfoList, // список всех файлов
QString &ADirname            // имя сканируемой директории
)
{
// Если имя директории не пустое
if(!ADirname.isEmpty())
{
// Временная переменная.
QFileInfoList tmpDirList;
// Временная переменная.
QFileInfoList tmpFileList;
// Директория.
QDir dir(ADirname);
// Если директория существует.
if(dir.exists()==true)
{
// получу список файлов.
tmpFileList=dir.entryInfoList(QDir::Files|QDir::Readable,QDir::NoSort);
// если список не пустой.
if(tmpFileList.isEmpty()==false)
{
// Добавим список файлов.
AFileInfoList+=tmpFileList;
}
else{}
// получу список директорий.
tmpDirList=dir.entryInfoList(QDir::Dirs|QDir::NoDotAndDotDot,QDir::NoSort);
// Если есть еще директории.
if(tmpDirList.size()!=0x00)
{
// Пройдем все директории.
for(quint32 icycle=0x00;icycle<tmpDirList.size();icycle++)
{
// Пройдемся по директории.
ScanDir(AFileInfoList,tmpDirList[icycle].filePath());
}
}
else{}
}
else{}
}
else{}
}
 
Использование:
Код
C++ (Qt)
// Список файлов.
QFileInfoList FileInfoList;
QString workDir="c:\\in";
 
// просканируем директорию.
ScanDir(FileInfoList,workDir);
 


Название: Re: Добавление всех файлов из заданного каталога
Отправлено: Kolobok от Май 14, 2010, 11:07
Кол-во файлов можно получить с помощью QDir:

Не только количество, но и названия файлов.

но это получение файлов\директорий в текущей директории, без поддиректорий....более сложный и рекурсивный вариант (вхождение в поддиректории):

Для этого существует QDirIterator


Название: Re: Добавление всех файлов из заданного каталога
Отправлено: garryHotDog от Май 14, 2010, 12:00
Цитировать
Не только количество, но и названия файлов.
для этого есть QFileInfoList !!! это список файлов с доп. инфой (читай в ассисте)



Название: Re: Добавление всех файлов из заданного каталога
Отправлено: Kolobok от Май 14, 2010, 13:46
Ты хочешь сказать, что QStringList entryList() не возвращает список файлов?


Название: Re: Добавление всех файлов из заданного каталога
Отправлено: garryHotDog от Май 14, 2010, 16:39
Цитировать
Ты хочешь сказать, что QStringList entryList() не возвращает список файлов?
с чего ты это решил??? с какой фразы???

в моем примере я просто использую tmpFileList=dir.entryInfoList(QDir::Files|QDir::Readable,QDir::NoSort), получаю список файлов,но элементы списка не просто имена файлов,а QFileInfo!!!


Название: Re: Добавление всех файлов из заданного каталога
Отправлено: Kolobok от Май 14, 2010, 18:37
с чего ты это решил??? с какой фразы???

Цитировать
Не только количество, но и названия файлов.
для этого есть QFileInfoList !!! это список файлов с доп. инфой (читай в ассисте)

В моем понимании, это означает, что метод entryList делает не совсем то, что я написал или метод QFileInfoList эффективнее.


Название: Re: Добавление всех файлов из заданного каталога
Отправлено: garryHotDog от Май 14, 2010, 20:31
Цитировать
В моем понимании, это означает, что метод entryList делает не совсем то, что я написал или метод QFileInfoList эффективнее.

Цитирую для тебя ассист:
Цитировать
QStringList   entryList ( Filters filters = NoFilter, SortFlags sort = NoSort ) const
Цитировать
QFileInfoList   entryInfoList ( Filters filters = NoFilter, SortFlags sort = NoSort ) const

Цитировать
typedef QFileInfoList
Synonym for QList<QFileInfo>.
поясню - entryList вернем тебе просто список имен файлов в директории.
entryInfoList - вернем тебе список элементов QFileInfo, где есть и имя и размер и т.д......

более эффективным будет entryList !!!!


Название: Re: Добавление всех файлов из заданного каталога
Отправлено: Kolobok от Май 14, 2010, 20:39
Ну ик чему был тогда этот комментарий?

Цитировать
Не только количество, но и названия файлов.
для этого есть QFileInfoList !!! это список файлов с доп. инфой (читай в ассисте)




Название: Re: Добавление всех файлов из заданного каталога
Отправлено: garryHotDog от Май 14, 2010, 21:06
МОЖНО ПОЛУЧИТЬ ИМЕНА,КОЛИЧЕСТВО И Т.Д.
я думаю автор топика понял как делать!?


Название: Re: Добавление всех файлов из заданного каталога
Отправлено: Herr от Май 15, 2010, 00:08
Да, спасибо!


Название: Re: Добавление всех файлов из заданного каталога
Отправлено: Kolobok от Май 15, 2010, 00:48
Вот как раз т.д автор топика не просил. И не надо на меня кричать.


Название: Re: Добавление всех файлов из заданного каталога
Отправлено: ритт от Май 15, 2010, 17:06
Цитировать
В моем понимании, это означает, что метод entryList делает не совсем то, что я написал или метод QFileInfoList эффективнее.

Цитирую для тебя ассист:
Цитировать
QStringList   entryList ( Filters filters = NoFilter, SortFlags sort = NoSort ) const
Цитировать
QFileInfoList   entryInfoList ( Filters filters = NoFilter, SortFlags sort = NoSort ) const

Цитировать
typedef QFileInfoList
Synonym for QList<QFileInfo>.
поясню - entryList вернем тебе просто список имен файлов в директории.
entryInfoList - вернем тебе список элементов QFileInfo, где есть и имя и размер и т.д......

более эффективным будет entryList !!!!
более эффективным будет entryInfoList(), но памяти сожрёт чуть больше. entryList() оправдан лишь там, где требуются только имена файлов и в дльнейшем нет необходимости получения по этим именам абсолютного/канонического пути, метаинформации, развязывания ссылок и т.п.


Название: Re: Добавление всех файлов из заданного каталога
Отправлено: Kolobok от Май 15, 2010, 19:26
более эффективным будет entryInfoList(), но памяти сожрёт чуть больше.

У меня по скорости они одинаковы.