Qt5檔案及磁碟處理
阿新 • • 發佈:2019-01-07
9.1.1 讀寫文字檔案
Qt提供了QFile類用於進行檔案操作。QFile類提供了讀寫檔案的介面,可以讀寫文字檔案,二進位制檔案和Qt的資原始檔。
處理文字檔案和二進位制檔案,可以使用QTextStream類和QDataStream類。處理臨時檔案可以使用QTemporaryFile,獲取檔案資訊可以使用QFileInfo,處理目錄可以使用
QDir,監視檔案和目錄變化可以使用QFileSystemWatcher。
QTextStream的流操作符
9.2 讀寫二進位制檔案
QDateStream類提供了將二進位制檔案序列化的功能,用於實現C++基本類資料型別,如char,short,int,char*等的序列化。更復雜的序列化操作則是通過將資料分解為
基本型別完成的。
執行效果:
mainwindow.h
QDir::SortFlag定義了一系列排序方式
fileview.h
#include<QCoreApplication>
#include<QFile>
#include<QtDebug>
/*
*開啟一個檔案有兩種方式。一種方式是在建構函式中指檔名;另一種方式是使用setFileName()函式設定檔名。
*
*開啟檔案使用open()函式,關閉檔案使用close()函式。此處的open()函式以只讀方式開啟檔案,只讀方式引數為
*QIODevice::ReadOnly,只寫方式引數為QIODevice::WriteOnly,讀寫引數為QIODevice::ReadWrite。
*
*qint64lineLen=file.readLine(buffer,sizeof(buffer)):在QFile中可以使用從QIODevice中繼
*承的readLine()函式讀取檔案中的一行。
*
*if(LineLen!=-1){qDebug()<<buffer}:如果讀取成功,則readLine()函式返回實際讀取的位元組數;如果
*讀取失敗,則返回“-1”
*
*/
intmain(intargc,char*argv[])
{
QCoreApplicationa(argc,argv);
QFilefile("textFile1.txt");
if(file.open(QIODevice::ReadOnly))
{
charbuffer[1024];
qint64LineLen=file.readLine(buffer,sizeof(buffer));
if(LineLen!=-1)
{
qDebug()<<buffer;
}
}
file.close();
returna.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還提供了其他一些格式
*化函式
*/
intmain(intargc,char*argv[])
{
QCoreApplicationa(argc,argv);
QFiledata("data.txt");
if(data.open(QFile::WriteOnly|QFile::Truncate))
{
QTextStreamout(&data);
out<<QObject::tr("score:")<<qSetFieldWidth(10)<<left<<90<<endl;
}
returna.exec();
}QTextStream的格式化函式
函式 | 功能描述 |
qSetFieldWidth(int width) | 設定欄位寬度 |
qSetPadChar(Qchar ch) | 設定填充字元 |
qSetRealNumberPercision(int precision) | 設定實數精度 |
操作符 | 作用描述 |
bin | 設定讀寫的整數為 二進位制數 |
oct | 設定讀寫的整數為 八進位制數 |
dec | 設定讀寫的整數為十進位制數 |
hex | 設定讀寫的整數為十六進位制數 |
showbase | 強制顯示進位制字首,如十六進位制(0x)、八進位制(0)、二進位制(0b) |
forcesign | 強制顯示符號(+、-) |
forcepoint | 強制顯示小數點 |
noshowbase | 強制不顯示字首 |
noforcesign | 強制不顯示符號 |
uppercasebase | 顯示大寫的進位制字首 |
lowercasebase | 顯示小些的進位制字首 |
uppercasebase | 用大寫字母表示 |
lowercasebase | 用小些字母表示 |
fixed | 固定小數點表示 |
scientific | 科學計數法表示 |
left | 左對齊 |
right | 右對齊 |
center | 居中 |
endl | 換行 |
flush | 清除緩衝 |
#ifndefMAINWINDOW_H
#defineMAINWINDOW_H
#include<QMainWindow>
classMainWindow:publicQMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget*parent=0);
~MainWindow();
voidfilefun();
};#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()
{
}
voidMainWindow::filefun()
{
/*將二進位制資料寫到資料流*/
QFilefile("binary.dat");
file.open(QFile::WriteOnly|QFile::Truncate);
QDataStreamout(&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;
}
QDataStreamin(&file);
QStringname;
QDatebirthday;
qint32age;
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>
qint64du(constQString&path)
{
QDirdir(path);
qint64size=0;
foreach(QFileInfofileinfo,dir.entryInfoList(QDir::Files))
{
size+=fileinfo.size();
}
/*返回目錄下所有條目組成的字串連結串列*/
foreach(QStringsubdir,dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot))
{
size+=du(path+QDir::separator()+subdir);
}
charunit='B';
qint64cursize=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;
returnsize;
}
/*
*arguments()返回命令列引數
*/
intmain(intargc,char*argv[])
{
QCoreApplicationa(argc,argv);
QStringListargs=a.arguments();
QStringpath;
if(args.count()>1)
{
path=args[1];
}
else
{
path=QDir::currentPath();
}
qDebug()<<path<<endl;
du(path);
returna.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::Dirs | 按照過濾方式列出所有目錄 |
QDir::AllDirs | 列出所有目錄,不考慮過濾方式 |
QDir::Files | 只列出檔案 |
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::Name | 按名稱排序 |
QDir::Time | 按時間排序(修改時間) |
QDir::Size | 按檔案大小排序 |
QDir::Type | 按檔案型別排序 |
QDir::Unsorted | 不排序 |
QDir::DirsFirst | 目錄優先排序 |
QDir::DirsLast | 目錄最後排序 |
QDir::Reversed | 反序 |
QDir::IgnoreCase | 忽略大小寫方式排序 |
QDir::LocaleAware | 使用當前本地排序方式進行排序 |
#ifndefFILEVIEW
#defineFILEVIEW
#include<QDialog>
#include<QLineEdit>
#include<QDir>
#include<QLineEdit>
#include<QListWidget>
#include<QListWidgetItem>
#include<QFileInfoList>
#include<QVBoxLayout>
classFileView:publicQDialog
{
Q_OBJECT
public:
FileView(QWidget*parent=0,Qt::WindowFlagsf=0);
~FileView();
voidshowFileInfoList(QFileInfoListlist);
publicslots:
voidslotShow(QDirdir);
voidslotDirShow(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::WindowFlagsf)
:QDialog(parent,f)
{
setWindowTitle(tr("FileView"));
fileLineEdit=newQLineEdit(tr("/"));
fileListWidget=newQListWidget;
mainLayout=newQVBoxLayout(this);
mainLayout->addWidget(fileLineEdit);
mainLayout->addWidget(fileListWidget);
connect(fileLineEdit,SIGNAL(returnPressed()),this,SLOT(slotShow(QDir)));
connect(fileListWidget,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,SLOT(slotDirShow(QListWidgetItem*)));
QStringroot="/";
QDirrootDir(root);
QStringListstring;
string<<"*";
QFileInfoListlist=rootDir.entryInfoList(string);
showFileInfoList(list);
}
FileView::~FileView()
{
}
/*
*顯示dir下的所有檔案
*/
voidFileView::slotShow(QDirdir)
{
QStringListstring;
string<<"*";
QFileInfoListlist=dir.entryInfoList(string,QDir::AllEntries,QDir::DirsFirst);
showFileInfoList(list);
}
/*
*根據使用者的選擇顯示下一級目錄的所有檔案
*/
voidFileView::slotDirShow(QListWidgetItem*item)
{
QStringstr=item->text();//將下一級的目錄儲存在str中
QDirdir;//定義一個QDir物件
dir.setPath(fileLineEdit->text());//設定QDir物件的路徑為當前目錄路徑
dir.cd(str);//根據下一級目錄名重新設定QDir物件的路徑
fileLineEdit->setText(dir.absolutePath());//重新整理顯示當前的目錄路徑
slotShow(dir);//顯示當前目錄下的所有檔案
}
/*
*使用者可以雙擊瀏覽器中顯示的目錄進入下一級目錄,或單擊".."返回上一級目錄,
*頂部的編輯框顯示當前所在的目錄路徑,列表中顯示當前該目錄下的所有檔案
*
*for(unsignedinti=0;i<list.count();i++){...}:一次從QFilInfoList物件中取出所有項
*按目錄和檔案兩種方式加入列表控制元件中。
*/
voidFileView::showFileInfoList(QFileInfoListlist)
{
fileListWidget->clear();//清空列表控制元件
for(unsignedinti=0;i<list.count();i++)
{
QFileInfotemFileInfo=list.at(i);
if(temFileInfo.isDir())
{
QIconicon("dir.png");
QStringfilename=temFileInfo.fileName();
QListWidgetItem*temp=newQListWidgetItem(icon,filename);
fileListWidget->addItem(temp);
}
elseif(temFileInfo.isFile())
{
QIconicon("file.png");
QStringfilename=temFileInfo.fileName();
QListWidgetItem*temp=newQListWidgetItem(icon,filename);
fileListWidget->addItem(temp);
}
}
}9.4 獲取檔案資訊 QFileinfo類提供了對文字進行操作時獲得的檔案相關屬性、包括檔名、檔案大小、建立時間最後修改時間、最後訪問時間及一些檔案是否為目錄、檔案或符號連結 和讀寫屬性等。 fileinfo.h
#ifndefDIALOG_H
#defineDIALOG_H
#include<QDialog>
#include<QLabel>
#include<QPushButton>
#include<QLineEdit>
#include<QCheckBox>
classFileInfo:publicQDialog
{
Q_OBJECT
public:
FileInfo(QWidget*parent=0);
~FileInfo();
publicslots:
voidslotFile();
voidslotGet();
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=newQLabel(tr("檔名:"));
fileNameLineEdit=newQLineEdit;
fileBtn=newQPushButton(tr("檔案"));
sizeLabel=newQLabel(tr("大小:"));
sizeLineEdit=newQLineEdit;
createTimeLabel=newQLabel(tr("建立時間:"));
createTimeLineEdit=newQLineEdit;
lastModfiledLabel=newQLabel(tr("最後修改時間:"));
lastModFiledLineEdit=newQLineEdit;
lastReadLabel=newQLabel(tr("最後訪問時間"));
lastReadLineEdit=newQLineEdit;
propertyLabel=newQLabel(tr("屬性:"));
isDirCheckBox=newQCheckBox(tr("目錄"));
isFileCheckBox=newQCheckBox(tr("檔案"));
isSymLinkCheckBox=newQCheckBox(tr("符號連結"));
isHiddenCheckBox=newQCheckBox(tr("隱藏"));
isReadableCheckBox=newQCheckBox(tr("讀"));
isWriteableCheckBox=newQCheckBox(tr("寫"));
isExecutableCheckBox=newQCheckBox(tr("執行"));
getBtn=newQPushButton(tr("獲取檔案資訊"));
QGridLayout*gridLayout=newQGridLayout;
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=newQHBoxLayout;
layout1->addWidget(propertyLabel);
QHBoxLayout*layout2=newQHBoxLayout;
layout2->addWidget(isDirCheckBox);
layout2->addWidget(isFileCheckBox);
layout2->addWidget(isSymLinkCheckBox);
layout2->addWidget(isHiddenCheckBox);
layout2->addWidget(isReadableCheckBox);
layout2->addWidget(isWriteableCheckBox);
layout2->addWidget(isExecutableCheckBox);
QHBoxLayout*layout3=newQHBoxLayout;
layout3->addWidget(getBtn);
QVBoxLayout*mainLayout=newQVBoxLayout(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()
{
}
voidFileInfo::slotFile()
{
QStringfileName=QFileDialog::getOpenFileName(this,"開啟",",","files(*)");
fileNameLineEdit->setText(fileName);
}
voidFileInfo::slotGet()
{
QStringfile=fileNameLineEdit->text();
QFileInfoinfo(file);
qint64size=info.size();
QDateTimecreated=info.created();
QDateTimelastModfiled=info.lastModified();
QDateTimelastRead=info.lastRead();
boolisDir=info.isDir();
boolisFile=info.isFile();
boolisSymLink=info.isSymLink();
boolisHidden=info.isHidden();
boolisReadable=info.isReadable();
boolisWriteable=info.isWritable();
boolisExecutable=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);
}