一.文件/文件夹
1.1 检查存在(创建/删除)
//检查文件存在
if(QFile::exists(outputPath))
{
QFile file(outputPath);
file.remove();//存在则删除
}
//检查文件夹存在
QDir dir(m_sPathIn);
if(!dir.exists()) dir.mkdir(m_sPathOut);//不存在则创建
1.2 QFileDialog选择文件/文件夹
A.设置默认路径(从配置文件获取)
QSettings setting("./Setting.ini", QSettings::IniFormat);//QSettings能记录一些程序中的信息,下次再打开时可以读取出来
QString lastPath = setting.value("Process/Src").toString();//获取上次的打开路径
QFileDialog fileDialog(this);
fileDialog.setWindowTitle(QString("请选择图像文件"));//设置窗口的标题
fileDialog.setNameFilter("图像文件(*.png *.jpg *.tif)"); //设置一个过滤器
fileDialog.setDirectory(lastPath);
B.选择文件
if (fileDialog.exec() == QDialog::Accepted) {//弹出对话框
QStringList strPathList = fileDialog.selectedFiles();
if (strPathList.size() > 0) {
QString sPath = strPathList.at(0);
//ui->lineEdit_Src->setText(sPath);
//setting.setValue("Process/Src", sPath);
}
}
C.选择文件夹
QString sPath = QFileDialog::getExistingDirectory(this, QString("选择文件夹"), sPath);//"/" 第三参数可为上次路径
//ui->lineEdit_Reg->setText(sPath);
1.3 打开文件夹
QDesktopServices::openUrl(QUrl::fromLocalFile(sPath));
1.4 文件重命名
f.rename(str_dir + "/" + str);
1.5 遍历文件夹QDir(文件过滤)
//示例一 获取文件夹下的文件名
foreach(QString fileName,dir.entryList(QDir::Files))
//示例二 获取两级文件夹下的文件夹/文件
QFileInfoList infoList = dir.entryInfoList(dir.filter() | QDir::NoDotAndDotDot);//过滤器值按位或运算符组合
foreach(QFileInfo fileInfo, infoList) {
if (fileInfo.isDir())
{
dir.setPath(fileInfo.filePath());//若是文件则为上级目录+“/..”
dir.setNameFilters(QStringList() << "*.tif" << "*.jpg" << "*.png");//filter 文件过滤
//dir.setSorting(QDir::DirsFirst);// 优先显示目录
QFileInfoList infoList2 = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Dirs);//筛选文件夹
QFileInfoList infoList2 = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Files);//筛选文件
}
dir.cd("tool");//QDir切换到下级tool目录
dir.cdUp();//QDir切换到上级目录
}
dir.entryInfoList(dir.filter() | QDir::NoDotAndDotDot | QDir::Files);//两个|不能过滤掉文件(测试无效)
1.6 QFileInfo
filePath() //可能为“/.”和“/…”。
二.txt
2.1 读取
QString sPathTxt = sPath+QString("/FrameInfo.txt");
QFile fileTxt(sPathTxt);
//方式一 有txt文件
if(fileTxt.open(QIODevice::ReadOnly | QIODevice::Text))
{
QTextStream txtInput(&fileTxt);//D:/Code/QListView/debug/COM_3/模板/鼠脑.txt
QString lineStr;
bool bHaveValue = false;
while(!txtInput.atEnd())
{
lineStr = txtInput.readLine();
QStringList sList=lineStr.split(' ');//按空格分隔 10 42 50 46 51
}
fileTxt.close();
}
2.2 写入(追加/覆盖)
m_mutex.lock();
file.open(QIODevice::WriteOnly);//不存在则创建,默认覆盖 | QIODevice::Append
//file.open(QIODevice::WriteOnly | QIODevice::Append);//文末追加,不存在则创建
QTextStream text_stream(&file);
text_stream<< str3 << '\t' << sText << endl;//换行亦可<<"\r\n"
file.flush();
file.close();
m_mutex.unlock();
三.过滤,排序
3.1 过滤,排序
QFileInfoList infoList = dir.entryInfoList(dir.filter()|QDir::NoDotAndDotDot);//过滤(./..) 按位或运算
QFileInfoList infoList = dir.entryInfoList(dir.filter()|QDir::NoDotAndDotDot,QDir::Time);//测试无效
//dir.setSorting(QDir::DirsFirst);// 优先显示目录
QFileInfoList infoList2 = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Dirs);//筛选文件夹
QFileInfoList infoList2 = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Files);//筛选文件
四.其它
4.1 获取exe所在路径
main.cpp中头文件全局变量比main函数先初始化,若已运行QApplication app(argc, argv); 则可调用
QString sPath = QApplication::applicationDirPath();
QString sPath2 = QCoreApplication::applicationDirPath();
若未运行,通过新建文件夹的默认路径获取。
QDir *dir = new QDir;
QString path = dir->currentPath();//按新建文件夹默认路径作为当前路径
delete dir;
4.2 foreach遍历QFileInfoList和双层for循环拼接文件名速度比较
循环里不加读取Mat时,双层for循环更快。
循环里加读取Mat时,双层for循环所用时间约为1.5倍。