이번 글에서는 디렉토리 탐색 기능을 제공하는 QDir과 파일 입출력 기능을 제공하는 QFile에 대해 알아보겠습니다.
QDir
QDir 클래스를 사용하려면 다음과 같이 헤더 파일을 포함해야 합니다.
#include <QDir>
QDir 클래스는 다양한 경로를 얻을 수 있는 함수를 제공합니다.
QDir 반환 | QString 반환 | 설명 |
---|---|---|
QDir::current(); | QDir::currentPath(); | 현재 디렉토리 경로를 반환합니다. |
QDir::home(); | QDir::homePath(); | 사용자의 홈 디렉토리 경로를 반환합니다. |
QDir::temp(); | QDir::tempPath(); | 시스템의 임시 디렉토리 경로를 반환합니다. |
QDir::root(); | QDir::rootPath(); | 현재 디렉토리 경로의 최상위 경로를 반환 합니다. |
QDir에서 자주 사용하는 함수 목록은 아래와 같습니다.
- mkdir: 디렉토리 생성
- rename: 디렉토리 이름 변경
- exists: 디렉토리 존재 유무 확인
- rmdir: 디렉토리 삭제
- path: 현재 경로 얻기
- dirName: 폴더 이름 얻기
- entryList: 파일&폴더 리스트 얻기
- isEmpty: 파일&폴더 존재 유무 확인
아래는 샘플 코드 입니다.
// get path(return 'QDir' Type)
qDebug() << QDir::current(); // 현재 디렉토리 경로를 반환합니다.
qDebug() << QDir::home(); // 사용자의 홈 디렉토리 경로를 반환합니다.
qDebug() << QDir::temp(); // 시스템의 임시 디렉토리 경로를 반환합니다.
qDebug() << QDir::root(); // 현재 디렉토리 경로의 최상위 경로를 반환 합니다.
// get path(return 'QString' Type)
qDebug() << QDir::currentPath(); // 현재 디렉토리 경로를 반환합니다.
qDebug() << QDir::homePath(); // 사용자의 홈 디렉토리 경로를 반환합니다.
qDebug() << QDir::tempPath(); // 시스템의 임시 디렉토리 경로를 반환합니다.
qDebug() << QDir::rootPath(); // 현재 디렉토리 경로의 최상위 경로를 반환 합니다.
QDir dir(QDir::currentPath());
//QDir dir(QDir::homePath());
// QDir dir(QDir::tempPath());
// QDir dir(QDir::rootPath());
qDebug() << "dir.mkdir(): " << dir.mkdir("test"); // 디렉토리 생성
qDebug() << "dir.rename(): " << dir.rename("test", "New"); // 디렉토리 이름 변경
qDebug() << "dir.exists(): " << dir.exists("New"); // 디렉토리 존재 유무 확인
qDebug() << "dir.rmdir(): " << dir.rmdir("New"); // 디렉토리 삭제
qDebug() << "dir.path(): " << dir.path(); // 현재 경로 얻기
qDebug() << "dir.dirName(): " << dir.dirName(); // 폴더 이름 얻기
qDebug() << "dir.entryList(): " << dir.entryList(); // 파일&폴더 리스트 얻기
qDebug() << "dir.isEmpty(): " << dir.isEmpty(); // 파일&폴더 존재 유무 확인
QFile
QFile 클래스를 사용하려면 다음과 같이 헤더 파일을 포함해야 합니다.
#include <QFile>
QFile에서 자주 사용하는 함수 목록은 아래와 같습니다.
- open: 파일 생성
- exists: 파일 존재 유무 확인
- rename: 파일 이름 변경
- remove: 파일 삭제
- copy: 파일 복사
- write: 파일 쓰기
- read: 파일 읽기
open 함수 호출 시 사용되는 인자의 종류는 다음과 같습니다.
enum | 값 | 설명 |
---|---|---|
QIODeviceBase::NotOpen | 0x0000 | The device is not open. |
QIODeviceBase::ReadOnly | 0x0001 | The device is open for reading. |
QIODeviceBase::WriteOnly | 0x0002 | The device is open for writing. Note that, for file-system subclasses (e.g. QFile), this mode implies Truncate unless combined with ReadOnly, Append or NewOnly. |
QIODeviceBase::ReadWrite | ReadOnly | WriteOnly | The device is open for reading and writing. |
QIODeviceBase::Append | 0x0004 | The device is opened in append mode so that all data is written to the end of the file. |
QIODeviceBase::Truncate | 0x0008 | If possible, the device is truncated before it is opened. All earlier contents of the device are lost. |
QIODeviceBase::Text | 0x0010 | When reading, the end-of-line terminators are translated to ‘\n’. When writing, the end-of-line terminators are translated to the local encoding, for example ‘\r\n’ for Win32. |
QIODeviceBase::Unbuffered | 0x0020 | Any buffer in the device is bypassed. |
QIODeviceBase::NewOnly | 0x0040 | Fail if the file to be opened already exists. Create and open the file only if it does not exist. There is a guarantee from the operating system that you are the only one creating and opening the file. Note that this mode implies WriteOnly, and combining it with ReadWrite is allowed. This flag currently only affects QFile. Other classes might use this flag in the future, but until then using this flag with any classes other than QFile may result in undefined behavior. (since Qt 5.11) |
QIODeviceBase::ExistingOnly | 0x0080 | Fail if the file to be opened does not exist. This flag must be specified alongside ReadOnly, WriteOnly, or ReadWrite. Note that using this flag with ReadOnly alone is redundant, as ReadOnly already fails when the file does not exist. This flag currently only affects QFile. Other classes might use this flag in the future, but until then using this flag with any classes other than QFile may result in undefined behavior. (since Qt 5.11 |
아래는 샘플 코드 입니다.
QFile fileWrite("file.dat");
// 존재 유무 확인
if (fileWrite.exists())
qDebug() << "Exist";
else
qDebug() << "Not exist";
// 존재하면 열기
if (fileWrite.open(QIODevice::ExistingOnly | QIODevice::ReadWrite)) //
{
qDebug() << "Exist";
fileWrite.close();
}
else
qDebug() << "Not exist";
// 만들면서 열기. 기존 존재하는 파일 있으면 Fail
if (fileWrite.open(QIODevice::NewOnly | QIODevice::ReadWrite))
{
qDebug() << "New file";
fileWrite.close();
}
else
qDebug() << "New File Fail";
// 파일을 무조건 새로 만들기.
if (fileWrite.open(QIODevice::Truncate | QIODevice::ReadWrite))
{
qDebug() << "Truncate file";
bool bCopy = fileWrite.copy("copy_file.dat"); // 복사 파일 만들기
qDebug() << "Copy file: " << bCopy;
bool bRename = fileWrite.rename("new_file.dat"); // 파일 이름 변경
qDebug() << "Rename file: " << bRename << ", file name: " << fileWrite.fileName();
bool bDelete = fileWrite.remove("new_file.dat"); // 파일 삭제
qDebug() << "Delete file: " << bDelete;
fileWrite.close();
}
else
qDebug() << "Truncate File Fail";
// write
QFile file("file.txt");
if (file.open(QIODevice::Truncate | QIODevice::WriteOnly | QIODevice::Text))
{
//QTextStream out(&file);
//out << "The magic number is: " << 49 << "\n";
QByteArray arr;
arr.append("The magic number is ");
arr.append("49");
file.write(arr);
file.close();
}
else
qDebug() << "Text File Open Fail";
// read
if (file.open(QIODevice::Truncate | QIODevice::ReadOnly | QIODevice::Text))
{
//QTextStream in(&file);
//while (!in.atEnd())
//{
// QString line = in.readLine();
// qDebug() << "read line: " << line;
//}
while (!file.atEnd())
{
QByteArray line = file.readLine();
qDebug() << "read line: " << line;
}
}
else
qDebug() << "Text File Open Fail";
이상으로 QDir과 QFile에 대해 알아보았습니다.
참고 링크