[Qt] QFile, QDir

이번 글에서는 디렉토리 탐색 기능을 제공하는 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::NotOpen0x0000The device is not open.
QIODeviceBase::ReadOnly0x0001The device is open for reading.
QIODeviceBase::WriteOnly0x0002The 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::ReadWriteReadOnly | WriteOnlyThe device is open for reading and writing.
QIODeviceBase::Append0x0004The device is opened in append mode so that all data is written to the end of the file.
QIODeviceBase::Truncate0x0008If possible, the device is truncated before it is opened. All earlier contents of the device are lost.
QIODeviceBase::Text0x0010When 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::Unbuffered0x0020Any buffer in the device is bypassed.
QIODeviceBase::NewOnly0x0040Fail 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::ExistingOnly0x0080Fail 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에 대해 알아보았습니다.

참고 링크