Herkese selamlar, bugün Sıfırdan Golang Serisi #6: Dosya (File I/O) ve Klasör İşlemleri? serinin bu önemli konusunu elimden geldiğince detaylıca anlatacağım. Eleştiriye her zaman açık biri olarak her insan gibi bende hata yapabilirim. Konu altından saygı çerçevesinde dile getirirseniz bilgi alış-verişi/beyin fırtınası yapabilirim. :͛)͛
Seri konuma buraya tıklayarak ulaşabilirsiniz.
Dosya (File I/O) İşlemleri Nedir ve Neden Kullanırız?
Bir program çalıştığında veriler RAM'de tutulur ve program kapandığında maalesef ki silinir. Verilerimizin kalıcı olmasını, program kapandığında bile kaybolmamasını istiyorsak onları dosyalara "TXT, JSON, Log" vb olarak kaydetmemiz gerekir. Go'da bu işlemler için genellikle standart "os" paketi kullanılır. (Dosya işlemleri, sadece metin yazmakla kalmaz.)
Dosya İşlemlerinin Avantajları:
+ Kalıcı Veri Saklama: Kullanıcı ayarlarını, veritabanı yedeğini ya da tarama sonuçlarını güvenle saklamak.
+ Loglama ve Analiz: Siber güvenlik araçlarında, web sunucularında sistemin neler yaptığını ve hataları "siber.log" şeklinde bir dosyaya yazdırıp sonradan analiz etmek gibi.
Dosya Oluşturma ve İçine Yazma?
Go'da yeni bir dosya oluşturmak veya var olan bir dosyanın içeriğini sıfırdan yazmak için `os.WriteFile` fonksiyonu daha çok kullanışlıdır.
+ Dosya İzinleri: Dosya oluştururken okuma/yazma yetkilerini (mesela 0644) olarak belirtmeliyiz.
+ Üzerine Yazma Durumu: Birde belirttiğimiz isimde bir dosya zaten varsa Go içindeki eski verileri silip yenisini yazar.
Kod:
Kod:
package main
import (
"fmt"
"os"
)
func main() {
// Yazacağımız veriyi byte dilimi (slice) formatına çeviriyoruz.
veri := []byte("TurkHackTeam - Dosya İşlemleri Başarıyla Gerçekleşti!\n")
// 0644 izni ile "bilgi.txt" adında bir dosya oluşturup içine yazıyoruz.
err := os.WriteFile("bilgi.txt", veri, 0644)
if err != nil {
fmt.Println("Dosya oluşturulurken hata yaşandı:", err)
return
}
fmt.Println("Dosya başarıyla oluşturuldu ve içine yazıldı!")
}
Bu aşağıda da resimde görüldüğü gibi oluştu:
Dosya Okuma İşlemi Nasıl Yapılır?
Okuma İşlemi: Oluşturduğumuz ya da sistemde zaten var olan bir dosyanın içeriğini okumak için "os.ReadFile" kullanırız.
Bu fonksiyon bize veriyi bilgisayarın anladığı dilden yani "byte" olarak döndürür. Ekranda okunabilir düzgün bir metin görmek için onu "string" veri tipine dönüştürmemiz gerekir.
Kod:
Dosya Okuma İşlemi Nasıl Yapılır?
Okuma İşlemi: Oluşturduğumuz ya da sistemde zaten var olan bir dosyanın içeriğini okumak için "os.ReadFile" kullanırız.
Bu fonksiyon bize veriyi bilgisayarın anladığı dilden yani "byte" olarak döndürür. Ekranda okunabilir düzgün bir metin görmek için onu "string" veri tipine dönüştürmemiz gerekir.
Kod:
Kod:
package main
import (
"fmt"
"os"
)
func main() {
// Dosyanın tamamını okuyoruz.
okunanVeri, err := os.ReadFile("bilgi.txt")
if err != nil {
fmt.Println("Dosya okunamadı, hata:", err)
return
}
fmt.Println("----- Dosya İçeriği -----")
// Byte olarak gelen veriyi string tipine çevirip yazdırıyoruz.
fmt.Println(string(okunanVeri))
}
Dosyanın Sonuna Veri Ekleme?
Bazen bir log sistemi yazarken veyahut tarama aracı geliştirirken eski verilerin silinmesini istemeyiz. Yeni verinin, eski verinin en altına eklenmesi için "os.OpenFile" fonksiyonunu bayraklar ile kullanmalıyız.
Kod:
Bazen bir log sistemi yazarken veyahut tarama aracı geliştirirken eski verilerin silinmesini istemeyiz. Yeni verinin, eski verinin en altına eklenmesi için "os.OpenFile" fonksiyonunu bayraklar ile kullanmalıyız.
Kod:
Kod:
package main
import (
"fmt"
"os"
)
func main() {
// O_APPEND: Sonuna ekle, O_WRONLY: Sadece yazma modu, O_CREATE: Yoksa oluştur
dosya, err := os.OpenFile("bilgi.txt", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
fmt.Println("Dosya açılamadı:", err)
return
}
// İşlem bitince belleği yormamak için dosyayı kapatmayı unutmuyoruz!
defer dosya.Close()
eklenecekVeri := "Sisteme yeni bir sızma testi kaydı eklendi!\n"
_, err = dosya.WriteString(eklenecekVeri)
if err != nil {
fmt.Println("Veri eklenirken hata oluştu:", err)
return
}
fmt.Println("Veri, dosyanın sonuna başarılı bir şekilde eklendi.")
}
Klasör Oluşturma ve Silme?
Raporlarınızı ve çıktılarınızı düzenli tutmak için programınızın otomatik klasör oluşturmasını isteyebilirsiniz. Tek bir klasör için "os.Mkdir" eğer ki içiçe klasörler kuracaksanız "os.MkdirAll" kullanabilirsiniz. Silmek istediğinizde de "os.RemoveAll" kullanılır.
Kod:
Raporlarınızı ve çıktılarınızı düzenli tutmak için programınızın otomatik klasör oluşturmasını isteyebilirsiniz. Tek bir klasör için "os.Mkdir" eğer ki içiçe klasörler kuracaksanız "os.MkdirAll" kullanabilirsiniz. Silmek istediğinizde de "os.RemoveAll" kullanılır.
Kod:
Kod:
package main
import (
"fmt"
"os"
)
func main() {
// Yeni bir klasör oluşturuyoruz. 0755 standart bir klasör iznidir.
err := os.Mkdir("THT_Raporlar", 0755)
if err != nil {
fmt.Println("Klasör oluşturulamadı veya zaten mevcut:", err)
} else {
fmt.Println("THT_Raporlar klasörü başarıyla oluşturuldu!")
}
/*
// Klasörü ve içindeki tüm dosyaları silmek isterseniz bu kodu kullanabilirsiniz:
err = os.RemoveAll("THT_Raporlar")
if err != nil {
fmt.Println("Silme hatası:", err)
} else {
fmt.Println("Klasör ve içindekiler silindi.")
}
*/
}
Kodları kendi VS Code ekranınızda denemeyi unutmayın, özellikle boş arayüz kısmında farklı denemeler yapın. Dosya I/O ve klasör işlemleri sayesinde çok daha profesyonel, kalıcı log bırakan ve esnek araçlar geliştirebileceksiniz birde örnekleri sizde deneyin ona göre yazın bana. Takıldığınız, hata aldığınız yerleri veya eklemek istediklerinizi konu altından sorabilirsiniz.
Okuyan herkese teşekkür ederim. Öbür konuda görüşmek üzere saygıyla ve sevgiyle kalın....
Okuyan herkese teşekkür ederim. Öbür konuda görüşmek üzere saygıyla ve sevgiyle kalın....




