본문 바로가기
C++ 200제/코딩 IT 정보

[Qt 프로그래밍] 자동 파일 삭제 프로그램 (C++)

by vicddory 2018. 1. 7.

[Qt 프로그래밍] 자동 파일 삭제 프로그램 (C++)


주기적으로 특정 경로를 탐색하여 생성된 지 오래된 파일을 삭제하는 Qt 프로그래밍 샘플 코드다. 이 포스트에 포함된 샘플 프로젝트에선 2초 주기의 타이머가 구동된다. 이 타이머는 생성된 지 1일이 넘은 파일을 삭제하는 함수를 호출한다.


프로젝트 : Deletor.zip [링크]


아래 Qt 프로그래밍 코드의 kInterval과 kCreated 변수로 삭제 주기와 삭제할 대상 파일 정보를 변경할 수 있다. (kInterval은 타이머 구동 주기, kCreated는 생성된 지 며칠이 됐는지)


기본 컨셉은 이렇고, 실제 코드를 살펴본다. 특정 경로의 파일을 탐색하려면 몇 가지 include 요소가 필요하다.


1
2
3
4
5
#include <QDir> // 파일 탐색 경로
#include <QFile> // 파일 삭제 함수 이용 (QFile::remove(경로));
 
#include <QFileInfo> // 단일 파일 정보 불러오기
#include <QFileInfoList> // 파일 리스트 생성
cs


QDir, QFile : 각각 경로와 파일을 탐색(탐색/삭제)하는 데 필요.

QFileInfo, QFileInfoList : 파일의 상세 정보를 읽어 들이는 데에 필요.

QFileInfo가 리턴해 주는 정보는 FileInfoList의 객체에 저장될 것이다. 만약, 폴더 속의 파일이 아니라 특정 대상 파일만을 탐색한다면, FileInfoList에 파일 정보들을 담아둘 필요는 없다. 파일 정보를 획득하는 즉시 처리하면 된다.


우선 Qt 프로그래밍 예제의 헤더 파일 소스부터 살펴보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#ifndef DELETOR_H
#define DELETOR_H
 
#include <QObject>
#include <QDebug>
 
#include <QDir> // 파일 탐색 경로
#include <QFile> // 파일 삭제 함수 이용 (QFile::remove(경로));
 
#include <QFileInfo> // 단일 파일 정보 불러오기
#include <QFileInfoList> // 여러 파일 리스트 생
 
#include <QDateTime> // 파일 생성 일자 불러오기
 
#include <QTimer>
 
class Deletor : public QObject
{
    // 파일 상태를 확인하는 주기
    static const int kInterval = 2000;
 
    // 일 기준(day)
    static const int kCreated = 1;
 
    // 읽을 파일 형태
    static const QString kFileType;
 
    Q_OBJECT
 
public:
    Deletor();
    ~Deletor();
 
    // 파일 확인 후 삭제하는 함수
private slots:
    void Delete();
 
private:
    QString file_dir_;
    QTimer *timer_created_;
 
public:
    void set_file_dir(const QString dir);
};
 
#endif // DELETOR_H
cs


앞서 설명했던 요소들이 실제로 구현되었다는 것이 확인된다.


QTimer를 이용해 주기적인 동작을 할 수 있고, set_file_dir() 함수를 이용해 탐색해야 할 경로를 지정할 수 있다. 만약 탐색 경로를 지정하지 않는다면 프로그램은 오류를 낼 것이다. 어차피 샘플 중의 샘플 코드라 나는 그렇게까지 꼼꼼하게 작성하진 않았다. 이어서 Qt 프로그래밍 예제의 cpp 파일을 살펴본다.


QString kFileType 변수에 값을 대입한다. "*.txt"란 값을 대입하는데, txt 확장자를 가진 모든 파일을 의미한다. 이 샘플 프로젝트는 txt 파일만 탐색한다는 뜻이기도 하다.


파일 삭제 프로그램 Qt 프로그래밍[C++ Qt 파일 삭제 프로그램]


txt 확장자 이외의 파일도 탐색 대상에 포함하려면 아래처럼 코드를 수정하자.


"*.txt, *.xls, *.docx"


간단하지 않은가?

콤마로 확장자만 추가하면 된다. 그리고, Qt 프로그래밍의 생성자에서 2,000ms로 구동되는 타이머도 설정했다. 중요한 건, Delete() 함수인데, 소스를 먼저 살펴보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include "deletor.h"
 
// 확장자 txt만 읽음
const QString Deletor::kFileType = "*.txt";
 
Deletor::Deletor()
    : timer_created_(new QTimer())
{
    // 타이머가 파일의 생성 일자를 주기적으로 확인
    connect(timer_created_, &QTimer::timeout, this&Deletor::Delete);
 
    timer_created_->start(2000);
}
 
Deletor::~Deletor()
{
    timer_created_->stop();
}
 
void Deletor::Delete()
{
    QDir dir(file_dir_);
 
    dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); // 파일 전체 불러오기
    dir.setSorting(QDir::Unsorted); // 정렬 없음
    dir.setNameFilters(QStringList() << kFileType);
 
    // 확장자 txt를 리스트에 저장
    const QFileInfoList entryInfoList = dir.entryInfoList();
 
    int size = entryInfoList.size();
 
    for (int i = 0; i < size; i++) {
        QFileInfo fi = entryInfoList.at(i);
        QDateTime time = fi.created();
 
        qDebug() << entryInfoList.at(i).fileName() << time.daysTo(QDateTime::currentDateTime()) << entryInfoList.at(i).filePath();
 
        // 만들어진 일자가 기준 일자보다 크면 삭제
        if (time.daysTo(QDateTime::currentDateTime()) > kCreated)
            QFile::remove(entryInfoList.at(i).filePath());
    }
}
 
void Deletor::set_file_dir(const QString dir)
{
    file_dir_.clear();
    file_dir_.append(dir);
}
cs


QDir의 객체를 생성하고 아래 3개의 함수를 호출한다.


setFilter - QDir 객체가 접근할 파일의 속성을 지정

setSorting - QDir이 접근한 파일들을 정렬하여 보관할지 지정

setNameFilters - QDir이 접근할 파일의 확장자를 지정


이런 기본적인 사항을 설정하지 않는다면, QDir 객체는 경로로 이동하되, 파일에 접근하진 못한다.


Qt 프로그래밍 파일 삭제 프로그램[C++ Qt 파일 삭제 프로그램]


Delete 함수 맨 아래에선 time.daysTo(QDateTime::currentDateTime()) 함수를 이용해 파일이 생성된 날짜를 확인하여 삭제할 것인지 판단한다. 전체 Qt 프로그래밍 소스 자체는 크게 복잡하지 않다. 소스를 한 줄씩 따라 읽어가다 보면 자연스레 이해될 정도로 단순한 프로그램이다.


Qt QTimer 파일 삭제[C++ Qt 파일 삭제 프로그램]


혹시라도, 이 샘플 프로젝트를 이용하고 싶어 하루를 기다리는 일은 없도록 하라. 탐색기를 뒤져 만들어진 지 오래된 작고 작은 파일을 하나 복사해 사용하면 된다. 복사된 파일은 복사 일자를 오늘로 설정하지 실제 만들어진 일자를 오늘로 설정하진 않는다.


단, 아래 main.cpp 파일의 코드처럼, set_file_dir() 함수에 경로는 넣어주자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <QCoreApplication>
 
#include "deletor.h"
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    Deletor deletor_;
 
    deletor_.set_file_dir("C:/test");
 
    return a.exec();
}
cs


예전에 MFC를 사용할 땐, 이와 비슷한 기능을 구현하려고 참 많은 소스를 만들었었는데 Qt에선 아주 단순하다. 확실히 MFC는 특별한 경우가 아니라면 안 쓰는 게 정답이다. MFC는 생산성이 너무 떨어진다.


[Qt 프로그래밍] 자동 파일 삭제 프로그램 (C++)

댓글