Qt的QFile

//頭文件
#include <QFile>
//文件對話框
#include <QFileDialog>

配合QFileDialog:“文件對話框”,一起食用將會更好哦!
專門講QFileDialog的博文

1.創建QFile對象

我們在創建QFile對象的時候會用到,QFile的構造函數,我們一起來看一下它有什麼構造函數吧。

  1. QFile::QFile(const QString & name);
    原文:Constructs a new file object to represent the file with the given name;
    翻譯:構造一個新的file對象來表示具有給定名稱的文件。
  1. QFile::QFile(QObject * parent);
    原文:Constructs a new file object with the given parent
    翻譯:使用給定的父對象構造一個新的file對象。
    用途:指定父對象主要用於來自動回收內存。
  1. 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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章