파이썬 파일 변경 실시간 감지

WRITTEN BY

baealex

소비적인 일보단 생산적인 일을 추구하며, 좋아하는 일을 잘하고 싶어합니다 :D
Sign in to view email

자바 스프링 프로젝트를 리눅스에서 진행하고자 하였다. 전제 조건은 이클립스 혹은 STS를 전혀 활용하지 않는 것이다. 대충 스프링을 빌드하고 실행시키는 방법에 대해서 알았지만 이클립스처럼 편하지 않았다. 이를 자동화하기 위해서 처음에는 CRON 탭을 이용하여 매 분마다 지속적인 빌드를 실시했지만 아래와 같은 단점이 있다.

  • 매 분 10초 동안은 404를 보거나 느린 반응속도를 보인다.
  • 작업중이지 않은 순간에도 빌드가 발생한다.

그래서 Dropbox처럼 파일의 변경을 감지하고 변경이 일어난 경우에만 빌드를 실시하고자 하였다.


1차 접근

처음엔 당연히 딕셔너리를 활용해서 파일 변경을 탐지하고자 하였다. 많은 데이터를 해쉬를 이용해서 빠르게 탐지하고 비교할 수 있을테니 말이다.

import os
import time
import copy

files_watch = dict()

while True:
    is_changed = False
    for (path, dir, files) in os.walk(os.path.abspath('.')):
        for filename in files:
            filesize = os.stat(path + '/' + filename).st_size
            if not filename in files_watch:
                files_watch[filename] = filesize:
                is_changed = True
            if files_watch[filename] != filesize:
                files_watch[filename] = filesize
                is_changed = True

    if is_changed:
        # Commend

    time.sleep(10)

위와같이 코드를 구성했는데 이상하게 파일의 아무 변화가 없음에도 파일이 변화되었다는 알림이 발생했다. 처음에는 도무지 감을 못잡다가 아무래도 해쉬 충돌로 인해서 잘못된 값이 저장되는 것 같다는 판단을 내렸다. 지금 글을 쓰면서 생각났는데 해쉬 충돌이 아니라 키 값을 파일 이름으로 설정해서 중복되는 파일 이름으로 인한 문제였던 것 같다...


2차 접근

여하지간 위 방법이 실패한 후로 다른 방법을 생각했다. 리스트안에 쭉 넣고 Set으로 변경시켜서 이전 Set과 차집합이 남아있다면 파일이 변경된거라 생각했다.

import os
import time
import copy

files_watch = list()
temp_files_watch = list()

while True:
    is_changed = False
    for (path, dir, files) in os.walk(os.path.abspath('.')):
        for filename in files:
            files_watch.append(os.stat(path + '/' + filename).st_size)

    if len(set(files_watch) - set(temp_files_watch)) != 0:
        is_changed = True

    if is_changed:
        # Commend

    temp_files_watch = copy.deepcopy(files_watch)
    time.sleep(10)

아주 단순하고 간단한 방법이다. 생각대로 정말 잘된다. 하지만 위 코드의 경우에는 저런 많은 값을 리스트에 추가하면 성능 저하가 심히 걱정된다. 첫번째 방법을 개선하는게 좋을 듯

작성된 댓글이 없습니다!

로그인된 사용자만 댓글을 작성할 수 있습니다.

이 작성자가 게시한 다른 글