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
*/

參考: