文章目錄
//頭文件
#include <QFile>
//文件對話框
#include <QFileDialog>
配合QFileDialog:“文件對話框”,一起食用將會更好哦!
專門講QFileDialog的博文
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:
打開方式 | 說明 |
---|---|
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) 的寫法
//創建一個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)