Hampir semua program menyentuh disk: membaca berkas konfigurasi saat aplikasi berjalan, menyimpan log ke folder tertentu, atau menyalin hasil ekspor ke lokasi lain. Untuk kebutuhan dasar semacam itu, .NET menyediakan dua class statis di namespace System.IO, yaitu File untuk berkas dan Directory untuk folder. Keduanya bekerja lewat string path, sehingga kita bisa memanggil operasinya tanpa membuat objek apa pun terlebih dahulu.

Dua Class Statis di System IO #

Method pada File dan Directory menerima path sebagai string, lalu mengembalikan bool untuk pemeriksaan, string[] untuk daftar isi, atau tanpa nilai untuk operasi seperti penyalinan. Tabel berikut merangkum pasangan method yang paling sering dipakai:

KebutuhanMethod FileMethod Directory
Memeriksa keberadaanFile.Exists(path)Directory.Exists(folder)
MembuatFile.Create(path)Directory.CreateDirectory(folder)
MenyalinFile.Copy(sumber, tujuan)tidak tersedia
MenghapusFile.Delete(path)Directory.Delete(folder, recursive: true)
Daftar isitidak tersediaDirectory.GetFiles(folder)

Selain pasangan statis itu, .NET juga menyediakan FileInfo dan DirectoryInfo yang membungkus satu path menjadi objek. Bentuk instance menguntungkan bila kita berulang kali membaca property seperti Length atau Attributes, karena hasilnya diperiksa sekali dan dipakai berkali-kali. Bab-bab di section ini lebih sering memakai bentuk statis karena lebih ringkas untuk skrip sederhana.

Contoh Operasi Dasar #

Contoh berikut membuat folder kerja sementara, menulis satu berkas, menyalinnya ke subfolder arsip, lalu menghapus berkas aslinya:

csharp
string dir = Path.Combine(Path.GetTempPath(), "verify-6c", "file-dan-directory");
Directory.CreateDirectory(dir);
string path = Path.Combine(dir, "catatan.txt");

File.WriteAllText(path, "Halo dari File dan Directory");
Directory.CreateDirectory(Path.Combine(dir, "arsip"));
File.Copy(path, Path.Combine(dir, "arsip", "catatan-lama.txt"), overwrite: true);

Console.WriteLine($"Folder ada: {Directory.Exists(dir)}");
Console.WriteLine($"File ada: {File.Exists(path)}");

foreach (string nama in Directory
    .GetFiles(dir, "*", SearchOption.AllDirectories)
    .OrderBy(Path.GetFileName))
{
    Console.WriteLine(Path.GetFileName(nama));
}

File.Delete(path);
Console.WriteLine($"Setelah dihapus: {File.Exists(path)}");

Output yang Dihasilkan:

text
Folder ada: True
File ada: True
catatan-lama.txt
catatan.txt
Setelah dihapus: False

Mari kita bedah baris demi baris:

  1. Directory.CreateDirectory(dir): method membuat seluruh folder induk yang belum ada sekaligus; pemanggilan ulang pada folder yang sudah ada tidak menimbulkan galat.
  2. File.WriteAllText(path, ...): membuat berkas baru atau menimpa isi lama dalam satu panggilan; berkas otomatis ditutup setelah selesai.
  3. File.Copy(..., overwrite: true): menyalin berkas ke subfolder; argumen overwrite wajib bernilai true bila berkas tujuan mungkin sudah ada, jika tidak IOException dilempar.
  4. GetFiles(..., SearchOption.AllDirectories): mengumpulkan berkas dari folder kerja dan subfolder arsip; OrderBy membuat urutan cetak stabil.
  5. File.Delete(path): menghapus berkas; pemeriksaan File.Exists setelahnya mengembalikan False, sementara salinannya tetap utuh di arsip.