15-bo‘lim

Fayllar va JSON

Faylga yozish va o'qish, qator-qator ishlash, papka amallari, Path bilan yo'l qurish va System.Text.Json bilan obyektni saqlash.

🕑 10 daqiqa o‘qish 📄 466 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Eng oddiy yozish va o'qish
  2. Qatorlar bilan ishlash
  3. Katta fayllar uchun oqim
  4. Yo'llarni to'g'ri qurish
  5. Papkalar
  6. JSON - obyektni saqlash
  7. O'qishga qulay JSON
  8. JSON ni faylga saqlash
  9. Xulosa

Dastur to'xtaganda xotiradagi hamma narsa yo'qoladi. Ma'lumotni saqlab qolish uchun uni faylga yozish kerak.

Eng oddiy yozish va o'qish #

VB
Imports System.IO

Module Dastur
    Sub Main()
        Dim yol As String = "qaydlar.txt"

        File.WriteAllText(yol, "Birinchi qator" & Environment.NewLine &
                               "Ikkinchi qator")

        Dim matn As String = File.ReadAllText(yol)
        Console.WriteLine(matn)

        File.Delete(yol)
        Console.WriteLine(File.Exists(yol))
    End Sub
End Module
Natija
Birinchi qator
Ikkinchi qator
False
MetodNima qiladi
File.WriteAllTextFaylga yozadi (ustiga yozadi)
File.AppendAllTextOxiriga qo'shadi
File.ReadAllTextButun faylni bitta satr qilib o'qiydi
File.ExistsFayl bormi
File.DeleteO'chiradi
WriteAllText eski mazmunni yo'q qiladi

File.WriteAllText mavjud faylni so'ramasdan ustiga yozadi.

Qo'shish kerak bo'lsa File.AppendAllText ishlating, yoki avval File.Exists bilan tekshiring.

Bu ayniqsa foydalanuvchi ma'lumoti bilan ishlaganda xavfli.

Qatorlar bilan ishlash #

VB
Imports System.IO

Module Dastur
    Sub Main()
        Dim yol As String = "talabalar.txt"
        Dim royxat() As String = {"Malika", "Husanboy", "Nodira", "Aziza"}

        File.WriteAllLines(yol, royxat)

        Dim oqilgan() As String = File.ReadAllLines(yol)
        Console.WriteLine($"Jami: {oqilgan.Length}")

        For i As Integer = 0 To oqilgan.Length - 1
            Console.WriteLine($"{i + 1}. {oqilgan(i)}")
        Next

        File.Delete(yol)
    End Sub
End Module
Natija
Jami: 4
1. Malika
2. Husanboy
3. Nodira
4. Aziza

WriteAllLines va ReadAllLines - massiv bilan ishlaydi, har bir element alohida qator bo'ladi.

Katta fayllar uchun oqim #

VB
Imports System.IO

Module Dastur
    Sub Main()
        Dim yol As String = "sonlar.txt"

        Using yozuvchi As New StreamWriter(yol)
            For i As Integer = 1 To 5
                yozuvchi.WriteLine($"Qator {i}")
            Next
        End Using

        Dim jami As Integer = 0
        Using oquvchi As New StreamReader(yol)
            Dim qator As String = oquvchi.ReadLine()
            While qator IsNot Nothing
                jami += 1
                qator = oquvchi.ReadLine()
            End While
        End Using

        Console.WriteLine($"O'qilgan qatorlar: {jami}")
        File.Delete(yol)
    End Sub
End Module
Natija
O'qilgan qatorlar: 5
ReadAllText va StreamReader farqi

ReadAllText butun faylni xotiraga yuklaydi. 10 KB fayl uchun bu mutlaqo normal.

Lekin fayl 2 GB bo'lsa, dastur xotira yetishmasligidan to'xtaydi. StreamReader esa faylni qator-qator o'qiydi va xotirada faqat bitta qator turadi.

Qoida: fayl hajmini oldindan bilmasangiz - StreamReader.

Yo'llarni to'g'ri qurish #

VB
Imports System.IO

Module Dastur
    Sub Main()
        Dim papka As String = "hujjatlar"
        Dim fayl As String = "hisobot.txt"

        Dim toliq As String = Path.Combine(papka, fayl)
        Console.WriteLine(toliq.Replace("\", "/"))

        Console.WriteLine(Path.GetFileName(toliq))
        Console.WriteLine(Path.GetExtension(toliq))
        Console.WriteLine(Path.GetFileNameWithoutExtension(toliq))
    End Sub
End Module
Natija
hujjatlar/hisobot.txt
hisobot.txt
.txt
hisobot
Yo'lni qo'lda ulamang

papka & "\" & fayl deb yozmang.

Windows da ajratgich \, Linux va macOS da esa /. Path.Combine har bir tizimda to'g'risini qo'yadi va ikkita ajratgich tushib qolishidan ham saqlaydi.

Yuqoridagi misolda Replace ishlatilgani shundan: darslik Linux'da tekshirilgani uchun natijani bir xil ko'rsatish kerak edi. O'z kodingizda bunday Replace kerak emas.

Papkalar #

VB
Imports System.IO

Module Dastur
    Sub Main()
        Dim papka As String = "sinov_papka"

        Directory.CreateDirectory(papka)
        Console.WriteLine(Directory.Exists(papka))

        File.WriteAllText(Path.Combine(papka, "a.txt"), "A")
        File.WriteAllText(Path.Combine(papka, "b.txt"), "B")

        Dim fayllar() As String = Directory.GetFiles(papka)
        Console.WriteLine($"Fayllar soni: {fayllar.Length}")

        For Each f As String In fayllar.OrderBy(Function(x) x)
            Console.WriteLine(Path.GetFileName(f))
        Next

        Directory.Delete(papka, True)
        Console.WriteLine(Directory.Exists(papka))
    End Sub
End Module
Natija
True
Fayllar soni: 2
a.txt
b.txt
False

Diqqat: Directory.GetFiles tartibni kafolatlamaydi, shuning uchun misolda OrderBy ishlatilgan.

JSON - obyektni saqlash #

VB
Imports System.Text.Json

Public Class Talaba
    Public Property Ism As String
    Public Property Yosh As Integer
    Public Property Ball As Integer
End Class

Module Dastur
    Sub Main()
        Dim t As New Talaba With {.Ism = "Malika", .Yosh = 22, .Ball = 88}

        Dim json As String = JsonSerializer.Serialize(t)
        Console.WriteLine(json)

        Dim qayta As Talaba = JsonSerializer.Deserialize(Of Talaba)(json)
        Console.WriteLine($"{qayta.Ism} - {qayta.Ball}")
    End Sub
End Module
Natija
{"Ism":"Malika","Yosh":22,"Ball":88}
Malika - 88

Serialize obyektni JSON satriga aylantiradi, Deserialize(Of T) esa teskarisini qiladi. Xossalar nomi JSON kalitlariga aynan mos tushadi.

O'qishga qulay JSON #

VB
Imports System.Text.Json

Public Class Talaba
    Public Property Ism As String
    Public Property Ball As Integer
End Class

Module Dastur
    Sub Main()
        Dim royxat As New List(Of Talaba) From {
            New Talaba With {.Ism = "Malika", .Ball = 88},
            New Talaba With {.Ism = "Husanboy", .Ball = 92}
        }

        Dim sozlama As New JsonSerializerOptions With {.WriteIndented = True}
        Dim json As String = JsonSerializer.Serialize(royxat, sozlama)
        Console.WriteLine(json)

        Dim qayta As List(Of Talaba) =
            JsonSerializer.Deserialize(Of List(Of Talaba))(json)
        Console.WriteLine($"Qayta o'qildi: {qayta.Count} ta")
        Console.WriteLine(qayta(1).Ism)
    End Sub
End Module
Natija
[
  {
    "Ism": "Malika",
    "Ball": 88
  },
  {
    "Ism": "Husanboy",
    "Ball": 92
  }
]
Qayta o'qildi: 2 ta
Husanboy

WriteIndented = True - odam o'qishi uchun. Fayl hajmi muhim bo'lsa, uni yoqmang.

JSON ni faylga saqlash #

VB
Imports System.IO
Imports System.Text.Json

Public Class Sozlama
    Public Property Til As String
    Public Property Mavzu As String
    Public Property AvtoSaqlash As Boolean
End Class

Module Dastur
    Sub Main()
        Dim yol As String = "sozlama.json"

        Dim s As New Sozlama With {
            .Til = "uz", .Mavzu = "tungi", .AvtoSaqlash = True
        }

        File.WriteAllText(yol, JsonSerializer.Serialize(s))

        Dim oqilgan As Sozlama =
            JsonSerializer.Deserialize(Of Sozlama)(File.ReadAllText(yol))

        Console.WriteLine($"Til: {oqilgan.Til}")
        Console.WriteLine($"Mavzu: {oqilgan.Mavzu}")
        Console.WriteLine($"Avto saqlash: {oqilgan.AvtoSaqlash}")

        File.Delete(yol)
    End Sub
End Module
Natija
Til: uz
Mavzu: tungi
Avto saqlash: True

Dastur sozlamalarini saqlashning eng keng tarqalgan usuli aynan shu.

JSON uchun xossalar Public bo'lishi shart

JsonSerializer faqat Public Property larni ko'radi.

Private maydonlar va Public oddiy maydonlar (xossa emas) standart holatda saqlanmaydi. Agar JSON bo'sh {} chiqsa, birinchi navbatda shuni tekshiring.

Amaliy topshiriq
  1. Matnni faylga yozib, qayta o'qing.
  2. AppendAllText bilan faylga yangi qator qo'shing.
  3. Beshta ismni WriteAllLines bilan saqlang.
  4. Faylni StreamReader bilan qator-qator o'qing.
  5. Path.Combine bilan papka va fayl nomini birlashtiring.
  6. Fayl kengaytmasini Path.GetExtension bilan oling.
  7. Papka yaratib, ichiga ikkita fayl yozing va ro'yxatini chiqaring.
  8. Talaba obyektini JSON ga aylantiring.
  9. JSON ni WriteIndented bilan chiroyli ko'rinishda saqlang.
  10. Sozlamalar faylini o'qib, qiymatlarini ekranga chiqaring.

Xulosa #

  • File.WriteAllText ustiga yozadi - qo'shish uchun AppendAllText.
  • WriteAllLines / ReadAllLines massiv bilan ishlaydi.
  • Katta fayllar uchun StreamReader - u xotirani to'ldirmaydi.
  • Yo'lni qo'lda ulamang, Path.Combine ishlating.
  • Directory.GetFiles tartibni kafolatlamaydi - kerak bo'lsa saralang.
  • JsonSerializer.Serialize / Deserialize(Of T) - obyektni saqlash va qayta tiklash.
  • JSON faqat Public Property larni ko'radi.
  • Fayl bilan ishlaganda Using yoki Try/Finally shart.

Keyingi bo'limda LINQ - ma'lumot ustida so'rov yozishni o'rganamiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.