Dosyaları Kapatma ve Hata İşleme
Dosya tanıtıcılarını doğru şekilde kapatın ve io hatalarını pcall ile yönetin.
Dosyaları Kapatma ve Hata İşleme, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Lua Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Lua Academy kursu toplamda 4 dersten oluşur.
Dosyaları Her Zaman Kapatın
io.open ile açılan her dosya f:close() ile kapatılmalıdır. Kapatılmayan dosyalar dosya tanımlayıcılarını tüketir. Lua'nın çöp toplayıcısı bunları sonunda kapatır; ancak çöp toplayıcı çalışmadan önce OS dosya sınırlarını aşabilirsiniz. Dosyayı açan işlevde her zaman kapatın.
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) endG/Ç Güvenliği için pcall
Beklenmeyen hataları (diskin dolması, yazma sırasında izinlerin reddedilmesi) yakalamak için dosya işlemlerini pcall ile sarın. Böylece programı çökertmek yerine hataları uygun şekilde ele alabilirsiniz.
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) endYazma Başarısını Denetleme
Diski dolu veya izin sorunları olan sistemlerde, io.open başarılı olduktan sonra bile f:write() başarısız olabilir. Kritik yollardaki yazma işlemlerinin dönüş değerini denetleyin.
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 ile finally Örüntüsü
Lua'da finally bloğu yoktur; ancak bunu pcall ile taklit edebilirsiniz. Riskli kodu pcall içinde çalıştırın; pcall başarıyla veya başarısızlıkla döndükten sonra, hatayı yeniden oluşturmadan ya da ele almadan önce temizleme kodunu koşulsuz olarak çalıştırın.
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 ile Gelen Hata İletileri
io.open nil ile birlikte bir sistem hata iletisi ve hata kodu döndürür. İleti, yolu ve OS hata nedenini ("No such file", "Permission denied" vb.) içerir. Kullanıcıya sunduğunuz hata raporuna hata iletisini her zaman ekleyin.
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
endDosya Tutamacı Nesne Olarak
Lua dosya tutamacı, yöntemlere sahip bir userdata değeridir. Tutamaç çöp toplayıcı tarafından toplandığında dosya otomatik olarak kapatılır. Ancak zamanında kapanma için çöp toplayıcıya güvenmeyin; dosyayı her zaman açıkça kapatın. Bir dosyanın kapalı olup olmadığını f:read() ile denetleyebilirsiniz; kapalı bir tutamaçta hata oluşur.
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]Güvenli Dosya İşleme Şablonu
Güvenli dosya işleme için yeniden kullanılabilir şablon: hata denetimiyle açın, pcall ile işleyin, her durumda kapatın. Sonuçları ve hataları nil+message kuralını kullanarak tutarlı biçimde döndürün.
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 ve os.rename
os.remove(path) bir dosyayı siler. os.rename(old, new) bir dosyanın adını değiştirir veya dosyayı taşır. Her ikisi de başarı durumunda true, başarısızlık durumunda nil, errMessage döndürür. Bunlar, standart Lua'daki temel dosya sistemi işlemleridir.
-- 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 ve f:close Karşılaştırması
io.close(f), f:close() ile eşdeğerdir. Bağımsız değişken olmadan kullanılan io.close(), varsayılan çıktı dosyasını kapatır. Çoğu kodda açıklık açısından f:close() kullanın.
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 stdoutGüvenilir Dosya Kopyalama
Her adımda hata işleme içeren, üretim kalitesinde bir dosya kopyalama işlemi: kaynağı açın, hedefi açın, parçalar hâlinde kopyalayın, yazma hatalarını ele alın ve her iki dosyayı da kapatın.
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
endKısa Denetim
Lua'da bir hata oluşsa bile dosyanın her zaman kapatılmasını sağlamanın en iyi yolu nedir?
Tekrar: Kapatma ve Hata İşleme
Özet:
- Çöp toplayıcıya güvenmeyin;
f:close()işlevini her zaman açıkça çağırın - Güvenilir hata işleme için G/Ç işlemlerini pcall ile sarın
- "aç → pcall → kapat" şablonunu kullanın
- Dosya sistemi işlemleri için
os.remove/os.renamekullanın - Kritik kodda yazma dönüş değerlerini denetleyin
Yapay zeka eğitmeniyle Lua öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 40
- Dersler
- 159
Sıkça Sorulan Sorular
“Dosyaları Kapatma ve Hata İşleme” dersi ücretsiz mi?
Evet — “Dosyaları Kapatma ve Hata İşleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Lua Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Lua Academy kursu toplamda 4 dersten oluşur.
“Dosyaları Kapatma ve Hata İşleme” dersinde ne öğreneceğim?
Dosya tanıtıcılarını doğru şekilde kapatın ve io hatalarını pcall ile yönetin. Lua Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Lua Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Lua Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Dosyaları Kapatma ve Hata İşleme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Lua Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Lua Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- io.open ile Dosya Açma
- Dosya İçeriğini Okuma
- Dosyalara Yazma ve Sona Ekleme
- Dosyaları Kapatma ve Hata İşleme