很高興你能看到這篇文章,同時我的語雀文檔也更新了許多嵌入式系列的學習筆記希望能幫到你 :
https://www.yuque.com/alive-m4b9n
目錄
- QFile 主要功能
- QFile 操作步驟
- QFile 其他常用函數
- 案例分析及實現
- 功能一實現:打開文件并顯示
- 功能二實現:另存為
QFile
是 Qt 提供的一個用于文件操作的類,繼承自
QIODevice
,用于處理文件的讀取、寫入、刪除等操作。
使用前需要引入頭文件
QFile 主要功能
- 打開文件
- 讀取數據
- 寫入數據
- 刪除文件
- 檢查文件狀態
- 復制和重命名文件
QFile
支持文本和二進制模式,可以用 QTextStream
或 QDataStream
進行高效的文件操作。
QFile 操作步驟
1?? 創建 QFile 對象
//構造函數
QFile(const QString &name, QObject *parent)
QFile(QObject *parent)
QFile(const QString &name)---------示例--------------
QFile file("test.txt");
2?? 調用 open()
以指定模式打開文件
bool open(FILE *fh, QIODevice::OpenMode mode, //通過文件路徑打開QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)bool open(int fd, QIODevice::OpenMode mode, //通過fd文件描述符打開QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)------------------示例-----------------
QFile file("test.txt");
file.open(QIODevice::ReadWrite | QIODevice::Text);
打開模式如下,需要多個模式時用 |
隔開
模式 | 描述 |
---|---|
ReadOnly | 只讀模式 |
WriteOnly | 只寫模式 |
ReadWrite | 讀寫模式 |
Append | 追加模式(不會覆蓋已有內容) |
Text | 以文本模式打開(自動轉換換行符) |
Truncate | 清空文件內容 |
3?? 文件操作:讀或者寫
//讀
QByteArray QIODevice::read(qint64 maxSize) //讀取最大maxsize的數據
QByteArray QIODevice::readAll() //讀取文件所有數據,返回QByteArray數組
//寫
qint64 write(const QByteArray &byteArray) //QByteArray 數據
qint64 write(const char *data, qint64 maxSize) //char* 指針,數據大小----------示例-----------
QFile file("example.txt");
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {QByteArray content = file.readAll();qDebug() << "文件內容:\n" << content;file.close();
}
4?? 關閉
void QFileDevice::close()
QFile 其他常用函數
類別 | 函數 | 作用 | 示例代碼 |
---|---|---|---|
文件基本操作 | exists() | 判斷文件是否存在 | if (file.exists()) qDebug() << "文件存在" |
remove() | 刪除文件 | file.remove(); | |
copy(src, dst) | 復制文件 | QFile::copy("test.txt", "backup.txt"); | |
rename(old, new) | 重命名/移動文件 | file.rename("new_name.txt"); | |
flush() | 刷新緩沖區 | file.flush(); | |
文件信息 | size() | 獲取文件大小(字節) | qDebug() << file.size(); |
fileName() | 獲取文件名(可能是相對路徑) | qDebug() << file.fileName(); | |
absoluteFilePath() | 獲取文件的絕對路徑 | qDebug() << QFileInfo(file).absoluteFilePath(); | |
permissions() | 獲取文件權限 | qDebug() << file.permissions(); | |
setPermissions() | 修改文件權限 | file.setPermissions(QFileDevice::ReadOwner) | |
讀寫文件 | isReadable() | 是否可讀 | if (file.isReadable()) qDebug() << "可讀"; |
isWritable() | 是否可寫 | if (file.isWritable()) qDebug() << "可寫"; | |
文件狀態 | isOpen() | 判斷文件是否已打開 | if (file.isOpen()) qDebug() << "文件已打開"; |
isWritable() | 判斷文件是否可寫 | if (file.isWritable()) qDebug() << "文件可寫"; | |
handle() | 獲取底層文件句柄 | int fd = file.handle(); |
案例分析及實現
需求
- 打開文件對話框,獲取文件路徑名,然后通過文件操作將文件內容顯示到輸入框上
- 點擊另存為按鈕可以保存當前文件到其他地方去。
功能一實現:打開文件并顯示
思路
1?? 打開文件選擇對話框(
QFileDialog::getOpenFileName
)2?? 獲取用戶選擇的文件路徑
3?? 使用
QFile
讀取文件內容 4?? 將內容顯示到QTextEdit
mainwindow.h
private slots:
void on_openButton_clicked(); // 打開文件
void on_saveAsButton_clicked(); // 另存為private:
Ui::MainWindow *ui;
QString currentFilePath; // 存儲當前文件路徑
mainwindow.cpp
//打開文件
void MainWindow::on_openButton_clicked()
{//打開文件對話框,獲取文件路徑QString filePath = QFileDialog::getOpenFileName(this,"選擇文件","","文本文件(*.txt);;所有文件(*.*)");if(filePath.isEmpty()){qDebug()<<"未選擇文件";return;}qDebug() << "選擇的文件路徑:" << filePath;currentFilePath = filePath; //記錄當前的文件路徑//打開文件QFile file(filePath);if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){qDebug()<<"文件打開失敗"<<file.errorString();//輸出錯誤信息return;}//讀取文件內容QTextStream in(&file);QString fileContent = in.readAll();file.close();//顯示到QtextEdit上ui->textEdit->setText(fileContent);
}
效果
功能二實現:另存為
mainwindow.cpp
// 另存為
void MainWindow::on_saveAsButton_clicked()
{// 打開文件對話框,獲取保存路徑QString saveFilePath = QFileDialog::getSaveFileName(this, "另存為", "","文本文件 (*.txt);;所有文件 (*.*)");if (saveFilePath.isEmpty()) {qDebug() << "未選擇保存路徑";return;}qDebug() << "保存文件路徑:" << saveFilePath;// 打開文件QFile file(saveFilePath);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {qDebug() << "文件保存失敗:" << file.errorString();return;}// 獲取 QTextEdit 中的內容QString content = ui->textEdit->toPlainText();// 寫入文件QTextStream out(&file);out << content;file.close();qDebug() << "文件保存成功";
}
效果