FileOpen() [AHK_L 42+]

Opens a file to read specific content from it and/or to write new content into it.

file := FileOpen(Filename, Flags , Encoding)

매개변수

Filename

열 파일의 경로. 절대 경로를 지정하지 않으면 A_WorkingDir에 있다고 간주됩니다.

[v1.1.17+]: 표준 입력/출력/에러 스트림을 열려면 별표를 (또는 별표 두 개를) 아래에 보여주는 바와 같이 지정하십시오:

FileOpen("*", "r")   ; 표준입력
FileOpen("*", "w")   ; 표준출력
FileOpen("**", "w")  ; 표준에러
Flags

[in AHK_L 54+] 원하는 접근 모드를 가리키는 문자 그리고 다음에 다른 옵션이 따라와 구성된 문자열 (선택적으로 사이에 스페이스 또는 탭); 또는 [ AHK_L 42+] 숫치 플래그의 조합 (합계). 지원되는 값들은 아래 테이블에 기술합니다.

Encoding

파일에 UTF-8 또는 UTF-16 바이트 순서 표식이 없을 때, 또는 h (핸들) 프래그가 사용될 때 텍스트 I/O에 사용할 코드 페이지입니다. 생략되면, A_FileEncoding의 현재 값이 사용됩니다.

Flags

접근 모드 (서로-배타적임)

Flag 십진수 값 십육진수 값 설명
r 0 0x0 Read: 파일이 존재하지 않으면 실패합니다.
w 1 0x1 Write: 새 파일을 생성합니다, 기존의 파일을 덮어쓰기 합니다.
a 2 0x2 Append: 파일이 존재하지 않으면 새 파일을 생성합니다, 그렇지 않으면 파일 포인터를 파일의 끝으로 이동합니다.
rw 3 0x3 Read/Write: 파일이 존재하지 않으면 새 파일을 생성합니다.
h     Filename이 객체 안에 싸 넣을 파일 핸들임을 나타냅니다. 공유 모드 플래그는 무시됩니다. 그리고 이 핸들이 가리키는 파일이나 스트림은 바이트 순서 표식이 점검되지 않습니다. 파일 핸들은 파일 객체가 파괴될 때 자동으로 잠기지 않습니다. 그리고 Close를 호출해 봐야 아무 효과도 없습니다. 주의 하십시오. Filename이 파이프나 통신 장치 같이 위치 지정이 안되는(nonseeking) 장치를 가리키는 핸들이면 Seek, Tell 그리고 Length를 사용하면 안 됩니다.

공유 모드 플래그

Flag 십진수 값 십육진수 값 설명
-rwd     읽기, 쓰기 그리고 지우기 접근을 위해 파일을 잠금니다. r, w 그리고 d을 조합해 사용해도 됩니다. -를 지정하면 -rwd를 지정한 것과 같습니다. 완전히 생략하면, 기본은 모든 접근을 공유하는 것입니다.
  0 0x0 Flags가 숫치이면, 공유 모드 플래그가 없을 경우 파일이 잠깁니다.
  256 0x100 read 접근을 공유합니다.
  512 0x200 write 접근을 공유합니다.
  1024 0x400 delete 접근을 공유합니다.

줄 끝(End of line (EOL)) 옵션

Flag 십진수 값 십육진수 값 설명
`n 4 0x4 읽을 때 `r`n`n으로 교체합니다. 그리고 쓸 때 `n`r`n으로 교체합니다.
`r 8 0x8 읽을 때 나홀로 `r`n으로 교체합니다.

반환 값

파일이 성공적으로 열리면, 반환 값은 파일 객체입니다.

함수가 실패하면, 반환 값은 0이고 [in AHK_L 54+] A_LastError는 에러 코드가 담깁니다.

함수가 성공했는지 점검하려면 if file 또는 IsObject(file)를 사용하십시오.

논평

UTF-8 또는 UTF-16 파일이 생성될 때, 바이트 순서 표식이 파일에 씌여집니다. 단, Encoding (또는 Encoding을 생략하면 A_FileEncoding)에 UTF-8-RAW 또는 UTF-16-RAW이 담겨 있는 경우는 예외입니다.

UTF-8 또는 UTF-16 바이트 순서 표식(byte order mark (BOM))을 담고 있는 파일이 읽기 접근을 위해 열릴 때, BOM은 파일 포인터를 그 다음으로 이동해서 출력으로부터 제외됩니다. 그러므로, File.Position은 파일을 열고 난후 즉시 3 또는 2를 보고합니다.

FileEncoding, 파일 객체, FileRead

예제

텍스트를 파일에 쓴다음 다시 메모리로 읽어 들입니다 (다음 DllCall-예제와 기능이 같습니다).

FileSelectFile, FileName, S16,, Create a new file:
if (FileName = "")
    return
file := FileOpen(FileName, "w")
if !IsObject(file)
{
    MsgBox Can't open "%FileName%" for writing.
    return
}
TestString := "This is a test string.`r`n"  ; 파일을 이런 식으로 쓸 때,  `n 말고 `r`n을 사용하여 새 줄을 시작하십시오.
file.Write(TestString)
file.Close()

; 파일에 썼으므로 이제 다시 그 내용을 메모리로 읽어 들입니다.
file := FileOpen(FileName, "r-d") ; 파일을 읽습니다 ("r"),  지우기 ("-d")만 빼고 모든 접근을 공유합니다.
if !IsObject(file)
{
    MsgBox Can't open "%FileName%" for reading.
    return
}
CharsToRead := StrLen(TestString)
TestString := file.Read(CharsToRead)
file.Close()
MsgBox The following string was read from the file: %TestString%

읽기 전용 모드로 스크립트를 엽니다. 그리고 그의 첫 줄을 읽습니다.

file := FileOpen(A_ScriptFullPath, "r")
MsgBox % file.ReadLine()

Demonstrates the usage of the standard input/output streams.

; 다음 데모를 보여주기 위해 콘솔 창을 엽니다:
DllCall("AllocConsole")
; 어플리케이션의 stdin/stdout 스트림을 새줄-변환 모드로 엽니다.
stdin  := FileOpen("*", "r `n")  ; [v1.1.17+] 필요
stdout := FileOpen("*", "w `n")
; 예전 버전에는 다음을 사용합니다:
;   stdin  := FileOpen(DllCall("GetStdHandle", "int", -10, "ptr"), "h `n")
;   stdout := FileOpen(DllCall("GetStdHandle", "int", -11, "ptr"), "h `n")
stdout.Write("Enter your query.`n\> ")
stdout.Read(0) ; 쓰기 버퍼를 비웁니다.
query := RTrim(stdin.ReadLine(), "`n")
stdout.WriteLine("Your query was '" query "'. Have a nice day.")
stdout.Read(0) ; 쓰기 버퍼를 비웁니다.
Sleep 5000