Ini adalah pertanyaan lama, tetapi karena saya menemukannya dan tidak menyelesaikan pertanyaan saya seefektif yang dilakukan halaman manual, saya menyalin cuplikan kode dari halaman manual sebagai jawaban baru untuk masa mendatang.
#include <dirent.h>
int
main(void)
{
struct dirent **namelist;
int n;
n = scandir(".", &namelist, NULL, alphasort);
if (n < 0)
perror("scandir");
else {
while (n--) {
printf("%s\n", namelist[n]->d_name);
free(namelist[n]);
}
free(namelist);
}
}
Fungsi scandir()
mengalokasikan memori untuk Anda.
Anda tidak perlu mengalokasikan memori APAPUN. Anda LAKUKAN perlu membebaskan memori yang dikembalikan kepada Anda oleh scandir()
.
Kode Anda memanggil:*noOfFiles = scandir(path, &fileListTemp, NULL, alphasort);
Kembali, noOfFiles
akan berisi jumlah entri direktori di path
direktori, dan fileListTemp
akan menunjuk ke larik penunjuk yang dialokasikan ke struct dirent yang dialokasikan gumpalan yang masing-masing memiliki d_name member yang menunjuk ke nama file/direktori yang diakhiri null.
Jika direktori Anda berisi file "FirstFile.txt", "AnotherFile.txt", "ThirdFile.txt", misalnya, dengan panggilan Anda, setelah kembali dari scandir()
, noOfFiles
akan disetel ke 5 untuk tiga file ditambah dua lagi untuk "." dan entri direktori "..". MASUKNYA TIDAK AKAN DALAM URUTAN TERTENTU JIKA ANDA TIDAK LULUS 'alphasort'. (Sebenarnya itu sedikit salah. Mereka akan berada dalam urutan entri nama file direktori yang bergantung pada urutan pembuatan file awalnya.)
Karena Anda meneruskan 'alphasort', Anda akan melihat entri dalam urutan berikut (saya secara eksplisit menunjukkan null-byte-string-terminator:
fileListTemp[0]->d_name == ".\0"
fileListTemp[1]->d_name == "..\0"
fileListTemp[2]->d_name == "AnotherFile.txt\0"
fileListTemp[3]->d_name == "FirstFile.txt\0"
fileListTemp[4]->d_name == "ThirdFile.txt\0"
Jadi fileListTemp menunjuk ke blok memori yang dialokasikan yang menampung lima struct dirent pointer. Masing-masing dari lima struct direct pointer menunjuk ke struct dirent blok memori yang dialokasikan berisi nama entri direktori yang diakhiri null di d_name anggota. (Bahkan ini adalah penyederhanaan, karena entri d_name juga merupakan penunjuk, tetapi menunjuk ke ruang ekstra yang dialokasikan di ujung ekor blok yang dialokasikan, dan nama entri disimpan di sana.)
Itu adalah ENAM blok memori yang dialokasikan.
Anda dapat menggunakan memori yang dialokasikan ini hingga selesai, lalu Anda memanggil free() pada SETIAP entri dalam larik diikuti oleh free() dari larik itu sendiri.
Anda HARUS membebaskan setiap entri serta array itu sendiri. Mereka semua adalah blob memori yang dialokasikan secara independen.
Setelah selesai dengan daftar, Anda harus:
for (int i = 0; i < noOfFiles; i++)
{
free(fileListTemp[i];
}
free(fileListTemp);