Qt 檔案與資料夾處理
QFile, QDir,與QFileInfo是Qt5專門處理檔案的class。
QFile提供檔案讀取與寫入,QDir提供存取資料夾結構與相關內容修改,QFileInfo提供檔案資訊,包含名稱、位置、修改時間、權限等等。
取得檔案大小
#include
....
QString filename = "myfile.txt" // argv[1];
//QString filename = argv[1]; 輸入參數
//檢查檔案
if (!QFile(filename).exists()) {
qWarning("The file does not exist");
return 1;
}
//建立QFileInfo實體
QFileInfo fileinfo(filename);
//取得檔案大小
qint64 size = fileinfo.size();
QString str = "The size is: %1 bytes";
out << str.arg(size) << endl;
讀取檔案內容
此次讀取檔案會特別用到QTextStream,它會自動將Unicode編碼同作業系統的編碼進行轉換,它也會將換行符進行轉換,不需要自己處理。
#include
#include
....
QFile file("myfile.txt");
if (!file.open(QIODevice::ReadOnly)) {//以讀取方式打開文件
qWarning("Cannot open file for reading");
return 1;
}
QTextStream in(&file);
//可用 out << in.readAll() << endl; 取代
while (!in.atEnd()) {
QString line = in.readLine();//讀取一行
out << line << endl;
}
file.close();
寫檔
QFile file("myfile.txt");
//* QIODevice::WriteOnly 以只寫方式打開
//* QIODevice::Truncate 以重寫的方式打開,在寫入新的數據時會將原有數據全部清除,遊標設置在文件開頭
if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
QTextStream out(&file); //load進檔案,以下為寫入檔案
out << "Xubuntu" << endl;
out << "Arch" << endl;
out << "Debian" << endl;
out << "Redhat" << endl;
out << "Slackware" << endl;
} else {
qWarning("Could not open file");
}
file.close();
QIODevice::NotOpen 未打開
QIODevice::ReadOnly 以只讀方式打開
QIODevice::WriteOnly 以只寫方式打開
QIODevice::ReadWrite 以讀寫方式打開
QIODevice::Append 以追加的方式打開,新增加的內容將被追加到文件末尾
QIODevice::Truncate 以重寫的方式打開,在寫入新的數據時會將原有數據全部清除,遊標設置在文件開頭。
QIODevice::Text 在讀取時,將行結束符轉換成 \n;在寫入時,將行結束符轉換成本地格式,例如 Win32 平臺上是 \r\n
QIODevice::Unbuffered 忽略緩存
複製檔案
QString source = "./sourcePath/";
//QString source = argv[1];
QString destin("./destinPath/");
//QString destin(argv[2]);
QFile::copy(source, destin);
取得檔案所屬的使用者與群組
QString group = fileinfo.group();
QString owner = fileinfo.owner();
檔案的讀取時間
#include
....
QDateTime last_rea = fileinfo.lastRead();
QDateTime last_mod = fileinfo.lastModified();
建立編輯資料夾
#include
....
QDir dir;
if (dir.mkdir("mydir")) { //建立mydir資料夾
out << "mydir successfully created" << endl;
}
dir.mkdir("mydir2");//建立資料夾mydir2
if (dir.exists("mydir2")) {
dir.rename("mydir2", "newdir");//重新命名
}
dir.mkpath("temp/newdir");//建立目錄與資料夾
取得系統路徑
以Windows為例
QDir::currentPath(); // D:/Qt_root/build-str_test-Desktop_Qt_5_8_0_MSVC2015_64bit-Release
QDir::homePath(); // C:/Users/avermedia
QDir::tempPath(); // C:/Users/avermedia/AppData/Local/Temp
QDir::rootPath(); // C:/
取得檔案名稱、路徑、副檔名
QFileInfo fileinfo("myfile.txt");
fileinfo.absoluteFilePath();// D:/Qt_root/build-str_test-Desktop_Qt_5_8_0_MSVC2015_64bit-Release/release/myfile.txt
fileinfo.baseName(); //myfile
fileinfo.completeBaseName(); //myfile
fileinfo.fileName(); // myfile.txt
fileinfo.suffix(); // txt
fileinfo.completeSuffix(); //txt
權限
QFile::Permissions ps = QFile::permissions("myfile.txt"); //取得權限,回傳一個enumeration
/*
{
QFileDevice::NoError 0
QFileDevice::ReadError 1
QFileDevice::WriteError 2
QFileDevice::FatalError 3
QFileDevice::ResourceError 4
QFileDevice::OpenError 5
QFileDevice::AbortError 6
QFileDevice::TimeOutError 7
QFileDevice::UnspecifiedError 8
QFileDevice::RemoveError 9
QFileDevice::RenameError 10
QFileDevice::PositionError 11
QFileDevice::ResizeError 12
QFileDevice::PermissionsError 13
QFileDevice::CopyError 14
}
*/
if (ps & QFile::ReadOwner) {
fper.append('r');
} else {
fper.append('-');
}
if (ps & QFile::WriteOwner) {
fper.append('w');
} else {
fper.append('-');
}
if (ps & QFile::ExeOwner) {
fper.append('x');
} else {
fper.append('-');
}
if (ps & QFile::ReadGroup) {
fper.append('r');
} else {
fper.append('-');
}
if (ps & QFile::WriteGroup) {
fper.append('w');
} else {
fper.append('-');
}
if (ps & QFile::ExeGroup) {
fper.append('x');
} else {
fper.append('-');
}
if (ps & QFile::ReadOther) {
fper.append('r');
} else {
fper.append('-');
}
if (ps & QFile::WriteOther) {
fper.append('w');
} else {
fper.append('-');
}
if (ps & QFile::ExeOther) {
fper.append('x');
} else {
fper.append('-');
}
out << fper << endl;
//rw-rw-rw-
列出資料夾
QString directory = "D:/Qt_root/";
//QString directory = argv[1];
QDir dir(directory);
dir.setFilter(QDir::Files | QDir::AllDirs); //遍歷該目錄下的文件,不遍歷資料夾
dir.setSorting(QDir::Size | QDir::Reversed); //設定排序條件為檔案大小
QFileInfoList list = dir.entryInfoList();
for (int i = 0; i < list.size(); ++i) {
QFileInfo fileInfo = list.at(i); //取得檔案資訊
QString str = fileInfo.fileName();
str.append(QString(" %1").arg(fileInfo.size()));
out << str << endl;
}
/*
temp 0
newdir 0
mydir 0
.. 0
. 0
aaa.txt 16
main.obj 12147
str_test.exe 13824
*/
參考: