FILE_SAME 함수와 FILE_COPY, /ALLOW_SAME

오랜만에 구글의 IDL-PVWAVE 토론방에 들어가 보니, 생각해 볼만한 질문과 의미있는 답변 두 개가 올라와서 소개해 드립니다.

토론의 원문은 이곳에서 보실 수 있습니다.

IDL 문자열 상으로는 다른 내용인데, 운영체제가 인식하기에는 사실상 같은 파일인 상황입니다.

어떻게 작업을 하다보니, 또는 사용자의 완전한 실수로, 또는 코딩을 하다보니 버그로 발생할 수 있는 일입니다. IDL에서 문자열로만 따지면 분명 다른 문자열인데, 사실은 file1과 file2가 운영체제가 보기엔 같은 파일인 경우입니다. 그러다 보니, file_copy 명령이 보기에는, 같은 파일을 다시 같은 파일에 복사하라는 것으로 해석되고, ‘그건 못하겠습니다’ 라는 에러가 발생하는 것이죠.

글쎄요, 이런 경우가 흔한 경우인지는 모르겠습니다. 사실은 원천적으로 이런 일이 발생하지 않도록 피해가는 게 맞죠. 이런 상황이 현실에서 일어날 수도 있겠다고, 제가 생각한 경우는 다음과 같습니다(사실 위와 결국 같은 상황이기는 합니다).

Windows용 IDL에서는 디렉토리 구분자로 역슬래시(운영체제가 지원하는 방식)와 슬래시를 동시에 지원합니다. 바람직한 방법인지는 모르겠으나, 둘 다 지원하는 것은 사실입니다. 위 예시에서 보듯이 역슬래시를 슬래시로 대체해도 같은 파일이라고 인식하는군요.  그러니 같은 파일끼리 복사 못하겠다는 에러가 나오겠죠. 두 가지를 다 허용하다 보면, 위와 같은 문제가 발생할 수도 있겠다는 생각은 듭니다.

토론에서 질문의 요체는, 이것이 같은 파일인지 확인할 방법이 있느냐는 것이었습니다. 프로그램이 돌다가 이런 문제로 멈춰 버리면 안되는 상황이겠죠. 일반적인 문자열 비교로는 같은 파일인지 확인할 수 없으니까 나온 질문입니다.

위와 같이 단순 문자열 비교로는 문제를 해결할 수 없습니다.

원문 토론에서의 첫번째 답변은, 이 문제에 대한 직접적인 접근 방법인데,  file_info() 함수를 사용하는 것입니다.

이런 경우라면, 두 파일이 같다고 판단할 방법이 있겠네요.

하지만, 이 방법이 안전하진 못해요. 리눅스에서 테스트 해 보니, 아래와 같은 문제가 있더군요.

file_info 함수로는, 현재디렉토리의 test1.txt와 전체 경로를 지정해 준 test1.txt가 같은 파일이라는 것을 알아낼 수 없습니다. 그러나 사실 같은 파일이기에 file_copy에서는 에러가 나는 거죠.  그래서, 이런 상황에 대응하라고 제공되는 함수 FILE_SAME() 이 있습니다. 제가 보기에는 이런 상황 자체가 흔치 않아서 우리에게 생소한 함수인 것 같습니다. 그렇지만 IDL 5.6부터 지원되는 기능이었다고 하니, 15년 이상 오래 된 함수입니다. 저도 IDL 교육 프로그램을 진행하다 보니 있다고 어렴풋이 기억하고 있는 함수지 실제로 써 본 일은 없는 것 같습니다.

자, FILE_SAME() 함수를 이용하면, 질문에 대한 직접적인 해결책은 마련된다고 생각합니다.

그런데, 근본적으로 생각해 보면, 그냥 파일 복사를 허용하면 되지 않겠습니까? 어차피 같은 파일끼리 복사해 봐야 큰 문제가 발생하지도 않을 거고, 결국 그놈이 그놈일 테니까요. file_copy에서 같은 파일 이름으로 복사한다고 할 때, 에러만 안내면 문제될 게 없지 않을까요?

이 방식으로 접근하는 방법이 원문에서 두번째 답변인데, FILE_COPY에 /ALLOW_SAME 키워드를 쓰는 것입니다. ALLOW_SAME 키워드에 대한 도움말의 설명을 보면, ‘원래 이딴 짓을 하는 것은 에러로 간주 되어야 하나, 이 키워드를 쓴다면, 자기 자신에게 다시 복사한다고 할 때, 실제로는 복사를 수행하지는 않지만, 그냥 성공적으로 FILE_COPY를 수행한 것으로 간주한다’는 것입니다. 같은 파일이니까 실제 복사할 필요는 없어서 아무일도 안하고, 대신 에러는 안내고 그냥 눈감아 주고 넘어가도록 한다는 얘기입니다. 오호… 어쩌면 이런 상황에 대한 가장 적절한 대응책일 수도 있겠습니다. 일부러, “너, 삽질하는 거야”라고 밝히는 것이 목적이 아니라면, /ALLOW_SAME 키워드를 사용하면 문제가 해결되겠네요. 게다가 실제로 복사를 수행하지도 않는다니, 파일이 엄청 큰 사이즈여도 비효율적인 덮어쓰기를 하진 않겠네요.

말이 나온 김에, FILE_COPY의 몇가지 유용한 키워드를 보아 두는 게 좋겠습니다.

  • ALLOW_SAME : 같은 이름의 파일로 복사하라는 부당한 명령이라도 에러를 내지 않고 참고 넘어갑니다.
  • OVERWRITE : 말 그대로 덮어쓰기를 합니다. 이미 같은 이름의 파일이 존재하는 경우는 FILE_COPY가 흔히 에러를 내는 상황이기도 합니다. 주의해 사용해야 겠지만, 유용합니다.
  • RECURSIVE : 디렉토리와 하위 디렉토리를 모두 복사할 때 사용합니다.

이런 키워드를 적절히 활용한다면, IF 문으로 상황 검증을 하거나, 반복문으로 다단계 폴더를 복사하는 수고를 덜어낼 수 있을 것입니다. 무엇보다 코드 읽기가 쉬워질 것입니다. 키워드의 의미가 명확하기 때문이죠.

근본적으로는, 이런 상황이 벌어지지 않도록 하는게 옳겠습니다만, FILE_SAME() 함수의 존재라든지, FILE_COPY 그리고 FILE을 다루는 많은 루틴들의 키워드 중 수고를 크게 덜어줄 수 있는 몇가지 키워드들을 한번 정도 검토하는 기회가 되었다면 좋겠습니다.

참고

널리 사용될 튼튼한 프로그램을 만들고자 한다면, 슬래시와 역슬래시를 직접 쓰는 것 보다, 운영체제에 따른 디렉토리 구분자를 리턴하는 함수 PATH_SEP() 을 사용하는 것이 좋습니다.