Proyek analisis nyata tidak pernah hidup dalam satu folder: data mentah datang dari data/, hasil tersimpan ke output/, dan berkas sementara harus dibersihkan setiap kali script dijalankan ulang. Melakukan semua itu manual lewat file explorer membuat pekerjaan tidak terulang dengan andal — MATLAB memberi perangkat lengkap untuk mengelola berkas dari dalam kode. Cakupan chapter ini:
- Meninjau isi folder dengan
dirdan wildcard*.csv - Menyusun path portabel dengan
fullfiledanfilesep - Memeriksa keberadaan berkas/folder dengan
exist,isfile, danisfolder - Membuat, menyalin, memindah, menghapus:
mkdir,copyfile,movefile,delete,rmdir - Menelusuri folder secara rekursif dan menata struktur proyek
dir: Inventaris Berkas dengan Wildcard #
Aturannya: dir(pola) mengembalikan struct array — satu elemen per berkas/folder yang cocok dengan pola. Mekanismenya: wildcard * menggantikan deretan karakter apa pun, sehingga dir(fullfile('data', '*.csv')) hanya menangkap berkas berakhiran .csv. Tiap elemen struct memuat field:
| Field | Isi | Keterangan |
|---|---|---|
.name | nama berkas tanpa folder | kunci untuk loop pemrosesan |
.folder | folder tempat berkas berada | berguna saat dir multi-folder |
.bytes | ukuran berkas dalam byte | audit ukuran data |
.isdir | true bila berupa folder | memilah folder dari berkas |
.date | waktu modifikasi terakhir | menemukan berkas termutakhir |
mkdir('data');
fid = fopen(fullfile('data', 'a.csv'), 'w'); fprintf(fid, '1,2\n'); fclose(fid);
fid = fopen(fullfile('data', 'b.csv'), 'w'); fprintf(fid, '3,4\n'); fclose(fid);
fid = fopen(fullfile('data', 'catatan.txt'), 'w'); fprintf(fid, 'catatan\n'); fclose(fid);
L = dir(fullfile('data', '*.csv'));
fprintf('jumlah *.csv: %d\n', numel(L));
for k = 1:numel(L)
fprintf('file %d: %s (%d byte)\n', k, L(k).name, L(k).bytes);
endOutput yang Dihasilkan:
jumlah *.csv: 2
file 1: a.csv (4 byte)
file 2: b.csv (4 byte)Mari kita bedah baris-baris kode di atas:
- Baris 6 (
dir(fullfile('data', '*.csv'))): pola diterapkan pada folderdata, bukan folder kerja —catatan.txttidak ikut karena ekstensinya tidak cocok. - Baris 7 (
numel(L)): hasildiradalah struct array yang bisa kosong;numel= 0 berarti tidak ada berkas cocok — kondisi yang layak diperiksa sebelum loop. - Baris 8-10 (
L(k).name, L(k).bytes): loop membaca field per elemen; bila urutan hasil penting, tambahkansort({L.name})karena urutandirbergantung sistem operasi.
fullfile dan filesep: Path yang Portabel #
Masalah nyatanya: Windows memakai pemisah \ sedangkan Linux/macOS memakai / — path yang dihardcode patah saat skrip berpindah mesin. Mekanismenya: fullfile(bagian1, bagian2, ...) menggabungkan komponen path dengan pemisah yang benar untuk sistem operasi berjalan; filesep mengembalikan pemisah itu sendiri:
fprintf('filesep : %s\n', filesep);
fprintf('fullfile contoh: %s\n', fullfile('data', 'a.csv'));Output yang Dihasilkan (di Linux/macOS; di Windows filesep menjadi \):
filesep : /
fullfile contoh: data/a.csvMari kita bedah baris-baris kode di atas:
- Baris 1 (
filesep): karakter pemisah milik sistem —/di Linux,\di Windows; gunakan untuk membangun path secara manual bila perlu. - Baris 2 (
fullfile): penggabungan berlapis yang benar secara otomatis —fullfile('data', 'arsip', 'b.csv')valid di semua platform.
exist, isfile, dan isfolder: Periksa Sebelum Bertindak #
Operasi berkas tanpa pemeriksaan awal berujung galat: membaca berkas yang tidak ada, atau menimpa folder yang sebenarnya masih dipakai. Mekanismenya: exist(nama, tipe) mengembalikan kode angka sesuai apa yang ditemukan, sedangkan pasangan modern isfile (R2017b+) dan isfolder (R2017b+) menjawab ya/tidak secara langsung:
Kode exist | Arti | Padanan modern |
|---|---|---|
0 | tidak ada | isfile/isfolder = false |
2 | berkas | isfile = true |
7 | folder | isfolder = true |
fprintf('folder data ada (exist=7): %d\n', exist('data', 'dir'));
fprintf('isfile a.csv: %d\n', isfile(fullfile('data', 'a.csv')));Output yang Dihasilkan:
folder data ada (exist=7): 7
isfile a.csv: 1Mari kita bedah baris-baris kode di atas:
- Baris 1 (
exist('data', 'dir')): argumen'dir'membatasi pencarian ke folder — hasil7membuktikandata/sudah dibuat di bagian sebelumnya. - Baris 2 (
isfile): mengembalikanlogicalyang langsung bisa dipakaiif— bentuk yang lebih ringkas dibanding membandingkanexist(...) == 2. Octave 10 juga menyediakanisfile/isfolder; untuk kompatibilitas versi lama,existtetap jaring pengaman.
mkdir, copyfile, movefile, delete, dan rmdir #
Lima operasi dasar manajemen berkas membentuk siklus hidup proyek. Mekanismenya: mkdir membuat folder (gagal bila sudah ada), copyfile(sumber, tujuan) menyalin, movefile(sumber, tujuan) memindah sekaligus mengganti nama, delete menghapus berkas (mendukung wildcard), dan rmdir menghapus folder yang kosong:
mkdir('output');
copyfile(fullfile('data', 'a.csv'), fullfile('output', 'a.csv'));
fprintf('salinan di output: %d\n', exist(fullfile('output', 'a.csv'), 'file'));
movefile(fullfile('output', 'a.csv'), fullfile('data', 'a2.csv'));
fprintf('a2.csv di data : %d\n', exist(fullfile('data', 'a2.csv'), 'file'));Output yang Dihasilkan:
salinan di output: 2
a2.csv di data : 2Mari kita bedah baris-baris kode di atas:
- Baris 2 (
copyfile): berkasa.csvkini hidup di dua tempat — salinan dioutput/, asli tetap didata/;exist= 2 memastikan salinan lahir. - Baris 4 (
movefile): salinan hilang darioutput/dan muncul sebagaia2.csvdidata/— satu panggilan untuk pindah + ganti nama. - Bersih-bersih:
delete(fullfile('data', '*.csv'))menghapus banyak berkas sekaligus lewat wildcard;rmdir('output')hanya berhasil bila folder kosong — MATLAB menolak menghapus folder yang masih berisi (gunakanrmdir(folder, 's')dengan sangat hati-hati untuk penghapusan rekursif).
Penelusuran Rekursif: Seluruh Berkas di Bawah Folder #
dir menyasar satu level saja. Untuk mengumpulkan semua berkas di bawah folder beserta subfoldernya, kita telusuri dengan tumpukan (stack): ambil satu folder dari tumpukan, daftar isinya, dorong subfolder kembali ke tumpukan, kumpulkan berkas:
mkdir(fullfile('data', 'arsip'));
copyfile(fullfile('data', 'b.csv'), fullfile('data', 'arsip', 'b.csv'));
tumpukan = {'data'};
daftar = {};
while ~isempty(tumpukan)
folder = tumpukan{1};
tumpukan(1) = [];
L = dir(folder);
for k = 1:numel(L)
nama = L(k).name;
if strcmp(nama, '.') || strcmp(nama, '..'), continue; end
path = fullfile(folder, nama);
if L(k).isdir
tumpukan{end+1} = path; % dorong subfolder ke tumpukan
else
daftar{end+1} = path; % kumpulkan berkas
end
end
end
for k = 1:numel(daftar)
fprintf('rekursif: %s\n', daftar{k});
endOutput yang Dihasilkan:
rekursif: data/a.csv
rekursif: data/a2.csv
rekursif: data/b.csv
rekursif: data/catatan.txt
rekursif: data/arsip/b.csvMari kita bedah baris-baris kode di atas:
- Baris 8-9 (
folder = tumpukan{1}): elemen pertama diambil lalu dibuang — folder yang sama tidak diproses dua kali; loop berhenti saat tumpukan kosong. - Baris 15-16 (
tumpukan{end+1} = path): subfolderdata/arsipdidorong dan diproses pada putaran berikutnya — itulah “rekursi” versi iteratif, tanpa fungsi terpisah. - Baris 17-18 (
daftar{end+1} = path): hanya berkas yang dikumpulkan; hasil akhirnya daftarpathlengkap yang siap diberikan kereadtable/textscansatu per satu.
Di MATLAB, pola recursive function (fungsi yang memanggil dirinya untuk tiap subfolder) memberikan hasil yang sama; versi tumpukan di sini dipilih karena berjalan identik di MATLAB dan Octave dalam satu script.
Praktik Proyek: data/ dan output/ #
Struktur minimal yang sehat untuk proyek analisis: data/ untuk berkas masukan (read-only — kode tidak pernah menulis ke sini), output/ untuk hasil, dan folder kerja untuk script. contoh.m pada bagian bawah halaman menerapkan siklus lengkapnya — membuat kedua folder, menulis berkas, meninjau dengan dir, menyalin, memindah, menelusuri rekursif, lalu membersihkan seluruh residue dengan delete + rmdir — sehingga script bisa dijalankan ulang berkali-kali dari kondisi bersih.
Ringkasan #
dir + wildcard memberi inventaris berkas berikut ukurannya; fullfile/filesep menjaga path tetap portabel lintas sistem operasi; exist/isfile/isfolder mencegah operasi buta; mkdir/copyfile/movefile/delete/rmdir membentuk siklus hidup folder proyek; dan penelusuran tumpukan mengumpulkan berkas lintas subfolder. Dengan berkas terkelola, satu tantangan terakhir tersisa: data yang lebih besar dari memori — chapter Bekerja dengan Dataset Besar.