Qt5文件及磁盘处理
来源:互联网 发布:淘宝四钻买家花多少钱 编辑:程序博客网 时间:2024/05/18 03:37
9.1.1 读写文本文件
Qt提供了QFile类用于进行文件操作。QFile类提供了读写文件的接口,可以读写文本文件,二进制文件和Qt的资源文件。
处理文本文件和二进制文件,可以使用QTextStream类和QDataStream类。处理临时文件可以使用QTemporaryFile,获取文件信息可以使用QFileInfo,处理目录可以使用
QDir,监视文件和目录变化可以使用QFileSystemWatcher。
#include <QCoreApplication>
#include <QFile>
#include <QtDebug>
/*
* 打开一个文件有两种方式。一种方式是在构造函数中指文件名;另一种方式是使用setFileName()函数设置文件名。
*
* 打开文件使用open()函数,关闭文件使用close()函数。此处的open()函数以只读方式打开文件,只读方式参数为
* QIODevice::ReadOnly,只写方式参数为QIODevice::WriteOnly,读写参数为QIODevice::ReadWrite。
*
* qint64 lineLen = file.readLine(buffer, sizeof(buffer)):在QFile中可以使用从QIODevice中继
* 承的readLine()函数读取文件中的一行。
*
* if(LineLen != -1){qDebug() << buffer}:如果读取成功,则readLine()函数返回实际读取的字节数;如果
* 读取失败,则返回“-1”
*
*/
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("textFile1.txt");
if(file.open (QIODevice::ReadOnly))
{
char buffer[1024];
qint64 LineLen = file.readLine (buffer, sizeof(buffer));
if(LineLen != -1)
{
qDebug() << buffer;
}
}
file.close ();
return a.exec();
}
9.1.2 QTextStream类读写文本
QTextStream提供了更为方便的接口来读写文本,它可以操作QIODevice、QByteArray和QString。使用QTextStream的流操作符,可以方便地读写单词、行和数字。
为了产生文本,QTextStream还提供了填充、对齐和数字格式化的选项。
#include <QCoreApplication>
#include <QFile>
#include <QTextStream>
/*
* 将内容写入到文件中
*
* if(data.open(QFile::WriteOnly | QFile::Truncate))表示将原来文件中的内容清空。输出时将格式设为左对齐,占10个
* 字符位置。
*
* out << QObject::tr ("score:") << qSetFileWidth(10) << left << 90 <<endl:用户使用格式化函数和流操作符设
* 置需要的输出格式。其中,qSetFieldWidth ()函数是设置字宽度的格式化函数。除此之外,QTextStream还提供了其他一些格式
* 化函数
*/
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile data("data.txt");
if(data.open(QFile::WriteOnly|QFile::Truncate))
{
QTextStream out(&data);
out<<QObject::tr("score:")<<qSetFieldWidth(10)<<left<<90<<endl;
}
return a.exec();
}
QTextStream的格式化函数
qSetFieldWidth(int width)
设置字段宽度
qSetPadChar(Qchar ch)
设置填充字符
qSetRealNumberPercision(int precision)
设置实数精度QTextStream的流操作符
设置读写的整数为 二进制数
oct设置读写的整数为 八进制数
dec
设置读写的整数为十进制数hex设置读写的整数为十六进制数
showbase
强制显示进制前缀,如十六进制(0x)、八进制(0)、二进制(0b)forcesign强制显示符号(+、-)
forcepoint
强制显示小数点
noshowbase强制不显示前缀noforcesign强制不显示符号uppercasebase
显示大写的进制前缀
lowercasebase
显示小些的进制前缀
uppercasebase用大写字母表示lowercasebase用小些字母表示fixed固定小数点表示scientific科学计数法表示left左对齐right右对齐center居中endl换行flush清除缓冲9.2 读写二进制文件
QDateStream类提供了将二进制文件串行化的功能,用于实现C++基本类数据类型,如char,short,int,char*等的串行化。更复杂的串行化操作则是通过将数据分解为
基本类型完成的。
运行效果:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
void filefun();
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include <QFile>
#include <QtDebug>
#include <QDataStream>
#include <QDate>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
filefun ();
}
MainWindow::~MainWindow()
{
}
void MainWindow::filefun ()
{
/*将二进制数据写到数据流*/
QFile file("binary.dat");
file.open (QFile::WriteOnly | QFile::Truncate);
QDataStream out(&file); //将数据序列化
out << QString(tr("张卫东:")); //将字符串序列化
out << QDate::fromString ("1990/04/01", "yyyy/MM/dd"); //讲整数序列化
out << (qint32)25;
file.close ();
/*从文件中读取数据*/
file.setFileName ("binary.dat");
if(!file.open (QFile::ReadOnly))
{
qDebug() << "error" << endl;
return;
}
QDataStream in(&file);
QString name;
QDate birthday;
qint32 age;
in >> name >> birthday >> age; //将获取字符串和整数
qDebug() << name << birthday << age;
file.close ();
}
9.3 目录操作与文件系统
QDir类具有存取目录结构和内容的能力,使用它可以操作目录,存取目录或文件信息、操作底层文件系统,而且还可以存取Qt的资源文件。
Qt使用“/”作为通用的目录分割符合URL路径分隔符。如果在程序中使用“/”作为目录分隔符,Qt会将其自动转换为符合底层操作系统的分隔符(如Linux使用“/”,Windows
使用“\”)。
QDir可以使用相对路径或绝对路径指向一个文件。isRelative()和isAbsolute()函数可以判断QDir对象使用的是相对路径还是绝对路径。如果需要讲一个相对路径转换为绝
对路径,则使用makeAbsolute()函数。
目录的路径可以通过path()函数返回,通过setPath()函数设置新路径。绝对路径使用absolutePath()返回,目录名可以使用dirName()获得,它通常返回绝对路径中的最后
一个元素,如果QDir指向当前目录,则返回“.”。目录的路径可以通过cd()和cdUp()改变。可以使用mkdir()创建目录,rename()改变目录名。
判断目录是否存在可以使用exists(),目录的属性可以使用isReadable()、isAbsolute()、isRelative()和isRoot()来获取。目录下的很多条目,包括文件、目录和符号链接,
总的条目数可以使用count()来统计。entryList()返回目录下所有条目组成的字符串链表。文件可以使用remove()函数删除,删除目录用rmdir()。
9.3.1 文件大小及路径获取实例
#include <QCoreApplication>
#include <QStringList>
#include <QDir>
#include <QDebug>
qint64 du(const QString &path)
{
QDir dir(path);
qint64 size = 0;
foreach(QFileInfo fileinfo, dir.entryInfoList (QDir::Files))
{
size += fileinfo.size ();
}
/*返回目录下所有条目组成的字符串链表*/
foreach(QString subdir, dir.entryList (QDir::Dirs | QDir::NoDotAndDotDot))
{
size += du(path + QDir::separator () + subdir);
}
char unit = 'B';
qint64 cursize = size;
if(cursize > 1024)
{
cursize /= 1024;
unit = 'K';
if(cursize > 1024)
{
cursize /= 1024;
unit = 'M';
if(cursize > 1024)
{
cursize /= 1024;
unit = 'G';
}
}
}
qDebug() << cursize << unit << "\t" << qPrintable(path) << endl;
return size;
}
/*
* arguments()返回命令行参数
*/
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QStringList args = a.arguments ();
QString path;
if(args.count () > 1)
{
path = args[1];
}
else
{
path = QDir::currentPath ();
}
qDebug() << path << endl;
du(path);
return a.exec ();
}
9.3.2 文件系统浏览实例
文件系统的浏览是目录操作的一个常用功能。这里通过实现一个能够显示所有文件的文件系统的浏览功能,介绍如何使用QDir类显示文件系统目录及用过滤方式显示
文件列表的方法。
QDir的entryInfoList()方法是按照某种过滤方式获得目录下的文件列表。
QFileInfoList QDir::entryInfoList
(
const QStringList &nameFilters, //此参数指定了文件名的过滤方式,如“*”,“.tar.gz”
Filters filters = NoFilters, //此参数指定了文件属性的过滤方式,如目录、文件、读写属性等
SortFlags sort = NoSort //此参数指定了列表的排序情况
) const
QDir::Filter定义的过滤方式
只列出文件
QDir::Drives
列出磁盘驱动器(UNIX系统无效)QDir::NoSymLinks
不列出符号链接(对不支持符号链接的操作系统无效)
QDir::NoDotAndDotDot
不列出“.”和“..”
QDir::AllEntries
列出目录、文件和磁盘驱动器。相当于Dirs|Files|Drives
QDir::Readable
列出所有具有“读”属性的文件和目录
QDir::Writable
列出所有具有“写”属性的文件和目录
QDir::Executable列出所有具有“执行”属性的文件和目录QDir::Modified
只列出被修改过的文件(UNIX系统生效)QDir:::Hidden列出隐藏文件(在UNIX系统下,隐藏文件的文件名以“.”开始)QDir::System
列出系统文件(在UNIX系统下只FIFO、套接字和设备文件)
QDir::CaseSensitive
文件系统如果区分文件名大小写,则按大小写方式进行过滤QDir::SortFlag定义了一系列排序方式
QDir::Time
按时间排序(修改时间)
QDir::Size按文件大小排序QDir::Type按文件类型排序QDir::Unsorted不排序QDir::DirsFirst目录优先排序
QDir::DirsLast
目录最后排序QDir::Reversed反序QDir::IgnoreCase忽略大小写方式排序QDir::LocaleAware使用当前本地排序方式进行排序fileview.h
#ifndef FILEVIEW
#define FILEVIEW
#include <QDialog>
#include <QLineEdit>
#include <QDir>
#include <QLineEdit>
#include <QListWidget>
#include <QListWidgetItem>
#include <QFileInfoList>
#include <QVBoxLayout>
class FileView : public QDialog
{
Q_OBJECT
public:
FileView(QWidget *parent = 0, Qt::WindowFlags f = 0);
~FileView();
void showFileInfoList(QFileInfoList list);
public slots:
void slotShow(QDir dir);
void slotDirShow(QListWidgetItem *item);
private:
QLineEdit *fileLineEdit;
QListWidget *fileListWidget;
QVBoxLayout *mainLayout;
};
#endif // FILEVIEW
fileview.cpp
#include "fileview.h"
#include <QStringList>
#include <QIcon>
FileView::FileView(QWidget *parent,Qt::WindowFlags f)
: QDialog(parent,f)
{
setWindowTitle (tr("File View"));
fileLineEdit = new QLineEdit(tr("/"));
fileListWidget = new QListWidget;
mainLayout = new QVBoxLayout(this);
mainLayout->addWidget (fileLineEdit);
mainLayout->addWidget (fileListWidget);
connect (fileLineEdit, SIGNAL(returnPressed()), this, SLOT(slotShow(QDir)));
connect (fileListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(slotDirShow(QListWidgetItem*)));
QString root = "/";
QDir rootDir(root);
QStringList string;
string << "*";
QFileInfoList list = rootDir.entryInfoList (string);
showFileInfoList(list);
}
FileView::~FileView ()
{
}
/*
* 显示dir下的所有文件
*/
void FileView::slotShow (QDir dir)
{
QStringList string;
string << "*";
QFileInfoList list = dir.entryInfoList (string, QDir::AllEntries, QDir::DirsFirst);
showFileInfoList (list);
}
/*
* 根据用户的选择显示下一级目录的所有文件
*/
void FileView::slotDirShow (QListWidgetItem *item)
{
QString str = item->text (); //将下一级的目录保存在str中
QDir dir; //定义一个QDir对象
dir.setPath (fileLineEdit->text ()); //设置QDir对象的路径为当前目录路径
dir.cd (str); //根据下一级目录名重新设置QDir对象的路径
fileLineEdit->setText (dir.absolutePath ());//刷新显示当前的目录路径
slotShow(dir); //显示当前目录下的所有文件
}
/*
* 用户可以双击浏览器中显示的目录进入下一级目录,或单击".."返回上一级目录,
* 顶部的编辑框显示当前所在的目录路径,列表中显示当前该目录下的所有文件
*
* for(unsigned int i = 0; i < list.count (); i++){...}:一次从QFilInfoList对象中取出所有项
* 按目录和文件两种方式加入列表控件中。
*/
void FileView::showFileInfoList (QFileInfoList list)
{
fileListWidget->clear (); //清空列表控件
for(unsigned int i = 0; i < list.count (); i++)
{
QFileInfo temFileInfo = list.at (i);
if(temFileInfo.isDir ())
{
QIcon icon("dir.png");
QString filename = temFileInfo.fileName ();
QListWidgetItem *temp = new QListWidgetItem(icon, filename);
fileListWidget->addItem (temp);
}
else if(temFileInfo.isFile ())
{
QIcon icon("file.png");
QString filename = temFileInfo.fileName ();
QListWidgetItem *temp = new QListWidgetItem(icon, filename);
fileListWidget->addItem (temp);
}
}
}
9.4 获取文件信息
QFileinfo类提供了对文本进行操作时获得的文件相关属性、包括文件名、文件大小、创建时间最后修改时间、最后访问时间及一些文件是否为目录、文件或符号链接
和读写属性等。
fileinfo.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit>
#include <QCheckBox>
class FileInfo : public QDialog
{
Q_OBJECT
public:
FileInfo(QWidget *parent = 0);
~FileInfo();
public slots:
void slotFile();
void slotGet();
private:
QLabel *fileNameLabel;
QLineEdit *fileNameLineEdit;
QPushButton *fileBtn;
QLabel *sizeLabel;
QLineEdit *sizeLineEdit;
QLabel *createTimeLabel;
QLineEdit *createTimeLineEdit;
QLabel *lastModfiledLabel;
QLineEdit *lastModFiledLineEdit;
QLabel *lastReadLabel;
QLineEdit *lastReadLineEdit;
QLabel *propertyLabel;
QCheckBox *isDirCheckBox;
QCheckBox *isFileCheckBox;
QCheckBox *isSymLinkCheckBox;
QCheckBox *isHiddenCheckBox;
QCheckBox *isReadableCheckBox;
QCheckBox *isWriteableCheckBox;
QCheckBox *isExecutableCheckBox;
QPushButton *getBtn;
};
#endif // DIALOG_H
fileinfo.cpp
#include "fileinfo.h"
#include <QGridLayout>
#include <QFileDialog>
#include <QDateTime>
FileInfo::FileInfo(QWidget *parent)
: QDialog(parent)
{
fileNameLabel = new QLabel(tr("文件名:"));
fileNameLineEdit = new QLineEdit;
fileBtn = new QPushButton(tr("文件"));
sizeLabel = new QLabel(tr("大小:"));
sizeLineEdit = new QLineEdit;
createTimeLabel = new QLabel(tr("创建时间:"));
createTimeLineEdit = new QLineEdit;
lastModfiledLabel = new QLabel(tr("最后修改时间:"));
lastModFiledLineEdit = new QLineEdit;
lastReadLabel = new QLabel(tr("最后访问时间"));
lastReadLineEdit = new QLineEdit;
propertyLabel = new QLabel(tr("属性:"));
isDirCheckBox = new QCheckBox(tr("目录"));
isFileCheckBox = new QCheckBox(tr("文件"));
isSymLinkCheckBox = new QCheckBox(tr("符号链接"));
isHiddenCheckBox = new QCheckBox(tr("隐藏"));
isReadableCheckBox = new QCheckBox(tr("读"));
isWriteableCheckBox = new QCheckBox(tr("写"));
isExecutableCheckBox = new QCheckBox(tr("执行"));
getBtn = new QPushButton(tr("获取文件信息"));
QGridLayout *gridLayout = new QGridLayout;
gridLayout->addWidget (fileNameLabel, 0, 0);
gridLayout->addWidget (fileNameLineEdit, 0, 1);
gridLayout->addWidget (fileBtn, 0, 2);
gridLayout->addWidget (sizeLabel, 1, 0);
gridLayout->addWidget (sizeLineEdit, 1, 1);
gridLayout->addWidget (createTimeLabel, 2, 0);
gridLayout->addWidget (createTimeLineEdit, 2, 1);
gridLayout->addWidget (lastModfiledLabel, 3, 0);
gridLayout->addWidget (lastModFiledLineEdit, 3, 1);
gridLayout->addWidget (lastReadLabel, 4, 0);
gridLayout->addWidget (lastReadLineEdit, 4, 1);
QHBoxLayout *layout1 = new QHBoxLayout;
layout1->addWidget (propertyLabel);
QHBoxLayout *layout2 = new QHBoxLayout;
layout2->addWidget (isDirCheckBox);
layout2->addWidget (isFileCheckBox);
layout2->addWidget (isSymLinkCheckBox);
layout2->addWidget (isHiddenCheckBox);
layout2->addWidget (isReadableCheckBox);
layout2->addWidget (isWriteableCheckBox);
layout2->addWidget (isExecutableCheckBox);
QHBoxLayout *layout3 = new QHBoxLayout;
layout3->addWidget (getBtn);
QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->addLayout (gridLayout);
mainLayout->addLayout (layout1);
mainLayout->addLayout (layout2);
mainLayout->addLayout (layout3);
connect (fileBtn, SIGNAL(clicked(bool)), this, SLOT(slotFile()));
connect (getBtn, SIGNAL(clicked(bool)), this, SLOT(slotGet()));
}
FileInfo::~FileInfo()
{
}
void FileInfo::slotFile ()
{
QString fileName = QFileDialog::getOpenFileName (this, "打开", ",", "files(*)");
fileNameLineEdit->setText (fileName);
}
void FileInfo::slotGet ()
{
QString file = fileNameLineEdit->text ();
QFileInfo info(file);
qint64 size = info.size ();
QDateTime created = info.created ();
QDateTime lastModfiled = info.lastModified ();
QDateTime lastRead = info.lastRead ();
bool isDir = info.isDir ();
bool isFile = info.isFile ();
bool isSymLink = info.isSymLink ();
bool isHidden = info.isHidden ();
bool isReadable = info.isReadable ();
bool isWriteable = info.isWritable ();
bool isExecutable = info.isExecutable ();
sizeLineEdit->setText (QString::number (size));
createTimeLineEdit->setText (created.toString());
lastModFiledLineEdit->setText (lastModfiled.toString());
lastReadLineEdit->setText (lastRead.toString());
isDirCheckBox->setCheckState (isDir ? Qt::Checked : Qt::Unchecked);
isFileCheckBox->setCheckState(isFile ? Qt::Checked : Qt::Unchecked);
isSymLinkCheckBox->setCheckState(isSymLink ? Qt::Checked : Qt::Unchecked);
isHiddenCheckBox->setCheckState(isHidden ? Qt::Checked : Qt::Unchecked);
isReadableCheckBox->setCheckState(isReadable ? Qt::Checked : Qt::Unchecked);
isWriteableCheckBox->setCheckState(isWriteable ? Qt::Checked: Qt::Unchecked);
isExecutableCheckBox->setCheckState(isExecutable ? Qt::Checked : Qt::Unchecked);
}
0 0
- Qt5文件及磁盘处理
- 文件及磁盘处理
- Qt5开发学习之文件及磁盘操作(十一)
- Qt5事件处理及实例
- QT5(7)文件处理
- 磁盘及文件管理系统
- 【Qt5开发及实例】22、文件浏览器
- ReactOS-Freeldr磁盘及文件管理
- ReactOS-Freeldr磁盘及文件管理2
- QT5文件
- Qt5处理绝对路径中含中文的文件方法
- 磁盘处理
- Qt5笔记之Qt5插件的生成与加载及json文件的读取
- 【Qt5开发及实例】27、获得文件的信息
- qt5播放mp3文件遇到问题及解决方法
- 磁盘文件读入数组,处理后输入磁盘文件和屏幕
- 《python》学习笔记(Day2),读入磁盘文件,经过处理,保存成相应的磁盘文件
- 文件及文件处理小结
- bootloader开发中遇到的编译顺序不同竟然运行得到不同的结果
- android 系统中frameworks/base添加的string可以被其他应用使用方法
- release' is unavailable: not available in automatic reference counting modeAutomatic
- UITableViewEdit
- 华为OJ-字符统计
- Qt5文件及磁盘处理
- Android UI之代码动态设置ImageView的宽度和高度
- bootloader·开发总结
- zabbix sender
- 输油管道问题
- Spring的核心技术(一)
- (二)分析与设计
- Android 屏幕适配方案
- Cocos2d-x v3.9发布