使用QFile進行檔案操作

2021-07-29 09:32:43 字數 2855 閱讀 2401

qfile類我我們提供了操作檔案的常用功能。它是一種io裝置,可以用來讀寫文字檔案和二進位制檔案,也可以用來讀寫qt的資源檔案。qfile類可以單獨使用,該類本身提供了read/write函式,但更方便的方式是,將qfile和qtextstream或qdatastream一起使用。

一般情況下,使用qfile建立物件時,就會把要操作的檔名傳遞給它。但該類也提供了乙個setfilename() 方法,允許我們在任何時候為qfile物件設定要操作的檔名。但是,qfile 只支援"/",不支援"\"。

在構造qfile的物件後,我們可以使用exists() 判斷檔案是否存在,使用remove() 刪除乙個檔案。在進行實際的內容讀寫前,需呼叫open()開啟檔案,讀寫結束後,要呼叫close()關閉檔案,也可以寫呼叫一下flush(),沖刷緩衝區。就向我們剛才說的,我們一般使用qdatastream或qtextstream 讀寫檔案,但我們也可以使用qfile繼承自qiodevice的函式,如read()、readline()、readall()、write()等。除了讀寫函式外,我們還能使用size() 函式獲得檔案的大小;使用pos() 或 seek() 函式獲取及設定檔案讀寫的位置;使用atend() 函式判斷是否到達了檔案結尾。

直接使用qfile讀寫檔案

qfile file("in.txt");

if (!file.open(qiodevice::readonly | qiodevice::text))

return;

while (!file.atend())

在此,我們將qiodevice::text傳給了open()函式,該標誌是用來告訴qt將檔案中的換行符由"\r\n",轉換成"\n"。因為,預設情況下,qfile把檔案當做二進位制進行讀寫,不會進行任何的位元組轉換。

使用流讀取檔案:

qfile file("in.txt");

if (!file.open(qiodevice::readonly | qiodevice::text))

return;

qtextstream in(&file);

while (!in.atend())

qtextstream會把儲存在磁碟上的8bit資料轉換為16bit的unicode 字串qstring。預設情況下,qtextstream假定檔案使用的是使用者系統的本地8bit編碼。我們也可以使用qtextstream::setcodec() 函式還改變這種行為。

當使用qfile,qfileinfo和qdir類去操作檔案系統時,你可以使用unicode編碼的檔名。在unix平台上,這些檔名會被轉換成8-bit編碼。但如果你想使用標準c++ api或者平台特定的api去訪問檔案,那麼你可以使用encodename() 和 decodename() 函式在unicode檔名和8-bit檔名之間進行轉換。

在unix平台下,存在一些特殊的系統檔案,例如/proc目錄下,對這個檔案呼叫size() 總是返回0,然而,你還是能夠從此類檔案中讀取到資料;這些資料是為了相應你的read() 函式而間接產生出來的。但是,在這種情況下,你不能使用atend() 來判斷是否還有資料可讀(因為atend() 對於大小為0的檔案返回true)。相反,你應該呼叫readall(),或 反覆呼叫read()、readline()知道沒有資料可讀為止。如下**所示,我們使用qtextstream一行一行的讀取/proc/modules檔案:

qfile file("/proc/modules");

if (!file.open(qiodevice::readonly | qiodevice::text))

return;

qtextstream in(&file);

qstring line = in.readline();

while (!line.isnull())

其實,除了上面使用的qfile從qiodevice繼承的open() 函式外,qfile本身也為我們提供了兩個open() 函式:

bool open(file *fh, openmode mode, filehandleflags handleflags = dontclosehandle)

bool open(int fd, openmode mode, filehandleflags handleflags = dontclosehandle)

第乙個open() 會按一定的模式開啟乙個現存的檔案指標。同時,可以再指定額外的標誌。如下**所示:

#include void printerror(const char* msg)

當乙個qfile已這種方式開啟時,那麼後續的close() 函式的作用會受到autoclosehandle標誌的影響。如果指定了該標誌,並且這個open() 函式呼叫成功了,那麼後續再qfile物件上呼叫close() 會關閉底層檔案控制代碼。否則,若沒指定這個標誌,close()函式不會真正的關閉底層檔案控制代碼,而只是沖刷 了一下緩衝區。如下測試**所示:

當我們使用 1處的方式開啟檔案指標,即不指定autoclosehandle標誌,則close() 函式後的「world」是可以繼續被寫入檔案的;若使用2處的方式開啟檔案指標,則「world」並不會再被寫入檔案,因為底層檔案已關閉。

第二個open() 函式與此類似,只不過其是按一定模式開啟乙個現存的檔案描述符。autoclosehandle標誌也會影響後續的close()函式。同時,如果qfile已這種方式開啟,那麼它會被自動地設定為raw mode,這意味著檔案的輸入、輸出函式的執行會變慢。如果你遇到了效能問題,你應該嘗試使用其他的開啟函式。

至於其他的成員函式,比如檔案的刪除、重新命名,檔案訪問許可權的設定,qt的幫助文件已講的很清除,大家可以在使用時隨時檢視即可。

使用命令進行檔案操作

在android 中 使用linux命令做一些檔案操作,如 移動,複製,刪除等。刪除檔案 public boolean deletetmpfile string tmpfile catch ioexception e return true 2.移動檔案 移動檔案 param tmpfile 快取檔...

python進行檔案操作

什麼是檔案 檔案是系統儲存區域的乙個命名位置,用來儲存一些資訊,便於後續訪問。能夠在非易失性儲存器中實現持續性儲存,比如在硬碟上。當我們要讀取或者寫入檔案時,我們需要開啟檔案 在操作完畢時,我們需要關閉檔案,以便釋放和檔案操作相關的系統資源,因此,檔案操作的主要包括以下 開啟檔案 python使用內...

QT 檔案操作 QFile

目錄 qfile類介紹 寫入資料到txt檔案 例項 從txt檔案中讀取所有資料 例項 從txt檔案中一行一行讀取資料 例項 部分函式引數及作用 qiodevice 類是 qt 中所有 i o 裝置的基礎介面類,為諸如 qfile qbuffer 和 qtcpsocket 等支援讀 寫資料塊的裝置提供...