QFile官方幫助文檔-詳細介紹部分(個人翻譯)

QFile是用於讀寫文本、二進制文件和資源的I/O設備。QFile可以自己單獨用,和QTextStream或QDataStream一起用,更方
便。
文件名通常通過構造函數傳入,可用setFileName()隨時候重新設置。無論什麼操作系統,QFile要求文件分隔符是'/',不支持其他分隔符(例:'\')。
用open()打開文件,用close()關閉文件,用flush()清空緩存數據至I/O。通常用QDataStream和QTextStream讀寫數據,也可用繼承自QIODevice的函數read()、readLine()、readAll()、write()。若每次只想處理單個字符,用繼承下來的getChar()、putChar()和ungetChar()。

size()返回值爲文件大小。pos()返回值爲當前文件位置,seek()移動文件位置至新位置。atEnd()查看是否已到文件底部,若是,返回true。

直接讀取文件:
以下示例展示如何一行一行地讀取文本
QFile file("in.txt");
 if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
          return;

    while (!file.atEnd()) {
        QByteArray line = file.readLine();
        process_line(line);
  }

標識QIODevice::Text通知Qt,轉換Window風格行終止符("\r\n")爲C++風格行終止符("\n")。默認情況,QFile不對文件內容做任何轉換,當二進制文件處理。


使用流Streams讀取文件
這個例子是用QTextStream一行行地讀取文本
 QFile file("in.txt");
      if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
          return;

      QTextStream in(&file);
      while (!in.atEnd()) {
          QString line = in.readLine();
          process_line(line);
      }

QTextStream會將硬盤中存儲的8-bit數據轉換爲16-bit的Unicode編碼。默認下,QFile認爲用戶系統是使用本地8-bit編碼(例如:大多數基於unix的操作系統使用UTF-8;詳細信息可通過QTextCode::codecForLocale查詢)。該操作通過QTextStream::setCodec()可修改。

用重載的運算符operator<<()寫文本,QTextStream位於運算符左面,各種數據(包括QString)位於運算符右邊。

 QFile file("out.txt");
      if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
          return;

      QTextStream out(&file);
      out << "The magic number is: " << 49 << "\n";


QTextStream,用operator<<()寫數據,用operator>>()讀數據。詳見類文檔。
Qt下,QFile、QFileInfo、QDir支持Unicode編碼文件名訪問系統文件系統。Unix上,Unicode編碼文件名被轉化爲8-bit編碼。若想用標準C++ API(<cstdio>或<iostream)或平臺特定的API去訪問文件,可用encodeName()和decodeName()在Unicode編碼文件名8-bit編碼文件名間互轉。

Unix上,有一些特殊的系統文件(例如:in/proc),調用size(),返回值爲0,但read()卻依然能返回更多的數據。這種情況下,atEnd()無法判斷是否還有未讀的數據(因爲atEnd()返回true的依據是文件size()爲0)。取而代之的辦法是,不停重複地調用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()) {
          process_line(line);
          line = in.readLine();
      }

信號:
與其他QIODevive的實現不同(比如QTcpSocket),QFile不發出aboutToClose()、bytesWriten()或readRead()信號。因此,QFile不適合讀寫該類文件,比如Unix平臺的設備文件。

平臺特定問題:
Unix-like和windows下文件權限不同。Unix-like系統,文件夾禁寫,文件就不能創建。windows下,就沒有這種問題。例如,"My Document"文件夾通常禁寫,但可在其內創建文件。
Qt瞭解文件權限限制,用QFile::setPermission()函數來調整
。windows下,若沒有任何寫標識傳入,Qt僅設置系統默認的只讀標識。Qt不操作控制列表(ACLS),調整他,會使QFile::setPermission()對NTFS volumes失效。使用VFAT文件系統的USB sticks,他可能會有效。Qt也不操作POSIX ACLS。

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