Ketika dikatakan bahwa di Linux semuanya adalah file, maka itu benar adanya. Sebagian besar operasi yang dapat kita lakukan pada file dapat dilakukan pada entitas lain seperti socket, pipe, direktori, dll.
Ada situasi tertentu di mana utilitas perangkat lunak mungkin harus berjalan melintasi direktori di sistem Linux untuk menemukan atau mencocokkan sesuatu. Ini adalah kasus penggunaan di mana programmer utilitas itu harus berurusan dengan pemrograman direktori. Jadi, dalam artikel ini kita akan membahas dasar-dasar pemrograman direktori berikut dengan sebuah contoh.
- Membuat direktori.
- Membaca direktori.
- Menghapus direktori.
- Menutup direktori.
- Mendapatkan direktori kerja saat ini.
Kita akan melihat fungsi-fungsi yang digunakan untuk setiap langkah di atas dan akhirnya kita akan melihat contoh yang akan merangkum semua operasi direktori.
1. Membuat Direktori
Sistem Linux menyediakan panggilan sistem berikut untuk membuat direktori :
#include <sys/stat.h> #include <sys/types.h> int mkdir(const char *pathname, mode_t mode);
Argumen 'pathname' digunakan untuk nama direktori.
Dari halaman manual :
Mode argumen menentukan izin untuk digunakan. Ini dimodifikasi oleh umask proses dengan cara biasa:izin dari direktori yang dibuat adalah (mode &~umask &0777). Bit mode lain dari direktori yang dibuat bergantung pada sistem operasi. Untuk Linux, lihat di bawah.
Direktori yang baru dibuat akan dimiliki oleh ID pengguna efektif dari proses tersebut. Jika direktori yang berisi file memiliki set bit set-group-ID, atau jika sistem file di-mount dengan semantik grup BSD (mount -o bsdgroups atau, secara sinonim mount -o grpid), direktori baru akan mewarisi kepemilikan grup dari induknya; jika tidak maka akan dimiliki oleh ID grup yang efektif dari proses tersebut. Jika direktori induk memiliki bit set-group-ID, maka direktori yang baru dibuat juga demikian.
2. Membaca Direktori
Sebuah keluarga fungsi digunakan untuk membaca isi direktori.
1. Pertama, aliran direktori perlu dibuka. Ini dilakukan dengan panggilan sistem berikut :
#include <sys/types.h> #include <dirent.h> DIR *opendir(const char *name);
Dari halaman manual :
Fungsi opendir() membuka aliran direktori yang sesuai dengan nama direktori, dan mengembalikan pointer ke aliran direktori. Aliran diposisikan pada entri pertama dalam direktori.
2. Selanjutnya, untuk membaca entri dalam direktori, aliran terbuka di atas digunakan oleh panggilan sistem berikut:
#include struct dirent *readdir(DIR *dirp);
Dari halaman manual :
Fungsi readdir() mengembalikan pointer ke struktur dirent yang mewakili entri direktori berikutnya dalam aliran direktori yang ditunjuk oleh dirp. Ini mengembalikan NULL saat mencapai akhir aliran direktori atau jika terjadi kesalahan.
Di Linux, struktur dirent didefinisikan sebagai berikut:
struct dirent { ino_t d_ino; /* inode number */ off_t d_off; /* offset to the next dirent */ unsigned short d_reclen; /* length of this record */ unsigned char d_type; /* type of file; not supported by all file system types */ char d_name[256]; /* filename */ };
3. Menghapus Direktori
Sistem Linux menyediakan panggilan sistem berikut untuk menghapus direktori :
#include <unistd.h> int rmdir(const char *pathname);
Dari halaman manual :
rmdir() menghapus direktori yang diwakili oleh 'pathname' jika kosong. JIKA direktori tidak kosong maka fungsi ini tidak akan berhasil.
4. Menutup direktori
Sistem Linux menyediakan panggilan sistem berikut untuk menutup direktori :
#include <sys/types.h> #include <dirent.h> int closedir(DIR *dirp);
Dari halaman manual :
Fungsi closedir() menutup aliran direktori yang terkait dengan dirp. Panggilan yang berhasil ke closedir() juga menutup deskriptor file dasar yang terkait dengan dirp. Dirp deskriptor aliran direktori tidak tersedia setelah panggilan ini.
5. Mendapatkan Direktori Kerja Saat Ini
Sistem Linux menyediakan panggilan sistem berikut untuk mendapatkan CWD :
#include <unistd.h> char *getcwd(char *buf, size_t size);
Dari halaman manual :
Fungsi getcwd() menyalin nama path absolut dari direktori kerja saat ini ke array yang ditunjuk oleh buf, yang berukuran panjang. Fungsi ini mengembalikan string diakhiri-nol yang berisi nama path absolut yang merupakan direktori kerja saat ini dari proses panggilan. Nama jalur dikembalikan sebagai hasil fungsi dan melalui argumen buf, jika ada. Jika panjang nama path absolut dari direktori kerja saat ini, termasuk penghentian byte null, melebihi ukuran byte, NULL dikembalikan, dan errno disetel ke ERANGE; aplikasi harus memeriksa kesalahan ini, dan mengalokasikan buffer yang lebih besar jika perlu.
6. Contoh
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<dirent.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> int main (int argc, char *argv[]) { if(2 != argc) { printf("\n Please pass in the directory name \n"); return 1; } DIR *dp = NULL; struct dirent *dptr = NULL; // Buffer for storing the directory path char buff[128]; memset(buff,0,sizeof(buff)); //copy the path set by the user strcpy(buff,argv[1]); // Open the directory stream if(NULL == (dp = opendir(argv[1])) ) { printf("\n Cannot open Input directory [%s]\n",argv[1]); exit(1); } else { // Check if user supplied '/' at the end of directory name. // Based on it create a buffer containing path to new directory name 'newDir' if(buff[strlen(buff)-1]=='/') { strncpy(buff+strlen(buff),"newDir/",7); } else { strncpy(buff+strlen(buff),"/newDir/",8); } printf("\n Creating a new directory [%s]\n",buff); // create a new directory mkdir(buff,S_IRWXU|S_IRWXG|S_IRWXO); printf("\n The contents of directory [%s] are as follows \n",argv[1]); // Read the directory contents while(NULL != (dptr = readdir(dp)) ) { printf(" [%s] ",dptr->d_name); } // Close the directory stream closedir(dp); // Remove the new directory created by us rmdir(buff); printf("\n"); } return 0; }
Contoh di atas seharusnya sudah cukup jelas.
Output dari contoh di atas adalah :
# ./direntry /home/himanshu/practice/linux Creating a new directory [/home/himanshu/practice/linux/newDir/] The contents of directory [/home/himanshu/practice/linux] are as follows [redhat] [newDir] [linuxKernel] [..] [ubuntu] [.]