天天看點

Qt的QFile

作者:音視訊開發老舅

文章目錄

  • 1.建立QFile對象
  • 2.open():指定打開方式
  • 3.讀檔案(Read)
  • 4.寫檔案(Write)

1.建立QFile對象

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

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

繼續閱讀