파일 닫기와 오류 처리
파일 핸들을 올바르게 닫고 pcall로 입출력 오류를 처리합니다.
파일 닫기와 오류 처리은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Lua Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
파일은 항상 닫기
io.open으로 연 모든 파일은 f:close()로 닫아야 합니다. 닫지 않은 파일은 파일 설명자를 누수시킵니다. Lua의 가비지 수집기가 결국 닫지만, 가비지 수집기가 실행되기 전에 OS의 파일 한도를 초과할 수 있습니다. 파일을 연 함수에서 항상 닫으십시오.
local function readFile(path)
local f, err = io.open(path, "r")
if not f then return nil, err end
local content = f:read("a")
f:close() -- always close
return content
end
local data, err = readFile("config.txt")
if not data then print("Error:", err) end입출력 안전성을 위한 pcall
예상하지 못한 오류(디스크 가득 참, 쓰기 도중 권한 거부 등)를 포착하려면 파일 작업을 pcall로 감싸십시오. 그러면 프로그램이 중단되지 않고 오류를 정상적으로 처리할 수 있습니다.
local function safeCopy(src, dst)
local ok, err = pcall(function()
local f = io.open(src, "rb")
if not f then error("Cannot open source: " .. src) end
local content = f:read("a")
f:close()
local g = io.open(dst, "wb")
if not g then error("Cannot open dest: " .. dst) end
g:write(content)
g:close()
end)
return ok, err
end
local ok, msg = safeCopy("input.txt", "output.txt")
if not ok then print("Failed:", msg) end쓰기 성공 여부 확인
디스크가 가득 찼거나 권한 문제가 있는 시스템에서는 io.open이 성공한 후에도 f:write()가 실패할 수 있습니다. 중요한 경로에서 쓰기 작업의 반환 값을 확인하십시오.
local f = io.open("important.txt", "w")
if not f then
print("Cannot create file")
return
end
local ok, err = f:write("critical data\n")
if not ok then
print("Write failed:", err)
f:close()
return
end
f:close()
print("Saved successfully")pcall을 사용한 finally 패턴
Lua에는 finally 블록이 없지만 pcall로 흉내 낼 수 있습니다. 위험한 코드를 pcall로 감싼 다음, pcall이 성공하거나 실패하여 반환된 후 오류를 다시 발생시키거나 처리하기 전에 정리 코드를 무조건 실행합니다.
local function withFile(path, mode, fn)
local f, err = io.open(path, mode)
if not f then return nil, err end
local ok, result = pcall(fn, f)
f:close() -- always close, even on error
if not ok then
return nil, result
end
return result
end
local content, err = withFile("data.txt", "r", function(f)
return f:read("a")
end)
print(content or err)io.open의 오류 메시지
io.open은 nil과 시스템 오류 메시지 및 오류 코드를 반환합니다. 메시지에는 경로와 OS 오류 원인("No such file", "Permission denied" 등)이 포함됩니다. 사용자에게 오류를 보고할 때는 항상 오류 메시지를 포함하십시오.
local paths = {"config.txt", "missing.txt", "/root/secret.txt"}
for _, path in ipairs(paths) do
local f, err, code = io.open(path, "r")
if f then
print(path, "-> ok, size:", f:seek("end"))
f:close()
else
print(path, "-> ERROR:", err, "(code "..tostring(code)..")")
end
end객체로서의 파일 핸들
Lua의 파일 핸들은 메서드를 가진 사용자 데이터입니다. 핸들이 가비지 수집되면 파일이 자동으로 닫힙니다. 하지만 적시에 닫히는 것을 가비지 수집기에 의존하지 말고 항상 명시적으로 닫으십시오. f:read()를 사용하면 파일이 닫혔는지 확인할 수 있으며, 닫힌 핸들에서는 오류가 발생합니다.
local f = io.open("test.txt", "w")
f:write("test\n")
-- Explicit close
f:close()
-- After close, operations fail
local ok, err = pcall(function()
f:read() -- attempt to use closed file
end)
print(ok, err) -- false [closed file]안전한 파일 처리 템플릿
안전한 파일 처리를 위한 재사용 가능한 템플릿은 오류를 확인하며 열고, pcall로 처리한 다음, 모든 경우에 파일을 닫는 것입니다. nil+메시지 규칙을 사용하여 결과와 오류를 일관되게 반환하십시오.
local function processFile(path, processor)
local f, err = io.open(path, "r")
if not f then return nil, "open failed: " .. err end
local ok, result = pcall(processor, f)
f:close()
if not ok then
return nil, "processing failed: " .. result
end
return result
end
local lineCount, err = processFile("data.txt", function(f)
local n = 0
for _ in f:lines() do n = n + 1 end
return n
end)
print(lineCount or err)os.remove 및 os.rename
os.remove(path)는 파일을 삭제합니다. os.rename(old, new)는 파일의 이름을 변경하거나 이동합니다. 둘 다 성공하면 true를 반환하고, 실패하면 nil, errMessage를 반환합니다. 이 함수들은 표준 Lua에서 파일 시스템을 조작하는 주요 함수입니다.
-- Delete a file
local ok, err = os.remove("temp.txt")
if not ok then print("Remove failed:", err) end
-- Rename / move
ok, err = os.rename("old_name.txt", "new_name.txt")
if not ok then print("Rename failed:", err) end
-- Atomic update pattern
os.rename("config.new", "config.txt")io.close와 f:close 비교
io.close(f)는 f:close()와 동일합니다. 인수 없이 io.close()를 호출하면 기본 출력 파일을 닫습니다. 대부분의 코드에서는 명확성을 위해 f:close()를 사용하십시오.
local f = io.open("test.txt", "w")
f:write("hello\n")
-- Both are equivalent:
-- f:close()
io.close(f)
-- io.close() with no arg closes default output
io.output("out.txt")
io.write("to file\n")
io.close() -- closes out.txt, restores stdout견고한 파일 복사
모든 단계에서 오류를 처리하는 실제 서비스 수준의 파일 복사 방법은 원본을 열고, 대상 파일을 열고, 청크 단위로 복사하고, 쓰기 오류를 처리한 다음, 두 파일을 모두 닫는 것입니다.
local function copyFile(src, dst, chunkSize)
chunkSize = chunkSize or 65536
local fsrc, err1 = io.open(src, "rb")
if not fsrc then return nil, err1 end
local fdst, err2 = io.open(dst, "wb")
if not fdst then fsrc:close(); return nil, err2 end
local ok = true
local chunk = fsrc:read(chunkSize)
while chunk and ok do
local w, werr = fdst:write(chunk)
if not w then ok = false; err2 = werr end
chunk = fsrc:read(chunkSize)
end
fsrc:close(); fdst:close()
if not ok then os.remove(dst); return nil, err2 end
return true
end빠른 확인
오류가 발생하더라도 Lua에서 파일이 항상 닫히도록 보장하는 가장 좋은 방법은 무엇입니까?
복습: 닫기 및 오류 처리
요약:
- 가비지 수집기에 의존하지 말고 항상
f:close()를 명시적으로 호출 - 견고한 오류 처리를 위해 입출력을 pcall로 감싸기
- "열기 → pcall → 닫기" 템플릿 사용
- 파일 시스템 작업에는
os.remove/os.rename사용 - 중요한 코드에서는 쓰기 반환 값을 확인
자주 묻는 질문
“파일 닫기와 오류 처리” 강의는 무료인가요?
네 — “파일 닫기와 오류 처리” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“파일 닫기와 오류 처리”에서 뭘 배우나요?
파일 핸들을 올바르게 닫고 pcall로 입출력 오류를 처리합니다. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Lua Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“파일 닫기와 오류 처리” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- io.open으로 파일 열기
- 파일 내용 읽기
- 파일에 쓰고 내용 추가하기
- 파일 닫기와 오류 처리