Neler yeni

Yazılım Forum

Tüm özelliklerimize erişmek için şimdi bize katılın. Kayıt olduktan ve giriş yaptıktan sonra konu oluşturabilecek, mevcut konulara yanıt gönderebilecek, itibar kazanabilecek, özel mesajlaşmaya erişebilecek ve çok daha fazlasını yapabileceksiniz! Bu hizmetlerimiz ise tamamen ücretsiz ve kurallara uyulduğu sürece sınırsızdır, o zaman ne bekliyorsunuz? Hadi, sizde aramıza katılın!

VB.NET'te Kapsamlı Dosya Okuma ve Yazma İşlemleri Rehberi

VB.NET'te Kapsamlı Dosya Okuma ve Yazma İşlemleri Rehberi

Visual Basic .NET (VB.NET), dosya sistemleri üzerinde çeşitli işlemler gerçekleştirmek için güçlü ve esnek araçlar sunar. Uygulamaların verileri kalıcı olarak depolaması, yapılandırma dosyalarını okuması veya günlük kaydı tutması gerektiğinde dosya işlemleri vazgeçilmezdir. Bu rehberde, VB.NET'in System.IO ad alanını kullanarak metin dosyaları, ikili dosyalar ve genel dosya/dizin yönetimi hakkında derinlemesine bilgi edineceğiz.

System.IO Ad Alanı Nedir?

System.IO ad alanı, dosya ve dizin oluşturma, silme, kopyalama, taşıma gibi temel işlemlerin yanı sıra, dosyaların içine veri okuma ve yazma yetenekleri sağlayan sınıflar içerir. Bu ad alanı, hem metin tabanlı hem de ikili tabanlı verilerle çalışmak için özel sınıflar sunar. İşte bazı önemli sınıflar:
  • File: Statik yöntemler aracılığıyla dosya oluşturma, kopyalama, silme, taşıma gibi işlemler için kullanılır.
  • Directory: Statik yöntemler aracılığıyla dizin oluşturma, silme, taşıma, içerik listeleme gibi işlemler için kullanılır.
  • Path: Dosya ve dizin yollarını işlemek (birleştirmek, uzantıyı almak, dosya adını almak vb.) için statik yöntemler sunar.
  • StreamReader: Bir dosyadan karakter tabanlı (metin) veri okumak için kullanılır.
  • StreamWriter: Bir dosyaya karakter tabanlı (metin) veri yazmak için kullanılır.
  • FileStream: Bir dosyaya ikili veri okumak veya yazmak için temel akış sağlar. Genellikle BinaryReader ve BinaryWriter ile birlikte kullanılır.
  • BinaryReader: Bir akıştan ilkel veri türlerini (tamsayılar, dizeler, ondalık sayılar vb.) ikili biçimde okumak için kullanılır.
  • BinaryWriter: Bir akışa ilkel veri türlerini ikili biçimde yazmak için kullanılır.

Metin Dosyalarıyla Çalışma (StreamReader ve StreamWriter)

Metin dosyaları, genellikle okunması ve düzenlenmesi kolay, insan tarafından okunabilir verileri depolamak için kullanılır. VB.NET'te metin dosyalarıyla çalışmak için StreamReader ve StreamWriter sınıfları idealdir.

1. Dosyaya Metin Yazma (StreamWriter)

StreamWriter sınıfı, belirtilen bir dosyaya karakter dizileri (metin) yazmak için kullanılır. Dosya mevcut değilse otomatik olarak oluşturulur. Eğer dosya mevcutsa, üzerine yazılabilir veya mevcut içeriğe eklenebilir.

Kod:
Imports System.IO

Public Class Form1

    Private Sub ButtonYaz_Click(sender As Object, e As EventArgs) Handles ButtonYaz.Click
        Dim dosyaYolu As String = "C:\Verilerim\ornek.txt"

        ' Dosya yolunun varlığını kontrol et ve gerekirse dizini oluştur.
        Dim dizin As String = Path.GetDirectoryName(dosyaYolu)
        If Not Directory.Exists(dizin) Then
            Directory.CreateDirectory(dizin)
        End If

        ' 'Using' ifadesi, StreamWriter nesnesinin işi bittiğinde otomatik olarak kapatılmasını ve kaynakların serbest bırakılmasını sağlar.
        Using sw As StreamWriter = New StreamWriter(dosyaYolu, False) ' False: Dosyanın üzerine yaz (overwrite). True: Dosyaya ekle (append).
            sw.WriteLine("Bu, dosyaya yazılan ilk satırdır.")
            sw.WriteLine("İkinci satır biraz daha uzun olabilir.")
            sw.Write("Bu ise yeni bir satıra geçmeyen metindir.")
            sw.WriteLine(" Bu metin hemen önceki metnin devamıdır.")
            Console.WriteLine("Metin başarıyla dosyaya yazıldı: " & dosyaYolu)
        End Using

        ' Dosyaya ekleme modu (append) ile yazma örneği:
        Using swAppend As StreamWriter = New StreamWriter(dosyaYolu, True) ' True: Dosyaya ekle
            swAppend.WriteLine("Bu satır, mevcut içeriğe eklendi.")
            Console.WriteLine("Metin başarıyla dosyaya eklendi: " & dosyaYolu)
        End Using

    End Sub
End Class

Yukarıdaki örnekte, StreamWriter oluşturulurken ikinci parametreye False değeri geçirilerek mevcut dosyanın üzerine yazma işlemi, True değeri geçirilerek ise mevcut içeriğe ekleme işlemi yapılmıştır. WriteLine metodu metni yazdıktan sonra yeni bir satıra geçerken, Write metodu geçmez.

2. Dosyadan Metin Okuma (StreamReader)

StreamReader sınıfı, belirtilen bir dosyadan karakter tabanlı (metin) veri okumak için kullanılır. Satır satır okuyabilir veya tüm içeriği tek seferde okuyabilirsiniz.

Kod:
Imports System.IO

Public Class Form1

    Private Sub ButtonOku_Click(sender As Object, e As EventArgs) Handles ButtonOku.Click
        Dim dosyaYolu As String = "C:\Verilerim\ornek.txt"

        If File.Exists(dosyaYolu) Then
            Using sr As StreamReader = New StreamReader(dosyaYolu)
                Dim satir As String
                Dim tumIcerik As String = sr.ReadToEnd() ' Tüm içeriği tek seferde okuma
                'Console.WriteLine("Dosya İçeriği (ReadToEnd):\n" & tumIcerik)

                ' Alternatif olarak, satır satır okuma:
                sr.BaseStream.Position = 0 ' Okuyucuyu başa al (ReadToEnd sonrası)
                Console.WriteLine("Dosya İçeriği (Satır Satır):")
                Do While sr.Peek() >= 0 ' Dosya sonuna gelinip gelinmediğini kontrol eder
                    satir = sr.ReadLine()
                    Console.WriteLine(satir)
                Loop
            End Using
        Else
            Console.WriteLine("Hata: Belirtilen dosya bulunamadı.")
        End If
    End Sub
End Class

StreamReader ile ReadLine() metodu, dosyanın sonuna ulaşılana kadar her çağrıldığında bir sonraki satırı okur. Peek() metodu, okunacak bir sonraki karakteri int olarak döndürür; dosyanın sonu veya akış yoksa -1 döndürür. ReadToEnd() metodu ise tüm dosya içeriğini tek bir dize olarak döndürür. sr.BaseStream.Position = 0 satırı, ReadToEnd() sonrası akışı başa sararak ReadLine() ile yeniden okuma imkanı sunar.

İkili Dosyalarla Çalışma (FileStream, BinaryReader ve BinaryWriter)

İkili dosyalar, genellikle metin olarak doğrudan okunamaz ve yapılandırılmış verileri (resimler, ses dosyaları, uygulama verileri vb.) depolamak için kullanılır. VB.NET'te ikili dosyalarla çalışmak için FileStream, BinaryReader ve BinaryWriter sınıflarını kullanırız.

FileStream sınıfı, dosya sistemindeki bir dosyaya erişim için temel bir akış sağlar. BinaryWriter bu akışa ilkel türleri yazarken, BinaryReader bu akıştan okur.

1. Dosyaya İkili Veri Yazma (BinaryWriter)

Kod:
Imports System.IO

Public Class Form1

    Private Sub ButtonBinaryYaz_Click(sender As Object, e As EventArgs) Handles ButtonBinaryYaz.Click
        Dim dosyaYolu As String = "C:\Verilerim\ikili_ornek.dat"

        Dim dizin As String = Path.GetDirectoryName(dosyaYolu)
        If Not Directory.Exists(dizin) Then
            Directory.CreateDirectory(dizin)
        End If

        Using fs As New FileStream(dosyaYolu, FileMode.Create)
            Using bw As New BinaryWriter(fs)
                bw.Write("Merhaba İkili Dünya") ' Dize
                bw.Write(12345)                 ' Tamsayı
                bw.Write(3.14159)               ' Double
                bw.Write(True)                  ' Boolean
                bw.Write(New Byte() {&H01, &H02, &H03, &H04}) ' Byte dizisi

                Console.WriteLine("İkili veri başarıyla yazıldı: " & dosyaYolu)
            End Using
        End Using
    End Sub
End Class

FileMode.Create parametresi, dosya yoksa oluşturur, varsa üzerine yazar. BinaryWriter'ın çeşitli Write aşırı yüklemeleri sayesinde farklı veri türlerini kolayca dosyaya yazabiliriz.

2. Dosyadan İkili Veri Okuma (BinaryReader)

Verileri yazdığımız sırayla okumak çok önemlidir. Yanlış sırada okuma, veri bozulmasına veya yanlış değerlerin alınmasına neden olabilir.

Kod:
Imports System.IO

Public Class Form1

    Private Sub ButtonBinaryOku_Click(sender As Object, e As EventArgs) Handles ButtonBinaryOku.Click
        Dim dosyaYolu As String = "C:\Verilerim\ikili_ornek.dat"

        If File.Exists(dosyaYolu) Then
            Using fs As New FileStream(dosyaYolu, FileMode.Open)
                Using br As New BinaryReader(fs)
                    Dim metin As String = br.ReadString()
                    Dim tamSayi As Integer = br.ReadInt32()
                    Dim ondalikSayi As Double = br.ReadDouble()
                    Dim mantiksalDeger As Boolean = br.ReadBoolean()
                    ' Byte dizisini okurken boyutunu bilmemiz gerekir. Yazarken 4 byte yazdığımızı varsayalım.
                    Dim byteDizisi As Byte() = br.ReadBytes(4)

                    Console.WriteLine("Okunan Metin: " & metin)
                    Console.WriteLine("Okunan Tam Sayı: " & tamSayi)
                    Console.WriteLine("Okunan Ondalık Sayı: " & ondalikSayi)
                    Console.WriteLine("Okunan Mantıksal Değer: " & mantiksalDeger)
                    Console.WriteLine("Okunan Byte Dizisi: " & BitConverter.ToString(byteDizisi))

                End Using
            End Using
        Else
            Console.WriteLine("Hata: İkili dosya bulunamadı.")
        End If
    End Sub
End Class

FileMode.Open parametresi, mevcut bir dosyayı açar. BinaryReader sınıfının ReadString(), ReadInt32(), ReadDouble(), ReadBoolean(), ReadBytes() gibi metotları, yazıldığı sıraya göre veri türlerini okur.

Dosya ve Dizin Yönetimi (File ve Directory Sınıfları)

System.IO ad alanındaki File ve Directory sınıfları, dosya sistemi üzerinde yüksek seviyeli işlemler gerçekleştirmek için statik yöntemler sunar. Bu yöntemler, dosyaları ve dizinleri oluşturmak, silmek, taşımak, kopyalamak ve bilgilerini almak için idealdir.

1. File Sınıfı Yöntemleri

  • File.Exists(path as String): Belirtilen dosyanın var olup olmadığını kontrol eder.
  • File.Delete(path as String): Belirtilen dosyayı siler.
  • File.Copy(sourceFile as String, destinationFile as String, [overwrite as Boolean]): Bir dosyayı başka bir konuma kopyalar.
  • File.Move(sourceFile as String, destinationFile as String): Bir dosyayı başka bir konuma taşır veya yeniden adlandırır.
  • File.ReadAllText(path as String): Bir metin dosyasının tüm içeriğini okur ve bir dize olarak döndürür. (Kısa dosyalar için kullanışlıdır.)
  • File.WriteAllText(path as String, contents as String): Belirtilen bir metin dizesini dosyaya yazar. Dosya yoksa oluşturur, varsa üzerine yazar. (Kısa dosyalar için kullanışlıdır.)
  • File.AppendAllText(path as String, contents as String): Belirtilen bir metin dizesini mevcut dosyanın sonuna ekler.

Kod:
Imports System.IO

Public Class Form1

    Private Sub ButtonFileIslemleri_Click(sender As Object, e As EventArgs) Handles ButtonFileIslemleri.Click
        Dim kaynakDosya As String = "C:\Verilerim\kaynak.txt"
        Dim hedefDosya As String = "C:\Verilerim\kopya.txt"
        Dim yeniAdDosya As String = "C:\Verilerim\yenidenAdlandirildi.txt"
        Dim silinecekDosya As String = "C:\Verilerim\silinecek.txt"

        ' Test için dosyaları oluştur
        File.WriteAllText(kaynakDosya, "Bu bir kaynak dosyadır.")
        File.WriteAllText(silinecekDosya, "Bu dosya silinecektir.")

        If File.Exists(kaynakDosya) Then
            Console.WriteLine("Kaynak dosya mevcut.")

            ' Dosya Kopyalama
            File.Copy(kaynakDosya, hedefDosya, True) ' True: Hedef dosya varsa üzerine yaz
            Console.WriteLine("Dosya kopyalandı: " & hedefDosya)

            ' Dosya Taşıma/Yeniden Adlandırma
            If File.Exists(hedefDosya) Then
                File.Move(hedefDosya, yeniAdDosya)
                Console.WriteLine("Dosya taşındı/yeniden adlandırıldı: " & yeniAdDosya)
            End If

            ' Dosya Silme
            If File.Exists(silinecekDosya) Then
                File.Delete(silinecekDosya)
                Console.WriteLine("Dosya silindi: " & silinecekDosya)
            End If
        Else
            Console.WriteLine("Kaynak dosya bulunamadı.")
        End If

        ' Kısa dosyaları okuma ve yazma
        Dim kisaDosyaYolu As String = "C:\Verilerim\kisa.txt"
        File.WriteAllText(kisaDosyaYolu, "Bu, WriteAllText ile yazılan kısa bir metindir.")
        Console.WriteLine("Kısa dosya oluşturuldu ve yazıldı.")
        Dim okunanMetin As String = File.ReadAllText(kisaDosyaYolu)
        Console.WriteLine("Kısa dosyadan okunan: " & okunanMetin)
        File.AppendAllText(kisaDosyaYolu, "\nBu metin AppendAllText ile eklendi.")
        Console.WriteLine("Kısa dosyaya metin eklendi.")
    End Sub
End Class

2. Directory Sınıfı Yöntemleri

  • Directory.Exists(path as String): Belirtilen dizinin var olup olmadığını kontrol eder.
  • Directory.CreateDirectory(path as String): Belirtilen dizini (veya yolu üzerindeki tüm dizinleri) oluşturur.
  • Directory.Delete(path as String, [recursive as Boolean]): Belirtilen dizini siler. recursive parametresi True ise, dizin içindeki tüm dosya ve alt dizinleri de siler.
  • Directory.Move(sourceDir as String, destinationDir as String): Bir dizini başka bir konuma taşır veya yeniden adlandırır.
  • Directory.GetFiles(path as String, [searchPattern as String]): Belirtilen dizindeki tüm dosya yollarını bir dizi olarak döndürür.
  • Directory.GetDirectories(path as String, [searchPattern as String]): Belirtilen dizindeki tüm alt dizin yollarını bir dizi olarak döndürür.

Kod:
Imports System.IO

Public Class Form1

    Private Sub ButtonDizinIslemleri_Click(sender As Object, e As EventArgs) Handles ButtonDizinIslemleri.Click
        Dim anaDizin As String = "C:\TestDizin"
        Dim altDizin As String = Path.Combine(anaDizin, "AltDizin")
        Dim silinecekDizin As String = "C:\SilinecekDizin"

        ' Dizin oluşturma
        If Not Directory.Exists(anaDizin) Then
            Directory.CreateDirectory(anaDizin)
            Console.WriteLine("Dizin oluşturuldu: " & anaDizin)
        End If

        If Not Directory.Exists(altDizin) Then
            Directory.CreateDirectory(altDizin)
            Console.WriteLine("Alt dizin oluşturuldu: " & altDizin)
        End If

        ' Silinecek dizin için bir dosya oluşturalım
        Directory.CreateDirectory(silinecekDizin)
        File.WriteAllText(Path.Combine(silinecekDizin, "test.txt"), "Silinecek dosya.")
        Console.WriteLine("Silinecek dizin ve içindeki dosya oluşturuldu.")

        ' Dizin içeriğini listeleme
        Console.WriteLine("\n" & anaDizin & " içeriği:")
        Dim dosyalar As String() = Directory.GetFiles(anaDizin)
        For Each dosya As String In dosyalar
            Console.WriteLine("  Dosya: " & Path.GetFileName(dosya))
        Next
        Dim dizinler As String() = Directory.GetDirectories(anaDizin)
        For Each dizin As String In dizinler
            Console.WriteLine("  Dizin: " & Path.GetFileName(dizin))
        Next

        ' Dizin Silme (recursive=True ile içindekilerle birlikte silme)
        If Directory.Exists(silinecekDizin) Then
            Directory.Delete(silinecekDizin, True) ' True: İçindeki her şeyi sil
            Console.WriteLine("\nSilinecek dizin silindi: " & silinecekDizin)
        End If

        ' Dizin Taşıma/Yeniden Adlandırma
        Dim yeniDizinYolu As String = "C:\YeniAdDizin"
        If Directory.Exists(anaDizin) Then
            Directory.Move(anaDizin, yeniDizinYolu)
            Console.WriteLine("Dizin taşındı/yeniden adlandırıldı: " & anaDizin & " -> " & yeniDizinYolu)
        End If
    End Sub
End Class

Hata Yönetimi ve Kaynak Serbest Bırakma

Dosya işlemleri sırasında hatalar (dosya bulunamadı, erişim reddedildi, disk dolu vb.) meydana gelebilir. Bu tür durumları ele almak için Try...Catch...Finally blokları ve özellikle Using ifadesi hayati öneme sahiptir.

Try...Catch...Finally:

Kod:
Imports System.IO

Public Class Form1

    Private Sub ButtonHataYon_Click(sender As Object, e As EventArgs) Handles ButtonHataYon.Click
        Dim dosyaYolu As String = "C:\YanlisDizin\olmayan_dosya.txt"

        Try
            ' Dosya okuma işlemi, dosya yoksa hata verecek.
            Dim icerik As String = File.ReadAllText(dosyaYolu)
            Console.WriteLine("Dosya içeriği: " & icerik)
        Catch ex As FileNotFoundException
            Console.WriteLine("Hata: Dosya bulunamadı! " & ex.Message)
        Catch ex As UnauthorizedAccessException
            Console.WriteLine("Hata: Dosyaya erişim izni yok! " & ex.Message)
        Catch ex As Exception
            Console.WriteLine("Genel bir hata oluştu: " & ex.Message)
        Finally
            Console.WriteLine("Hata yönetimi bloğu tamamlandı.")
            ' Kaynakları burada kapatmak genellikle iyi bir pratiktir, ancak 'Using' varken gereksizdir.
        End Try
    End Sub
End Class

Using İfadesi:

StreamReader, StreamWriter, FileStream gibi kaynakları kullanan sınıflar, IDisposable arayüzünü uygular. Bu, işleri bittiğinde Dispose() metodunun çağrılması gerektiği anlamına gelir. Aksi takdirde, dosya kilitli kalabilir veya bellek sızıntıları oluşabilir. Using ifadesi, bu kaynakların otomatik olarak doğru bir şekilde serbest bırakılmasını sağlar, böylece Finally bloğunda manuel olarak Close() veya Dispose() çağırmanıza gerek kalmaz.

Önemli Not: Her zaman dosya veya akış nesnelerini Using ifadesi içinde kullanın. Bu, hata durumlarında bile kaynakların düzgün bir şekilde kapatılmasını ve serbest bırakılmasını garanti eder. Bu, hem uygulamanızın kararlılığı hem de sistem kaynaklarının verimli kullanımı için kritik öneme sahiptir.

Performans ve En İyi Uygulamalar

* Using Kullanın: Yukarıda belirtildiği gibi, IDisposable uygulayan tüm dosya ve akış nesneleri için Using ifadesini kullanın.
* Yol Birleştirmeleri İçin Path Sınıfını Kullanın: Dosya ve dizin yollarını manuel olarak string birleştirmeleriyle oluşturmak yerine, System.IO.Path.Combine metodunu kullanın. Bu, işletim sistemleri arasındaki yol ayırıcı farklılıklarını (örneğin Windows'da '\', Unix'te '/') otomatik olarak yönetir.
* Büyük Dosyalar İçin Satır Satır Okuma: Çok büyük metin dosyalarını okurken, File.ReadAllText gibi metotlar tüm dosyayı belleğe yükleyeceği için bellek sorunlarına yol açabilir. Bunun yerine, StreamReader ile ReadLine() metodunu kullanarak dosyayı satır satır okuyun.
* Asenkron İşlemler (Gelişmiş): Çok büyük dosya işlemleri uygulamanızın kullanıcı arayüzünü donduruyorsa, StreamReader.ReadLineAsync() veya StreamWriter.WriteAsync() gibi asenkron metotları kullanarak işlemleri arka planda çalıştırmayı düşünebilirsiniz. Bu, özellikle GUI uygulamalarında responsive bir deneyim sağlamak için önemlidir.
* Dosya Erişim İzinlerini Kontrol Edin: Dosya yazma veya silme gibi işlemlerden önce, uygulamanızın gerekli dosya erişim izinlerine sahip olup olmadığını kontrol edin. Aksi takdirde UnauthorizedAccessException hataları alabilirsiniz.

Sonuç

VB.NET'te dosya okuma ve yazma işlemleri, System.IO ad alanı sayesinde oldukça basittir ancak dikkat ve doğru uygulamaları gerektirir. Metin tabanlı veriler için StreamReader ve StreamWriter, ikili veriler için FileStream ile birlikte BinaryReader ve BinaryWriter kullanmak standart yaklaşımlardır. Ayrıca, File ve Directory sınıfları dosya sistemi yönetimi için güçlü araçlar sunar. Hata yönetimi ve özellikle Using ifadesinin doğru kullanımı, uygulamanızın güvenilir ve kaynak dostu olmasını sağlayacaktır. Bu rehberin, VB.NET'te dosya işlemleri konusunda sağlam bir temel oluşturmanıza yardımcı olmasını umuyoruz. Daha fazla bilgi ve örnek için resmi Microsoft belgelerine başvurabilirsiniz.

System.IO belgeleri adresinden daha fazla detaya ulaşabilirsiniz.
 
shape1
shape2
shape3
shape4
shape5
shape6
Üst

Bu web sitenin performansı Hazal Host tarafından sağlanmaktadır.

YazilimForum.com.tr internet sitesi, 5651 sayılı Kanun’un 2. maddesinin 1. fıkrasının (m) bendi ve aynı Kanun’un 5. maddesi kapsamında Yer Sağlayıcı konumundadır. Sitede yer alan içerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır.

YazilimForum.com.tr, kullanıcılar tarafından paylaşılan içeriklerin doğruluğunu, güncelliğini veya hukuka uygunluğunu garanti etmez ve içeriklerin kontrolü veya araştırılması ile yükümlü değildir. Kullanıcılar, paylaştıkları içeriklerden tamamen kendileri sorumludur.

Hukuka aykırı içerikleri fark ettiğinizde lütfen bize bildirin: lydexcoding@gmail.com

Sitemiz, kullanıcıların paylaştığı içerik ve bilgileri 6698 sayılı KVKK kapsamında işlemektedir. Kullanıcılar, kişisel verileriyle ilgili haklarını KVKK Politikası sayfasından inceleyebilir.

Sitede yer alan reklamlar veya üçüncü taraf bağlantılar için YazilimForum.com.tr herhangi bir sorumluluk kabul etmez.

Sitemizi kullanarak Forum Kuralları’nı kabul etmiş sayılırsınız.

DMCA.com Protection Status Copyrighted.com Registered & Protected