Qt 为文件和目录操作提供了一些类,利用这些类可以方便地实现一些操作。Qt 提供的与文件和目录操作相关的类主要包括以下几个:
- QCoreApplication:用于提取应用程序路径、程序名等文件信息
- QFile: 除了打开文件操作外,QFile 还有复制文件、删除文件等功能
- QFileInfo:用于提取文件的信息,包括路径、文件名、后缀等。
- QDir: 用于提取目录或文件信息,获取一个目录下的文件或目录列表,创建或删除目录和文件,文件重命名等操作。
- QTemporaryDir和QTemporaryFile:用于创建临时目录和临时文件
- QFileSystemWatcher: 文件和目录监听类,监听目录下文件的添加、删除等变化,监听文件修改变化。
这些类基本涵盖了文件操作需要的主要功能,有些功能还在某些类里重复出现,例如 QFile和 QDir 都具有删除文件、判断文件是否存在的功能。
1.文件操作
文件打开方式:
QIODevice::NotOpen | 未打开 |
QIODevice::ReadOnly | 以只读方式打开 |
QIODevice::WriteOnly | 以只写方式打开 |
QIODevice::ReadWrite | 以读写方式打开 |
QIODevice::Append | 以追加的方式打开,新增加的内容将被追加到文件末尾 |
QIODevice::Truncate | 以重写的方式打开,在写入新的数据时会将游标设置在文件开头 |
QIODevice::Text | 在读取时,将行结束符转换成 \n;在写入时,将行结束符转换成本地格式,例如 Win32 平台上是 \r\n |
QIODevice::Unbuffered | 忽略缓存 |
(1)打开文件并执行读写操作
//以可读可写的方式打开文件
QFile file("1.txt");
if(!file.open(QIODevice::ReadWrite | QIODevice::Text))
{
qDebug()<<"文件打开失败";
return;
}
//读取文件内容
QString str=file.readAll();
qDebug()<<str;
//向文件中写入内容
file.write("123456789");
//关闭文件
file.close();
(2)获取文件的属性信息
//查看文件属性
QFileInfo info(file);
qDebug()<<info.size();//查看文件大小
qDebug()<<info.exists();//判断文件是否存在
qDebug()<<info.isDir();//判断是否为目录
qDebug()<<info.isFile();//判断是否为文件
qDebug()<<info.isReadable();//判断是否可读
qDebug()<<info.isWritable();//判断是否可写
qDebug()<<info.isHidden();//判断隐藏属性
qDebug()<<info.isExecutable();//判断可执行属性
QDateTime create_time=info.created();//查看文件创建的时间
QDateTime lastModified_time=info.lastModified();//查看文件最后修改的时间
QDateTime lastRead_time=info.lastRead();//查看文件最后的访问时间
(3)文件对话框
QString filter="文本文件(*.txt);;程序文件(*.jpg *.gif);;所有文件(*.*)";//文件过滤器
//选择一个文件打开(必须是已经存在的文件)
QString filename=QFileDialog::getOpenFileName(this,"操作提示","./",filter);
qDebug()<<filename;
//选择多个文件打开(必须是已经存在的文件)
QStringList filenames=QFileDialog::getOpenFileNames(this,"操作提示","./",filter);
qDebug()<<filenames.length();
//选择一个文件保存(可以是已经存在的文件,也可以是不存在的文件)
QString save_name=QFileDialog::getSaveFileName(this,"操作提示","./",filter);
qDebug()<<save_name;
//选择一个文件夹打开
QString dir_name=QFileDialog::getExistingDirectory(this,"操作提示","./");
qDebug()<<dir_name;
2.目录操作
qDebug()<<QCoreApplication::applicationDirPath();//获取当前程序所在的目录
qDebug()<<QCoreApplication::applicationFilePath();//获取当前程序的文件路径
qDebug()<<QDir::currentPath();//获取当前工作目录
qDebug()<<QDir::homePath();//获取家目录
qDebug()<<QDir::rootPath();//获取根目录
qDebug()<<QDir::tempPath();//获取临时文件目录(在程序中创建的临时目录和临时文件会放在这个路径下)
qDebug()<<"系统字体目录路径:"<<QStandardPaths::standardLocations(QStandardPaths::FontsLocation);
qDebug()<<"系统桌面目录路径:"<<QStandardPaths::standardLocations(QStandardPaths::DesktopLocation);
qDebug()<<"用户文档目录路径:"<<QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation);
qDebug()<<"用户音乐目录路径:"<<QStandardPaths::standardLocations(QStandardPaths::MusicLocation);
qDebug()<<"用户视频目录路径"<<QStandardPaths::standardLocations(QStandardPaths::MoviesLocation);
qDebug()<<"用户图片目录路径:"<<QStandardPaths::standardLocations(QStandardPaths::PicturesLocation);
qDebug()<<"系统临时文件目录路径:"<<QStandardPaths::standardLocations(QStandardPaths::TempLocation);
qDebug()<<"系统缓存目录路径:"<<QStandardPaths::standardLocations(QStandardPaths::CacheLocation);
qDebug()<<"系统下载目录路径:"<<QStandardPaths::standardLocations(QStandardPaths::DownloadLocation);
qDebug()<<"系统家目录"<<QStandardPaths::standardLocations(QStandardPaths::HomeLocation);
//判断当前目录下是否存在一个目录“1”,如果不存在,则创建
QDir dir;
if(!dir.exists("1"))
{
dir.mkdir("1");
}
//判断./1/1/1/1/这个路径是否存在,如果不存在,则创建
if(!dir.exists("1/1/1/1/"))
{
dir.mkpath("1/1/1/1/");
}
3.临时文件操作
//临时文件的使用(临时文件在函数结束时,或者执行close()之后,就会自动删除)
QTemporaryFile file;
if(!file.open())
{
qDebug()<<"临时文件创建失败";
return;
}
qDebug()<<file.fileName();
file.close();
4.临时目录操作
//临时目录(在函数结束时,或者执行了remove()之后,临时目录会自动删除)
QTemporaryDir dir;
qDebug()<<dir.path();
dir.remove();
5.其他
QDir::Dirs | 列出与筛选器匹配的目录 |
QDir::AllDirs | 列出与筛选器匹配的目录、列出所有目录;即不将过滤器应用于目录名 |
QDir::Files | 列出文件 |
QDir::Drives | 列出磁盘驱动器(在Unix下被忽略) |
QDir::NoSymLinks | 不要列出符号链接(被不支持符号链接的操作系统忽略) |
QDir::NoDotAndDotDot | 不要列出特殊条目“.”和“..” |
QDir::NoDot | 不要列出特殊条目“.” |
QDir::NoDotDot | 不要列出特殊条目“..” |
QDir::AllEntries | 列出目录、文件、驱动器和符号链接(除非指定System,否则不会列出损坏的符号链接) |
QDir::Readable | 列出应用程序具有读取权限的文件。Readable值需要与Dirs或Files组合使用 |
QDir::Writable | 列出应用程序具有写访问权限的文件。“可写入”值需要与“目录”或“文件”组合使用 |
QDir::Executable | 列出应用程序具有执行访问权限的文件。Executable值需要与Dirs或Files组合 |
QDir::Modified | 仅列出已修改的文件(在Unix上被忽略) |
QDir::Hidden | 列出隐藏文件(在Unix上,以“.”开头的文件) |
QDir::System | 列出系统文件(在Unix上,包括FIFO、套接字和设备文件;在Windows上,包括.lnk文件) |
QDir::CaseSensitive | 过滤器应区分大小写 |
(1)遍历目录及其子目录下的文件和文件夹
QDirIterator是一个类,用于遍历目录及其子目录下的文件和文件夹。在下面这个例子中,我们创建了一个QDirIterator对象dir_it,指定了要遍历的目录为curr_path/record,并且设置了遍历的选项为Dirs(只遍历目录)和NoDotAndDotDot(不包括 “.” 和 “”)。同时,通过设置Subdirectories选项为true,可以递归地遍历所有子目录。
QDirIterator dir_it(QString("%1/record").arg(curr_path), QDir::Dirs|QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
(2)遍历目录下的文件和文件夹
QDir dir = QDir(list.first());
dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
dir.setSorting(QDir::Time);
QFileInfoList file_list = dir.entryInfoList();