在集合中正确存储QFiles
Properly storing QFiles in a collection
在集合中存储多个QFile的最佳方式是什么?最好使用QList、数组或向量吗?
我想以QFile而不是QFile*的形式访问集合的元素。
我正在尝试读取Qt中的一个目录,并将所有文件存储在一个集合中。然后将所有文件名打印到屏幕上。
我如何阅读目录:
QDirIterator it(p_dir, QStringList() << "*.wav", QDir::Files, QDirIterator::Subdirectories);
while (it.hasNext())
{
// Put file into collection
}
目前我正在使用QList来存储QFiles:
QList<QFile*> list;
我读到,获取文件信息的最佳方式是使用QFileInfo类型。如何将QFileInfo文件设置为列表中的元素?
我想做一些类似的事情:
QFileInfo info;
QListIterator<QFile*> i(list);
while(i.hasNext())
{
info.setFile(i);
}
但以上内容给了我:错误:对"QFileInfo::setFile(QListIterator&)"的调用没有匹配的函数fi.setFile(i);
请记住,QFile
继承了QObject
,因此不可复制或移动。通常的做法是将指向此类对象的指针存储在容器中,而不是存储对象本身。至于使用哪个容器,其实并不重要,但QVector
将是最有效的。
QListIterator
是一个Java风格的迭代器。因此:
QListIterator::QListIterator(const QList<T> & list)
构造一个遍历列表的迭代器。迭代器设置为在列表的前面(在第一项之前)。
迭代器不指向任何东西,如果你想获得实际的对象,请使用i.next()
给你一个QFile*
,然后你必须取消引用,因为setFile()
接受的是QFile &
,而不是QFile *
。
QFile
不可复制。在C++98中,通常没有办法将其存储在容器中,除非容器支持就地构造。我不知道有任何这样的C++98容器,尽管写一个并不那么难。
在C++11中,您可以使用任何不需要复制元素并支持放置的容器,例如std::list
:
// https://github.com/KubaO/stackoverflown/tree/master/questions/qfile-list-36391586
#include <QtCore>
#include <list>
void populate(std::list<QFile> & files) {
QDir dir(QCoreApplication::applicationDirPath());
for (auto fileName : dir.entryList(QDir::Files)) {
qDebug() << "adding file" << fileName;
files.emplace_back(fileName);
}
}
void iterate(std::list<QFile> & files) {
for (auto & file : files)
if (file.open(QIODevice::ReadOnly)) {
qDebug() << "successfully opened" << file.fileName();
}
}
int main(int argc, char ** argv) {
QCoreApplication app(argc, argv);
std::list<QFile> files;
populate(files);
iterate(files);
}
在我的系统上,当从Qt Creator运行时,输出为:
adding file "main.o"
adding file "Makefile"
adding file "qfile-list-36391586"
successfully opened "main.o"
successfully opened "Makefile"
successfully opened "qfile-list-36391586"
由于QFile
是实现系统资源RAII的适当类,在main
返回之前,files::~list
会自动关闭文件。
我目前正在基于某些标准/逻辑操作QFileInfo。。但如果我过滤掉所有复杂的逻辑,它会像一样
QDir testDir("/home/mypath/to/dir");
QFileInfoList files = testDir.entryInfoList(); // #1. here you may use filters as I'm filtering based on a specific file extension
QFileInfoList myfiles;
for(int index = 0; index < files.size(); ++index)
{
const QFileInfo& info = files.at(index);
qDebug() << info.absoluteFilePath() << endl;
// #2. I've some sort of filters I used in #1 above that I compares here by utilizing info here, something like
//if (info.baseName().contains("anyPattern");
myfiles.push_back(info);
}
// Now you can view whatever you stored
for (int vw_idx = 0; vw_idx < myfiles.size(); ++vw_idx)
{
const QFileInfo& info = files.at(index);
qDebug() << info.absoluteFilePath() << endl;
}
- 将字符串存储在c++中的稳定内存中
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 使用QProcess执行命令,并将结果存储在QStringList中
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 存储模板类型以强制转换回派生<T>
- 类型总是使用其大小存储在内存中吗
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 使用无符号字符数组有效存储内存
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 带结构的二维矢量:如何存储元素
- 添加存储在向量中的大整数的函数出现问题
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 在std::vector上存储带有模板的类实例
- 谷歌测试中的期望值存储在哪里
- 为什么C中的通用链表中存储的数据已损坏
- 在c++中获取两个大int,并将它们存储在数组中
- 在集合中正确存储QFiles