IDL/Programming

FILE_INFO 함수의 활용법

이상우_IDL 2022. 3. 2. 11:50
728x90

IDL에서는 파일들에 대한 접근(File Access)을 위한 여러가지 기능들이 내장되어 있는데, 이러한 기능들은 그 이름이 주로 "FILE_"이라는 문구로 시작합니다. 그 중에서 제가 예전에 FILE_SEARCH 함수에 관해서는 관련 게시물을 통하여 자세히 소개한 바 있습니다. 오늘은 동일 카테고리의 기능들 중 FILE_INFO 함수에 관하여 알아보고자 합니다. 이 함수는 이름 그대로 어떤 파일에 대한 여러가지 정보들을 추출하여 돌려주는 역할을 합니다.

 

그러면 지금부터 이 FILE_INFO 함수에 관하여 예제와 함께 소개해보도록 하겠습니다. 설명을 위하여 제 PC 내에서 myfiles라는 폴더를 만들고 그 안에 여러 개의 파일들을 넣어보았습니다. 파일 브라우저를 이용하여 이 폴더 내의 파일들의 목록을 보면 다음과 같이 총 8개의 파일들이 존재합니다.

 

 

이 파일들의 묶음을 여기에 첨부하였으므로 필요하신 분들은 이 묶음을 받아서 압축을 풀어두시면 됩니다.

 

myfiles.zip
0.13MB

 

이제 IDL의 작업 폴더를 기준으로 myfiles라는 하위 폴더 내에 위와 같이 8개의 파일들이 존재하는 상태에서 특정한 파일 하나를 지목하고 FILE_INFO 함수를 이용하여 이 파일에 대한 정보들을 추출해봅시다. 이 작업은 굳이 프로그램을 따로 작성하지는 않고 그냥 커맨드 입력창의 IDL 프롬프트에서 한 줄씩 실행해봐도 될 것 같으므로 다음과 같이 해봅시다.

 

IDL> file = 'myfiles/20220223_ace_mag_1m.txt'
IDL> info = FILE_INFO(file)

 

이와 같이 먼저 대상 파일의 이름 및 폴더 경로를 문자 변수로 정의하고 이를 FILE_INFO 함수에 투입하여 그 결과를 info라는 이름의 항목으로 얻었습니다. 그러면 이 info라는 결과물의 세부 내용을 확인해보기 위하여 다음과 같이 HELP 명령을 사용해봅시다. 그러면 아마 여러 줄에 걸쳐서 정보들이 출력될 것입니다. 실제로 해보면 다음과 같습니다.

 

IDL> HELP, info
** Structure FILE_INFO, 21 tags, length=72, data length=67:
   NAME            STRING    'myfiles/20220223_ace_mag_1m.txt'
   EXISTS          BOOLEAN   true (1)
   READ            BOOLEAN   true (1)
   WRITE           BOOLEAN   true (1)
   EXECUTE         BOOLEAN   false (0)
   REGULAR         BOOLEAN   true (1)
   DIRECTORY       BOOLEAN   false (0)
   BLOCK_SPECIAL   BOOLEAN   false (0)
   CHARACTER_SPECIAL
                   BOOLEAN   false (0)
   NAMED_PIPE      BOOLEAN   false (0)
   SETUID          BOOLEAN   false (0)
   SETGID          BOOLEAN   false (0)
   SOCKET          BOOLEAN   false (0)
   STICKY_BIT      BOOLEAN   false (0)
   SYMLINK         BOOLEAN   false (0)
   DANGLING_SYMLINK
                   BOOLEAN   false (0)
   MODE            LONG               420
   ATIME           LONG64                1645774054
   CTIME           LONG64                1645772029
   MTIME           LONG64                1645771886
   SIZE            LONG64                    124728

 

일단 가장 먼저 유념해야 할 것은 FILE_INFO 함수가 돌려주는 결과물은 구조체(Structure)의 형태라는 것입니다. 위의 내용을 보면 우리가 돌려받은 info라는 구조체는 총 21개의 세부항목들로 구성되어 있음을 알 수 있습니다. 물론 21개의 항목들이 다 필요하지는 않기 때문에 몇몇 중요하고 관심가는 항목들만 골라서 보는 것이 좋습니다. 각 항목의 명칭은 맨 왼쪽 컬럼에 표시되어 있는데 먼저 NAME이란 항목부터 따로 출력해봅시다. 구조체의 세부 항목을 지목할 때에는 dot 기호를 사용합니다.

 

IDL> PRINT, info.NAME
myfiles/20220223_ace_mag_1m.txt

 

이 항목은 말 그대로 대상 파일의 이름이 됩니다. 이번에는 EXISTS라는 항목을 출력해봅시다.

 

IDL> PRINT, info.EXISTS
   1

 

이 항목은 그 명칭에서 짐작할 수 있듯이 대상 파일의 존재 여부를 1 또는 0으로 나타냅니다. 값이 1이면 IDL이 그 파일의 존재를 인지하고 있다는 의미입니다. 반대로 0이면 IDL이 그 파일의 존재를 인지하지 못하고 있다는 의미이며 그 원인은 둘 중 하나입니다. 그 파일이 실제로 존재하지 않거나 아니면 파일 자체는 존재하는데 폴더 경로를 엉뚱하게 명시한 경우일 것입니다. 따라서 특정한 파일을 대상으로 한 작업을 프로그래밍할 때 그 파일의 존재 여부를 먼저 확인하는 것이 필요할 경우에는 이와 같이 FILE_INFO 함수를 사용하여 확인하는 것이 필요할 수도 있습니다. 이번에는 SIZE라는 항목을 출력해봅시다.

 

IDL> PRINT, info.SIZE
                124728

 

이 항목은 말 그대로 대상 파일의 크기(Size)를 알려주는데 그 단위는 바이트(Byte)입니다. 따라서 위의 경우는 124.728 KB를 뜻합니다. 그리고 이번에는 READ, WRITE 항목들을 출력해봅시다.

 

IDL> PRINT, info.READ, info.WRITE
   1   1

 

이 항목들은 그 파일의 Readable, Writable 여부 즉 유저에 의한 파일의 읽기와 쓰기가 가능한가 여부를 알려줍니다. 그리고 이번에는 DIRECTORY라는 항목을 출력해봅시다.

 

IDL> PRINT, info.DIRECTORY
   0

 

이 항목은 대상이 디렉토리(또는 폴더)인가 아닌가 여부를 1 또는 0의 값으로 알려줍니다. 어차피 앞서 file이란 변수에 대해서는 다음과 같이 단일 파일을 명시했었기 때문에 그 값은 0으로 출력되었습니다. 즉 그냥 하나의 파일일 뿐 디렉토리는 아니란 얘기입니다.

 

IDL> file = 'myfiles/20220223_ace_mag_1m.txt'

 

그런데 다음과 같이 file이란 변수를 다음과 같이 그냥 'myfiles'로 정의한 후에 다시 FILE_INFO로 파일 정보를 얻고 DIRECTORY 항목을 출력해봅시다.

 

IDL> file = 'myfiles'
IDL> info = FILE_INFO(file)
IDL> PRINT, info.DIRECTORY
   1

 

그러면 이와 같이 1이란 값이 출력됩니다. 즉 'myfiles'는 하나의 디렉토리로 인지되었다는 의미입니다. 따라서 DIRECTORY라는 항목을 확인함으로써 그 대상이 그냥 하나의 파일인지 아니면 디렉토리에 해당되는지를 구분할 수 있습니다.

 

FILE_INFO 함수를 이용하여 얻을 수 있는 정보들은 그 외에도 여러가지가 있겠지만, 여기서는 우리가 많이 사용할만한 것들만 골라서 소개해보았습니다. 그리고 제가 예전에 소개했던 FILE_SEARCH 함수와 FILE_INFO 함수를 함께 이용하면 폴더 내에 존재하는 모든 파일들에 대한 정보를 한꺼번에 얻을 수도 있을 것입니다. 예를 들면 다음과 같습니다.

 

IDL> files = FILE_SEARCH('myfiles/*', COUNT=n)
IDL> infos = FILE_INFO(files)

 

이와 같이 FILE_SEARCH 함수를 이용하여 myfiles 폴더 내에 있는 모든 파일들에 대한 목록 정보를 files라는 이름으로 가져온 다음 이를 바로 FILE_INFO 함수에 투입하면 됩니다. 그러면 myfiles 폴더 내의 모든 파일들에 대한 각종 정보들을 한꺼번에 얻을 수가 있는데, 예를 들어 파일 이름들만 출력해보려면 다음과 같이 반복형 구문을 사용하여 NAME 항목들을 순차적으로 출력하면 됩니다.

 

IDL> FOR j = 0, n-1 DO PRINT, infos[j].NAME
myfiles/20220218_ace_mag_1m.txt
myfiles/20220219_ace_mag_1m.txt
myfiles/20220220_ace_mag_1m.txt
myfiles/20220221_ace_mag_1m.txt
myfiles/20220222_ace_mag_1m.txt
myfiles/20220223_ace_mag_1m.txt
myfiles/20220224_ace_mag_1m.txt
myfiles/20220225_ace_mag_1m.txt

 

그리고 EXISTS 항목들을 출력해보면 다음과 같습니다. 당연히 모두 존재하는 파일들이므로 그 값은 1입니다.

 

IDL> FOR j = 0, n-1 DO PRINT, infos[j].EXISTS
   1
   1
   1
   1
   1
   1
   1
   1

 

그리고 SIZE 항목들을 출력해보면 다음과 같습니다.

 

IDL> FOR j = 0, n-1 DO PRINT, infos[j].SIZE
                124728
                124728
                124728
                124728
                124728
                124728
                124728
                 31848

 

이를 보면 맨 마지막인 20220225 파일만 크기가 작은 것을 확인할 수 있습니다. 이 파일만 크기가 작은 이유는 제가 이 파일을 받았던 시점에는 파일 내용이 다 업데이트된 상태가 아니었기 때문입니다. 어쨌든 이와 같이 FILE_SEARCH 및 FILE_INFO 함수를 이용하면 특정한 디렉토리 내에 있는 파일들에 대한 각종 정보를 한꺼번에 얻을 수 있으며 이러한 정보들을 프로그램 내에서 다양하게 활용할 수 있다는 점을 잘 염두에 두시기 바랍니다.

LIST