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.
Ushbu bo‘lim mundarijasi
Dastur to'xtaganda xotiradagi hamma narsa yo'qoladi. Ma'lumotni saqlab qolish uchun uni faylga yozish kerak.
Eng oddiy yozish va o'qish #
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
Birinchi qator
Ikkinchi qator
False
| Metod | Nima qiladi |
|---|---|
File.WriteAllText | Faylga yozadi (ustiga yozadi) |
File.AppendAllText | Oxiriga qo'shadi |
File.ReadAllText | Butun faylni bitta satr qilib o'qiydi |
File.Exists | Fayl bormi |
File.Delete | O'chiradi |
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 #
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
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 #
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
O'qilgan qatorlar: 5
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 #
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
hujjatlar/hisobot.txt
hisobot.txt
.txt
hisobot
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 #
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
True
Fayllar soni: 2
a.txt
b.txt
False
Diqqat: Directory.GetFiles tartibni kafolatlamaydi, shuning
uchun misolda OrderBy ishlatilgan.
JSON - obyektni saqlash #
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
{"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 #
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
[
{
"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 #
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
Til: uz
Mavzu: tungi
Avto saqlash: True
Dastur sozlamalarini saqlashning eng keng tarqalgan usuli aynan shu.
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.
- Matnni faylga yozib, qayta o'qing.
AppendAllTextbilan faylga yangi qator qo'shing.- Beshta ismni
WriteAllLinesbilan saqlang. - Faylni
StreamReaderbilan qator-qator o'qing. Path.Combinebilan papka va fayl nomini birlashtiring.- Fayl kengaytmasini
Path.GetExtensionbilan oling. - Papka yaratib, ichiga ikkita fayl yozing va ro'yxatini chiqaring.
Talabaobyektini JSON ga aylantiring.- JSON ni
WriteIndentedbilan chiroyli ko'rinishda saqlang. - Sozlamalar faylini o'qib, qiymatlarini ekranga chiqaring.
Xulosa #
File.WriteAllTextustiga yozadi - qo'shish uchunAppendAllText.WriteAllLines/ReadAllLinesmassiv bilan ishlaydi.- Katta fayllar uchun
StreamReader- u xotirani to'ldirmaydi. - Yo'lni qo'lda ulamang,
Path.Combineishlating. Directory.GetFilestartibni kafolatlamaydi - kerak bo'lsa saralang.JsonSerializer.Serialize/Deserialize(Of T)- obyektni saqlash va qayta tiklash.- JSON faqat
Public Propertylarni ko'radi. - Fayl bilan ishlaganda
UsingyokiTry/Finallyshart.
Keyingi bo'limda LINQ - ma'lumot ustida so'rov yozishni o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.