GetTemporaryFileName() 으로 생성된 파일은 왜 자동으로 지워지지 않는가?

GetTemporaryFileName()은 ENVI 프로그래밍 예제에서 매우 많이 등장하는 메쏘드입니다. 그 이름이 주는 느낌 때문에, 임시파일 이름을 받아오는 기능이라고 생각하고, 임시파일이니까, ENVI를 닫으면 자동으로 지워지는 파일이 될 거라고 예상하기 쉽습니다. 오해입니다. 자동으로 지워지는 파일과 아무런 연관이 없습니다.

이 글의 제목이 질문인데요, 결론부터 말씀드리면, GetTemporaryFileName() 메쏘드는, Temporary Directory 에 쓸 파일의 이름을 자동으로 받아오는 것이지, ENVI가 관리하는 임시 파일을 의미하는 것이 아닙니다. ENVI가 관리해 주는 임시파일이 아니니까, ENVI를 종료해도 자동으로 지워지지 않습니다. 이는 도움말에도 설명되어 있는 내용입니다만, ENVI Programming 도움말에서 워낙 흔하게 사용하다 보니, 실체를 파악하지 않은 상태에서 일단 사용부터 하고, 나중에 “이거 왜 이러지?”하는 의문을 가지게 되는 것 같습니다.

일단 ENVI의 Temporay Directory에 대해 파악하셔야 합니다. ENVI 같이 큰 영상을 다루다 보면, 또는 여러 단계의 프로세스를 거쳐야 하기 때문에, 연산 중간 중간에 기록이 필요하게 됩니다.  이러한 내용들을 기록하기 위해서 Temporary Directory가 필요하게 되고, 이는 비단 ENVI 뿐 아니라 다양한 어플리케이션이 공통적으로 취하는 방법입니다. ENVI Temporary Directory는 ENVI 메뉴의 File > Preferences 메뉴에서 확인할 수 있습니다.

ENVI 5.4의 Preferences 설정

위에 보시는 설정은 디폴트 설정 그대로인데, 저는 Temporary Directory 만큼은 다른 곳으로 따로 설정하는 것을 권장합니다. 이에 대한 내용은 다른 글에서 한번 소개한 바도 있습니다.

ENVI 디렉토리 Preference 설정

위 글에서 Temporary Directory를 따로 잡아주자는 이유는 두가지입니다. 첫째는 독립된 HDD가 있을 경우 하드디스크를 나누어 돌려서 퍼포먼스를 높이기 위해서이며(HDD가 하나 뿐이다… 그러면 첫번째 이유는 의미 없습니다), 둘 째는 ENVI의 임시저장 파일들을 마음 편하게 관리할 수 있기 위함입니다. Temporary Directory가 용량이 너무 커져 있으면, 언제고 시원하게 날려 버리자는 목적입니다. 퍼포먼스를 높이는 것은 오늘 글의 주제와는 무관합니다. 두 번째 이유가 중요한데, 앞의 글에서 보듯이 설정 방법은 뭐 절대로 어렵거나 귀찮을 게 없고, 한번만 하면 되는 것입니다.

다시, 이 글의 주제로 돌아옵니다. 간단한 테스트 스크립트를 실행해 보겠습니다.

기본 설치시에 샘플데이터로 제공되는 qb_boulder_pan  영상을 ENVI 영역으로 읽어왔습니다. 이제, 간단한 테스트로, 영상의 공간적인 subset을 만들어, 이를 저장하려고 합니다. 이 때, 저장할 공간은 Temporary Directory, 파일 이름은 ENVI가 자동으로 중복되지 않는 이름을 만들어 주는 메쏘드 GetTemporaryFilename() 을 이용할 수 있습니다.

저는 ENVI Temporary Directory를 접근하기 편한 바탕화면에 만들어놓고 사용합니다. 제 경우는 위 예제에서 보듯이,  C:\Users\yi\Desktop\ENVITemp 죠. GetTemporaryFilename() 메쏘드는 이 폴더 안에, 중복되지 않는 파일 이름을 만들어 줍니다. (연월일요일 정보가 들어간데다가 시간정보등의 복잡한 숫자가 추가된, 그래서 업무적으로는 체계화되지 않은 이름입니다. 이 파일 이름이 가지는 단 하나의 목표는 중복방지입니다. 위에서 보이는 제가 받아온 파일이름과 여러분이 받아온 파일이름은 다를 것이고, 저 역시 다시 실행하면 다른 파일이름을 받아오게 됩니다). 이 파일 이름으로, 영상의 공간적 Subset을 만들어 저장하는 과정은 다음과 같습니다.

여기까지 실행되면 ENVI Temporary 폴더에 해당 이름의 영상이 저장됩니다.  코드상에서는 당연히 파일 이름이 어떻게 생성되는지 알 필요가 없습니다. target_file 이라는 변수만 가지고 핸들링하니까요. 화면상에는 아직 변화가 없는데, 만일 이 내용을 화면에 표출하고자 한다면,  다음과 같은 과정을 거칩니다.

위쪽 레이어(전체영상)의 투명도를 조정해서 아래쪽 레이어(subset)이 보이게 하였습니다

이제 ENVI를 닫아 보겠습니다.

그리고 Temporary Directory를 보면, 여전히 파일은 남아 있습니다. 이름만 Temporary 폴더, Temporary 파일일 뿐이지, 정식으로 저장된 파일이기 때문입니다. Export 메쏘드 입장에서는 target_file 에 저장된 내용이 임시파일이라는 고려 자체를 하지 않습니다. 다만 GetTemporaryFilename() 메쏘드가 ENVI 사용자라면 누구나 가지고 있는 Temporary 디렉토리에 연월일시 등을 반영한 고유한 파일 이름을 하나 생성하는 것 뿐이고, 그 이름으로 파일을 저장할 수 있는 거죠.

우리가 직접 만드는 ENVI 스크립트에서 임시적으로 저장할 필요가 있다면, GetTemporaryFilename() 함수는 매우 유용합니다. 어느 단계에서든, 심지어는 동시에 이 메쏘드를 돌리더라도, 중복되는 이름이 나오지는 않을테니까요. 마치 IDL의 /GET_LUN 키워드를 통해 고유한 번호를 IDL이 알아서 배정하는 것과 같습니다. 그리고 이 저장 과정이 프로세스상 분명히 임시적인 것이라면, 개발자가 작업 이후에 지우는 단계도 명시하면 됩니다. FILE_DELETE 같은 명령을 사용할 수 있으니까요.

그렇다면, 왜 IDL 도움말 예제에서는 GetTemporaryFilename() 함수를 이렇게 빈번하게 사용할까요?  첫째는, 누구나 똑같은 코드로 문제없이 예제를 실행하기 위해서는 이 방식이 안전합니다. 리눅스든, 맥이든, 윈도우든, 디폴트가 아닌 디렉토리에 설치를 했든간에, Temporary 디렉토리는 ENVI 사용자라면 누구나 가지고 있습니다. 그러므로, 예제 프로그램을 실행하면 누구든 건전하게 실행이 됩니다. 두번째는, 제 개인적인 생각입니다만, 이런 실습으로 생성된 파일은 나중에 시원하게 지워버릴 수 있도록 Temporary 폴더에 쓰는 것이 관리상 좋기 때문 아닐까 생각합니다.

요약하겠습니다.

  1. GetTemporaryFilename() 은 Temporary 폴더에 쓸 고유한 파일 이름을 하나 발급해 주는 것이지, ENVI 종료 후 자동으로 지워지는 그런 의미의 파일 이름을 주는 것은 아닙니다.
  2. 사용자가 작성하는 프로그램에서, 분명하게 임시 파일을 목적으로 생성하는 경우라면, 프로그램 종료 전에 파일을 삭제하는 명령을 실행하는 것이 바른 생활입니다.
  3. (권장) ENVI Temporary Directory는 디폴트 설정 그대로 쓰기 보다는 따로 관리하는 것이 좋습니다. 나중에 시원하게 날려버릴 수 있으니까요.