1. 程式人生 > >Qt5檔案及磁碟處理

Qt5檔案及磁碟處理

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。
*
*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) 設定實數精度
QTextStream的流操作符
操作符 作用描述
bin 設定讀寫的整數為 二進位制數
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
#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::SortFlag定義了一系列排序方式
排序方式 作用描述
QDir::Name 按名稱排序
QDir::Time 按時間排序(修改時間)
QDir::Size 按檔案大小排序
QDir::Type 按檔案型別排序
QDir::Unsorted 不排序
QDir::DirsFirst 目錄優先排序
QDir::DirsLast 目錄最後排序
QDir::Reversed 反序
QDir::IgnoreCase 忽略大小寫方式排序
QDir::LocaleAware 使用當前本地排序方式進行排序
fileview.h
#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);
}