자기 자리에서 개인용 매크로를 사용할 때는 지금 상태에 대해 개발자가 100% 알고 있습니다.
그래서 큰 실수가 일어나지 않지만 같은 파일에 여러가지 프로토콜이 연결되면 복잡해지기 시작합니다.
특히 사용자가 직접 접근해서 수정하는 상황에서는 예상할 수 있는 일들이 너무 많아집니다.
그런 때 사용하는 파일의 현재 상태를 알아오는 FileExist()와 그외 명령어를 몇개 정리하겠습니다.
1. FileExist()
① FileExist의 의미와 매개변수
AttributeString := FileExist(FilePattern) :파일이나 경로명인 "FilePattern"이 있는지를 확인하고 속성을 불러와 변수 " AttributeString"에 입력합니다.
FilePattern : 파일명이나 경로의 이름입니다. 전체 경로를 입력하지 않으면 지금 선택되어 있는 %A_WorkingDir%에 저장됩니다. 보통의 경우에는 %A_WorkingDir%은 메크로 실행파일이 있는 폴더입니다.
반환값(AttributeString) : 한문자로 된 속성값이 반환됩니다. 만일 파일/경로가 없는 경우에는 빈문자가 반환됩니다. 문자 "False"가 아니라 빈문자가 되어 "False" 상태로 간주되는 것입니다. 사용하려면 논리 연산자나 if 같은 명령어와 조합해야 합니다.
R = READONLY(읽기 전용) : 파일의 속성에서 읽기 전용으로 되어 있는 경우입니다.
A = ARCHIVE(보관) : 파일에 저장되 있는 경우로 거의 대부분 속성을 가지고 있습니다.
S = SYSTEM(시스템) : 시스템 파일을 의미하고 "windows"등 설정폴더에 있는 .dat 파일등이 해당됩니다.
H = HIDDEN(감춤) : 숨김 속성을 가지고 있는 폴더입니다.
N = NORMAL(정상)
D = DIRECTORY(디렉토리) : 파일이 아닌 경로명일 때 사용됩니다.
O = OFFLINE(오프라인)
C = COMPRESSED(압축) : 압축파일인데 window가 압축한 zip 파일은 해당하지 않습니다.
T = TEMPORARY(임시)
X : 아무 속성이 없을 때
여러 개의 속성이 해당할 때는 여러단어를 반환합니다. RAH : 읽기전용의 숨겨진 파일
사용자가 파일에 임의로 변경한 내용이 아닌 파일의 속성 자체가 변해야 합니다.
③ 사용예시
^F3:: ;예시 1번 Windows 폴더의 시스템 파일입니다.
testnm := FileExist("C:\Windows\bootstat.dat")
msgbox %testnm%
return
^F4:: ;예시 2번
testnm := FileExist("abcd.exe")
if !testnm
{
msgbox "파일이 존재하지 않습니다."
}
return
사용결과 예시 1번의 경우 AS(보관파일, 시스템 파일)이 반환되고, 예시 2번은 존재하지 않는다는 매시지가 출력됩니다.
Filename : 크기를 읽어오고 싶은 파일의 이름입니다. 경로명을 입력하지 않으면 %A_WorkingDir%(현재폴더)에서 파일명을 찾습니다. 아예 입력하지 않으면 %A_WorkingDir% 가장 앞의 파일을 가지고 옵니다.
Units : 출력을 하는 단위입니다. 입력하지 않으면 Byte 단위로 가지고 옵니다. K = 킬로바이트, M = 메가바이트입니다.
경로명을 입력할 경우 순수하게 경로의 크기인 0을 불러옵니다.
경로안에 접근하여 모든 파일의 합을 구하도록 해야합니다.
사용 예제는 심플합니다.
^F3:: ;
FileGetSize testnm, 예제 24.zip, k
msgbox %testnm%
return
3. FileGetTime / FileSetTime
파일에는 기록되고 읽은 시간 정보가 있습니다.
시간정보를 읽어오는 FileGetTime과 다시 쓰는 FileSetTime입니다.
Windows에서는 파일에 속성에 확인할 수 있습니다.
FileGetTime, OutputVar , [Filename], [WhichTime] : 파일이나 경로의 정보를 불러옵니다.
OutputVar : 변수의 이름입니다. 여기에 결과가 입력이 되는데 YYYYMMDDHHMIMSS로 입력되며 형식은 FileSetTime에서 변경할 수 있습니다. 운영체계에서 사용하는 시간을 불러옴으로 보통은 현지시간입니다.
Filename : 시간을 읽어오고 싶은 파일의 이름입니다. 경로명을 입력하지 않으면 %A_WorkingDir%(현재폴더)에서 파일명을 찾습니다. 아예 입력하지 않으면 %A_WorkingDir% 가장 앞의 파일을 가지고 옵니다.
WhichTime : 어떤 시간을 가지고 올지 결정하고 비어있으면 M입니다. M = 수정한 날짜/시간 C = 만들어진 날짜/시간 A = 엑세스한 날짜/시간
설명이 단순한 만큼 사용하는 예시도 간단합니다.
예시) FileGetTime, TestNm, 예제.txt, C
불러오는 파일이 있으니 쓸 수도 있습니다.
쓰게되면 원래 시간에 관한 정보가 없어짐으로 보통 특수목적으로 접근하여 자주사용하지는 않습니다.
FileSetTime , [YYYYMMDDHH24MISS], [FilePattern], [WhichTime], [OperateOnFolders], [Recurse] :파일이나 경로명의 날짜시간 정보를 변경합니다. 추천할 수는 없지만 매개변수 전체를 입력하지 않아도 동작할 수 있습니다.
YYYYMMDDHH24MISS : 시간을 입력할 수 있습니다. 시간 형식에 FileSetTime, YYYY.MM.DD 이라고 입력하는 방식이 추천됩니다. 비어 있을 경우 OS가 알려주는 지금시간으로 입력됩니다. 참고로 1601년 미만은 지원하지 않는다고 합니다.
FilePattern : 파일명이나 경로명을 입력합니다. 경로명을 입력하지 않으면 %A_WorkingDir%(현재폴더)에서 파일명을 찾습니다. 이 자리를 비어두면 %A_WorkingDir% 가장 앞의 파일을 가지고 옵니다.
WhichTime : 어떤 시간을 가지고 올지 결정하고 비어있으면 M입니다. M = 수정한 날짜/시간 C = 만들어진 날짜/시간 A = 엑세스한 날짜/시간
OperateOnFolders : 동작방식을 결정합니다. 입력하지 않으면 0으로 처리됩니다. 0 : 지정한 파일만 시간을 변경합니다.(디폴트) 1 : 와일드 카드에 포함되는 모든 파일과 폴더가 처리됩니다. 2 : 파일이 있는 지정 경로(폴더)의 시간만 변경합니다.
Recurse : 0으로 입력할 경우 입력한 경로(폴더)에만 해당하여 작동합니다. 1을 입력하면 하위폴더까지 모두다 변경합니다. 입력하지 않으면 디폴트는 0으로 되어 있습니다.
이 명령은 와일드 카드를 쓸 수 있는데 C:\내 문서\*.txt의 경우 와일드카드 *, 경로내의 모든 txt 파일로 인식합니다.
파일과 폴더의 경로명이 259문자를 뛰면 동작하지 않습니다. 그 파일을 무시하고 다음으로 넘어갑니다.
예제) FileSetTime, 20141105, C:\Temp\*.*, M : Temp 폴더의 모든 파일의 수정한 날짜를 2014년 11월 05일로 변경합니다. 시간은 입력하지 않아서 00시 00분 00초로 입력됩니다.
다른 언어를 사용한 프로그램도 그렇겠지만, 사용하다보면 따로 기록해야 하거나 그 기록을 불러와야 합니다.
주로 메모장(txt, ini)등을 사용하는 편이 쉽기도 하고 필요한 메모리도 가벼워 선호하는 방식입니다.
외부 파일에 접근하여 내용을 잃거나 쓰는 FileOpen 명령어에 대해서 알아보겠습니다.
1. Fileopen의 뜻과 접근함수
FileOpen(Filename, Flags , [Encoding]) :파일을 열어서 특정내용을 읽거나 파일에 새 내용을 기록하는 기능을 지원하는 명령어입니다.
Filename : 접근할 파일의 경로 + 이름입니다. 이름만 입력할 경우 지금 메크로가 실행되고 있는 경로인 "A_WorkingDir"에서 파일을 찾습니다.
Flags : 파일에 접근하는 방식을 결정합니다. 읽을 때는 "r"(표준입력)을 쓸때는 "w"를 사용합니다.
Encoding :파일에 텍스트 입출력에 사용될 코드 페이지입니다.(UTF-8, UTF-16), 입력하지 않으면 A_FileEncoding의 값이 입력되는데 보통 따로 조작하지 않아도 기본 앤코딩 값이 입려되어 있습니다.
"변수명" := FileOpen(Filename, Flags , [Encoding]) 형식으로 사용합니다. 한번 파일을 오픈하여 사용하기 위해 메소스를 호출할 때는 변수명으로 사용합니다.
접근 모드가 다양하게 지원됩니다.
접근하는 방식은 Flag에 무엇을 입력하냐에 따라 달라집니다.
각 모드에 대해서 알아보겠습니다. 괄호 안()은 십진수와 16진수 표기법입니다.
<<접근 모드>>
r(0, 0x0) : Read를 의미하며 읽기 기능들을 사용할 수 있습니다. 파일이 해당 경로에 없으면 실패합니다.
w(1, 0x1) : Write를 의미하며 쓰기 기능들을 사용할 수 있습니다. 파일이 없으면 새로 생성하며, 있을 경우 덮어쓰기 함으로 주의가 필요합니다.
a(2, 0x2) : Append를 의미하며 쓰기 기능들을 사용할 수 있습니다. 파일이 없으면 새로 생성하고 있으면 기존 파일의 끝으로 이동합니다.
rw(3 0x3) : Read / Write를 의미하며 쓰고 읽는 기능들을 사용할 수 있습니다. 파일이 없으면 새로 생성하고 파일이 있는 경우 내용을 덮어 쓰니 주의가 필요합니다.
h : Filename이 객체안에 사용하는 핸들임을 나타내어 길이나 상태를 점검할 수 없고 따라서 Close가 동작하지 않습니다. 이동하거나 지워질 수 있는 파일에는 사용이 안할 것이 권장됩니다.
2. File 형식에 사용할 수 있는 매소드
예시) ex_file = fileopen("C:\dou", "r)
이럴때 변수명 ex_file은 파일객체가 되며, FlieOpen로 호출된 파일객체는 쓰고 읽기 위한 인터페이스가 제공됩니다.
인터페이스를 사용하면 문서작업을 직접할 때와 마찬가지로 파일을 쓰고 읽을 때 포인터가 돌아다니게 됩니다.
파일을 오픈하면 파일의 가장 처음에 포인터가 있습니다.
기능들을 한번에 여러개 사용할 경우에는 포인터가 옮겨진 위치를 유의하면서 사용해야 합니다.
<<메소드>>
Read : 지금 포인터 위치에 뒤에서 부터 파일에 내용을 읽습니다. 다 읽고나서 그 뒤문자로 포인터가 이동하는데 이 경우는 맨 마지막이 됩니다.
ReadLine : 지금 포인터 위에서 뒤에 있는 문자열을 한줄 읽어입니다. 사용한 후에는 포인터가 다음으로 합니다.
Write : 지금 포인터 위치에서 내용을 쓰고 포인터는 내용의 뒤로 이동합니다.
WriteLine : 지금 포인터 위치 다음 줄에 내용을 쓰고 포인터는 내용의 뒤로 이동합니다
Seek : 포인터가 해당 숫자 만큼 이동합니다.
320x100
3. 사용 예시
바탕화면에 있는 LIST.txt의 내용을 읽어 오는 예시를 작성하겠습니다.
^F3:: ;Ctrl + F3 키를 단축키로 설정했습니다.
file := FileOpen("C:\Users\jong\Desktop\LIST.txt", "r") ;경로의 파일을 읽기로 열었습니다.
newstr := file.Readline() ; 첫 줄의 내용을 newstr1 에 입력합니다.
newstr2 := file.Read() ; 그 뒤에 내용을 newstr 에 입력합니다.
msgbox, %newstr% `n`n %newstr2%
file.close ;파일을 닫았습니다.