Lua Academy · Ders

Dosyaları Kapatma ve Hata İşleme

Dosya tanıtıcılarını doğru şekilde kapatın ve io hatalarını pcall ile yönetin.

4. ders / 412 adım

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) end

G/Ç 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) end

Yazma 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
end

Dosya 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 stdout

Gü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
end

Kı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.rename kullanın
  • Kritik kodda yazma dönüş değerlerini denetleyin
Başlamak ücretsiz

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

  1. io.open ile Dosya Açma
  2. Dosya İçeriğini Okuma
  3. Dosyalara Yazma ve Sona Ekleme
  4. Dosyaları Kapatma ve Hata İşleme
← Lua Academy Sayfasına Dön