文章目錄
- 1.建立QFile對象
- 2.open():指定打開方式
- 3.讀檔案(Read)
- 4.寫檔案(Write)
1.建立QFile對象
我們在建立QFile對象的時候會用到,QFile的構造函數,我們一起來看一下它有什麼構造函數吧。
- QFile::QFile(const QString & name); 原文:Constructs a new file object to represent the file with the given name; 翻譯:構造一個新的file對象來表示具有給定名稱的檔案。
- QFile::QFile(QObject * parent); 原文:Constructs a new file object with the given parent 翻譯:使用給定的父對象構造一個新的file對象。 用途:指定父對象主要用于來自動回收記憶體。
- QFile::QFile(const QString & name, QObject * parent); 原文:Constructs a new file object with the given parent to represent the file with the specified name 翻譯:使用給定的父對象構造一個新的file對象,以表示具有指定名稱的檔案。
2.open():指定打開方式
當建立完QFile對象後呢,我們就要指定它的打開方式。
bool IsOpen = file.open(OpenMode mode);
該open函數是繼承于QIODevice,當然QFile也有重載的兩個open函數,由于目前不太懂不進行解析。 有什麼打開方式呢?QIODevice::OpenMode:
【領QT開發教程學習資料,點選下方連結莬費領取↓↓,先碼住不迷路~】
點選→領取「連結」
打開方式 | 說明 |
QIODevice::NotOpen | 裝置未打開 |
QIODevice::ReadOnly | 裝置已打開供閱讀 |
QIODevice::WriteOnly | 裝置已打開可供寫入。注意,這個模式意味着截斷 |
QIODevice::ReadWrite | 該裝置可供閱讀和書寫 |
QIODevice::Append | 裝置以追加模式打開,以便将所有資料寫入檔案末尾 |
QIODevice::Truncate | 如果可能的話,裝置在打開之前會被截斷。裝置的所有早期内容都已丢失 |
QIODevice::Text | 讀取時,行尾終止符将轉換為’\n’。寫入時,行尾終止符将轉換為本地編碼,例如,對于win32 |
QIODevice::Unbuffered | 裝置中的任何緩沖區都被繞過 |
QFile可以和QTextStream或QDataStream一起使用,當在打開方式時沒有特定指定,那麼預設為QDataStream打開。
由于open方法傳回的是bool值,在這裡可以判斷有沒有打開成功。
3.讀檔案(Read)
當打開方式指定可以讀檔案的時候 從QIODevice繼承下來的讀檔案公有方法:
qint64 read(char * data, qint64 maxSize)
以二進制的方式進行讀取;将裝置中maxSize位元組讀入資料儲存在data中,并傳回讀取的位元組數;當沒有更多資料可供讀取時,傳回0;讀過流的末尾為錯誤,傳回-1 。
QByteArray read(qint64 maxSize)
從裝置中讀取maxSize位元組,并将讀取的資料作為QByteArray(位元組數組)傳回。
QByteArray readAll()
從裝置讀取所有可用資料,并将其作為QByteArray傳回。
qint64 readLine(char * data, qint64 maxSize)
從裝置中讀取一行ASCII字元(最大為maxSize – 1位元組),将字元存儲在data中,并傳回讀取的位元組數。如果一行不能被讀取,但是沒有錯誤發生,這個函數傳回0。如果發生錯誤,将傳回可讀内容的長度,如果未讀,則傳回-1,結束的“\0”位元組總是附加到資料中,是以maxSize必須大于1。
QByteArray readLine(qint64 maxSize = 0)
從裝置中讀取一行,但不超過maxSize字元,并以位元組數組的形式傳回結果。
一些類型轉換
QString 轉 QByteArray :
QString.toUtf8();
QByteArray 轉 QString :
QString(QByteArray);
QByteArray 轉 std::string :
QByteArray.toStdString();
std::string 轉 char * :
string.data();
使用完必須關閉流哦!
QFile對象.close();
讀檔案例子
//建立一個QFileDialog來擷取檔案路徑
QString path = QFileDialog::getOpenFileName(
this,
"OpenFile",
"../",
"TXT file(*.txt)");
//建立一個QFile對象
QFile file(path);
//打開檔案,以隻讀的方式打開檔案
bool isOpen = file.open(QIODevice::ReadOnly|QIODevice::Text);
if(isOpen != false)
{
//QByteArray readAll()
QByteArray fileData;
fileData = file.readAll();
//顯示到textEdit中
ui->textEdit->setText(QString(fileData));
}
else
{
qDebug() << "無法打開檔案";
}
//關閉檔案
file.close();
使用 qint64 read(char * data, qint64 maxSize) 讀取資料
if(isOpen != false)
{
char* buf = new char[50];
qint64 IsRead = file.read(buf,49);
if(IsRead != -1)
{
ui->textEdit->setText(QString(buf));
}
}
使用 QByteArray read(qint64 maxSize) 讀取資料
if(isOpen != false)
{
QByteArray fileData;
fileData = file.read(49);
ui->textEdit->setText(QString(fileData));
}
使用 qint64 readLine(char * data, qint64 maxSize) 讀取資料,readAll()已經用過了哦!
if(isOpen != false)
{
//atEnd() :當到了檔案結尾為true,反則false
while(!file.atEnd())
{
char* buf = new char[50];
qint64 IsRead = file.readLine(buf,30);
if(IsRead != -1)
{
ui->textEdit->append(QString(buf));
}
}
}
使用 QByteArray readLine(qint64 maxSize = 0) 讀取資料
if(isOpen != false)
{
//atEnd() :當到了檔案結尾為true,反則false
while(!file.atEnd())
{
QByteArray fileData;
fileData = file.readLine();
ui->textEdit->append(QString(fileData ));
}
}
4.寫檔案(Write)
從QIODevice繼承下來的寫檔案公有方法:
qint64 write(const char * data, qint64 maxSize)
将data提取maxSize位元組數寫到裝置中(由于字型編碼問題,中文字元為3個位元組)。傳回實際寫入的位元組數,如果發生錯誤則傳回-1。
qint64 write(const char * data)
将以零結尾的8-bit字元串中的資料寫入裝置。傳回實際寫入的位元組數,如果發生錯誤則傳回-1。這等價于 QIODevice::write(data, qstrlen(data));
qint64 write(const QByteArray & byteArray)
将byteArray的内容寫入裝置。傳回實際寫入的位元組數,如果發生錯誤則傳回-1
寫檔案例子
qint64 write(const char * data, qint64 maxSize) 的寫法
//建立一個QFileDialog來擷取儲存檔案路徑
QString path = QFileDialog::getSaveFileName(
this,
"SaveFile",
"../",
"TXT file(*.txt)");
//建立一個QFile對象
QFile file(path);
//exists() :當該檔案存在傳回true,反則false
if(file.exists() == false)
{
qDebug() << "沒有該檔案";
return;
}
//打開檔案,以隻寫的方式打開檔案
bool isOpen = file.open(QIODevice::WriteOnly);
if(isOpen == true)
{
//擷取textEdit内容
QString text = ui->textEdit->toPlainText();
//轉為标準的庫string
std::string str = text.toStdString();
//庫string轉為char*
//const char * ch = str.c_str();
const char * one = str.data();
//英文占一個位元組,中文占3個位元組
qint64 isSaveOK = file.write(one,6);
if(isSaveOK != -1)
{
qDebug() << "儲存成功";
}
}
else
{
qDebug() << "該檔案無法打開";
return;
}
file.close();
}
qint64 write(const char * data) 的寫法
if(isOpen == true)
{
//擷取textEdit内容
QString text = ui->textEdit->toPlainText();
//轉為标準的庫string
std::string str = text.toStdString();
//庫string轉為char*
//const char * ch = str.c_str();
const char * one = str.data();
//英文占一個位元組,中文占3個位元組
qint64 isSaveOK = file.write(one);
if(isSaveOK != -1)
{
qDebug() << "儲存成功";
}
}
else
{
qDebug() << "該檔案無法打開";
return;
}
qint64 write(const QByteArray & byteArray) 的寫法
if(isOpen == true)
{
//擷取textEdit内容
QString text = ui->textEdit->toPlainText();
//轉為QByteArray
QByteArray Bytetxt = text.toUtf8();
//英文占一個位元組,中文占3個位元組
qint64 isSaveOK = file.write(Bytetxt);
if(isSaveOK != -1)
{
qDebug() << "儲存成功";
}
}
else
{
qDebug() << "該檔案無法打開";
return;
}
一、QFile的公有成員函數
QFile除了構造函數外還有一些其它的公有成員函數哦!
copy() :拷貝檔案
bool QFile::copy(const QString & newName)
靜态 bool QFile::copy(const QString & fileName, const QString & newName)
copy函數說明: 1.将目前指定的檔案複制到名為newName的檔案中。 2.如果成功傳回true;否則傳回false。 3.注意,如果一個名為newName的檔案已經存在,copy()傳回false(即QFile不會覆寫它)。 4.源檔案在複制之前關閉 例子:
bool QFile::copy(const QString & newName) 的寫法
//建立一個QFileDialog來擷取檔案路徑
QString path = QFileDialog::getOpenFileName(
this,
"OpenFile",
"../",
"TXT file(*.txt)");
//建立一個QFile對象
QFile file(path);
if(file.exists())
{
//建立一個QFileDialog來擷取儲存檔案路徑
QString SavePath = QFileDialog::getSaveFileName(
this,
"SaveFile",
"../複制的文本",
"TXT(*.txt)");
bool isSaveOK = file.copy(SavePath);
if(isSaveOK)
{
ui->textEdit->setText("檔案複制儲存成功");
}
else
{
ui->textEdit->setText("檔案複制儲存失敗");
}
}
else
{
ui->textEdit->setText("檔案不存在");
return;
}
bool QFile::copy(const QString & fileName, const QString & newName) 的寫法
【領QT開發教程學習資料,點選下方連結莬費領取↓↓,先碼住不迷路~】
點選→領取「連結」
//建立一個QFileDialog來擷取檔案路徑
QString path = QFileDialog::getOpenFileName(
this,
"OpenFile",
"../",
"TXT file(*.txt)");
//建立一個QFileDialog來擷取儲存檔案路徑
QString SavePath = QFileDialog::getSaveFileName(
this,
"SaveFile",
"../複制的文本",
"TXT(*.txt)");
if(QFile::copy(path,SavePath))
{
ui->textEdit->setText("檔案複制儲存成功");
}
else
{
ui->textEdit->setText("檔案複制儲存失敗");
}
exists() :判斷檔案存不存在
bool QFile::exists() const
靜态 bool QFile::exists(const QString & fileName)
exists()函數說明: 1.如果fileName檔案存在,則傳回true;否則傳回false。
bool QFile::exists() const 的使用
//建立一個QFileDialog來擷取檔案路徑
QString path = QFileDialog::getOpenFileName(
this,
"OpenFile",
"../",
"TXT file(*.txt)");
//建立一個QFile對象
QFile file(path);
//QFile.exists() 檔案存在傳回true,反之false
if(file.exists())
{
}
else
{
ui->textEdit->setText("檔案不存在");
return;
}
bool QFile::exists(const QString & fileName) 的使用
QString path = QFileDialog::getOpenFileName(
this,
"OpenFile",
"../",
"TXT file(*.txt)");
bool IsTrue = QFile::exists(path);
if(IsTrue)
{
//ok
}
else
{
//no
}
remove() :删除檔案
bool QFile::remove()
靜态 bool QFile::remove(const QString & fileName)
remove說明: 1.删除filename()指定的檔案。如果成功,則傳回true;否則傳回false。 2.檔案在删除前已關閉
用法都跟上方的差不多就不做例子了,第一個需要一個QFlie對象點出來,第二個你隻需要檔案名就行。
rename() :重命名檔案
bool QFile::rename(const QString & newName)
靜态 bool QFile::rename(const QString & oldName, const QString & newName)
rename說明: 1.将目前由fileName()指定的檔案重命名為newName。如果成功傳回true;否則傳回false。 2.如果一個名為newName的檔案已經存在,rename()傳回false(即, QFile不會覆寫它)。 3.在重命名之前關閉檔案。 4.如果重命名操作失敗,Qt将嘗試将該檔案的内容複制到newName,然後删除該檔案,隻保留newName。 5.如果複制操作失敗或無法删除此檔案,則删除目标檔案newName以恢複舊狀态
setFileName() :設定檔案名稱
void QFile::setFileName(const QString & name)
setFileName說明: 1.設定檔案的名稱。 2.名稱可以沒有路徑、相對路徑或絕對路徑。 3.如果檔案已經被打開,不要調用這個函數。 4.如果檔案名沒有路徑或相對路徑,則使用的路徑将是open()調用時應用程式的目前目錄路徑。 5.注意,目錄分隔符“/”适用于Qt支援的所有作業系統。
link() :建立快捷方式
bool QFile::link(const QString & linkName)
靜态 bool QFile::link(const QString & fileName, const QString & linkName)
link說明: 1.建立一個名為linkName的連結,該連結指向目前由fileName()指定的檔案。 2.連結是什麼取決于底層檔案系統(可能是Windows上的快捷方式,也可能是Unix上的符号連結)。如果成功傳回true;否則傳回false。 3.此函數不會覆寫檔案系統中已存在的實體;在這種情況下,link()将傳回false,并将error()設定為傳回RenameError。 4.注意:要在Windows上建立有效的連結,linkName必須有一個.lnk檔案擴充名
symLinkTarget() :擷取快捷方式路徑字元串
靜态 QString QFile::symLinkTarget(const QString & fileName)
QString QFile::symLinkTarget() const
symLinkTarget說明: 1.傳回檔案名指定的符号連結(或Windows上的快捷方式)所引用的檔案或目錄的絕對路徑,如果檔案名不對應于符号連結,則傳回空字元串。 2.此名稱可能不表示現有檔案;它隻是一個字元串。 3.如果符号連結指向一個現有檔案,則QFile::exists()傳回true。
二、QFile重寫的虛函數
fileName() :傳回檔案名稱
QString QFile::fileName() const
fileName說明: 1.重新實作從QFileDevice::fileName()。 2.傳回由setFileName()或QFile構造函數設定的名稱。
permissions() :傳回檔案權限
Permissions QFile::permissions() const
靜态重載 Permissions QFile::permissions(const QString & fileName) 傳回QFile:: fileName的完整OR-ed組合
我對這個也迷迷糊糊的。
resize() :改變檔案大小
bool QFile::resize(qint64 sz)
靜态重載 bool QFile::resize(const QString & fileName, qint64 sz) 将檔案名設定為大小(以位元組為機關)sz。如果檔案的大小調整成功,則傳回true;否則錯誤。如果sz大于檔案名目前是新的位元組将被設定為0,如果sz更小的檔案隻是被截斷。
我對這個也迷迷糊糊的。
setPermissions() :設定檔案權限
bool QFile::setPermissions(Permissions permissions)
靜态重載 bool QFile::setPermissions(const QString & fileName, Permissions permissions)
setPermissions說明: 1.将檔案的權限設定為指定的權限。如果成功,則傳回true; 2.如果無法修改權限,則傳回false。 3.警告:此函數不操作ACLs,這可能會限制其有效性
size() :傳回檔案大小
qint64 QFile::size() const
size說明: 1.對于開放随機通路裝置,此函數傳回裝置的大小。 2.對于打開的順序裝置,将傳回bytesAvailable()。 3.如果裝置關閉,傳回的大小将不反映裝置的實際大小。
pos() :傳回檔案目前檔案指針位置
qint64 QFileDevice::pos() const
seek() :移動目前檔案指針位置
bool QFileDevice::seek(qint64 pos)