Pengalaman menggunakan Compiler C++17
Pengalaman menggunakan Compiler C++17 yang nanti saya bagikan bukan mengenai dasar-dasar C++ tapi lebih kepada praktek manajemen file dan folder. Kenapa menggunakan C++? karena butuh native application yang bisa berjalan tanpa ribet kudu install ini dan itu. Membuat aplikasi low level bisa menggunakan C/C++ harus paham mengenai API di Windows atau Linux butuh effort yang cukup mengingat banyak sekali menggunakan pointer dan terlalu teknis untuk digunakan. Tidak seperti bahasa tingkat tinggi lainnya seperti python, C#, net framework, Java. Contoh yang saya bahas yaitu untuk urusan create directory saja agak ribet atau untuk search file recursive
Compiler C++ 17
Contents
Perkembangan bahasa C++ sudah sangat maju mengingat bahasa ini digunakan untuk membuat bahasa lainnya seperti Java/Python. Banyak sekali perkembangan compiler C++ setidaknya tahun 2017 telah diluncurkan standar baru versi 17. Adapaun versi terakhir yaitu C++ 23. https://en.cppreference.com/w/cpp/compiler_support
Oiya untuk tools saya lebih suka menggunakan compiler MinGW serta code block sebagai IDE nya karena lebih alasan teknis saja yaitu ringan dan cepat
create directory
Menggunakan compiler C++ 17 akan mempermudah penggunaan coding sehari-hari. Sebagai contohnya saja sebelum saya menggunakan compiler C++ 17, untuk urusan membuat create sub directory saja tidak bisa, harus dilakukan satu-persatu. Sebagai contoh untuk penggunaan header Windows.h
menggunakan compiler sebelumnya
#include <iostream> #include <Windows.h> using namespace std; int main() { CreateDirectory("D:/temp/satu/", NULL); cout << "Hello world!" << endl; return 0; }
Bila di compile dan run, maka tidak akan ter create folder temp dan satu harus dilakukan satu-persatu terlebih dahulu, misalkan create temp dilanjutkan create satu
CreateDirectory("D:/temp/", NULL); CreateDirectory("D:/temp/satu/", NULL);
Menggunakan compiler C++ 17
sekarang kita coba saja dengan Compiler C++ 17 yang bisa kalian download https://nuwen.net/mingw.html dengan menggunakan filesystem, maka urusan untuk create sub folder dapat dilakukan dengan mudah
#include <iostream> #include <filesystem> using namespace std; namespace fs = std::filesystem; int main() { fs::create_directories("D:/sandbox/a/b"); cout << "Hello world!" << endl; return 0; }
untuk lebih jelasnya mengenai create_directories bisa baca https://en.cppreference.com/w/cpp/filesystem/create_directory
search file secara recursif
Untuk mencari sebuah file secara recursif di compiler kodenya cukup panjang. API Windows yang berkenaan dengan file dan folder yaitu #include <dirent.h>
. Saya buatkan search file secara recursif dan looping akan berhenti bila terdapat 1 file dengan nama yang sama biasanya disebut dengan search first file untuk menghindari penggunaan CPU Usage yang tinggi, saya juga menggunakan Sleep() dari API #include <Windows.h>
sebanyak 1 /1000 detik
menggunakan compiler sebelumnya
Tugas ini sederhana saja yaitu untuk mencari lokasi sebuah file dan ketika menemukannya break looping
#include <iostream> #include <Windows.h> #include <dirent.h> # directory windows using namespace std; void cariFile(string lokasi_folder,string nama_file){ string lokasi_file = ""; DIR *directory; struct dirent *x; if((directory=opendir(lokasi_folder.c_str()))!=NULL){ //artinya exist while((x=readdir(directory))!=NULL){ Sleep(1); string h = lokasi_folder+x->d_name; if(strcmp(x->d_name,nama_file.c_str())==0){ cout<<"DITEMUKAN DILOKASI: "<<h<<endl; closedir (directory); //biar nggak keblabasan kalau sudah break! break; } if(strcmp(x->d_name,".") && strcmp(x->d_name,"..")){ cout<<h<<endl; } if(strcmp(x->d_name,".")==1 && strcmp(x->d_name,"..")==1){ //artinya sebuah folder diluar folder parent h = h+"/"; cariFile(h,nama_file); } } closedir (directory); //close directory.... } } int main() { cariFile("D:/","mulkan.txt"); cout << "Hello world!" << endl; return 0; }
Kodenya lumayan panjang sekali, perintah diatas yaitu mencari file dengan nama mulkan.txt untuk partisi D:/ tapi ketika lokasi file tersebut jauh didalam subdirectory maka function diatas terkadang bablas begitu saja padahal sudah dikasih break dan closedir(directory) sehingga looping akan terus bekerja ke subdirectory lainnya sampai habis. Ntah apa yang salah dengan rekursif diatas! Seharusnya ketika file telah ditemukan maka proses looping akan berhenti!
menggunakan compiler sebelumnya dengan variabel global
Saya sudah modifikasi dan tentu menggunakan variabel global RESULT untuk menghentikan rekursif diatas serta pengecekan sebuah file atau folder menggunakan stats
#include <iostream> #include <Windows.h> #include <dirent.h> # directory windows #include <sys/types.h> #include <sys/stat.h> using namespace std; bool RESULT = false; void cariFile(string lokasi_folder,string nama_file){ string lokasi_file = ""; DIR *directory; struct dirent *x; if((directory=opendir(lokasi_folder.c_str()))!=NULL){ //artinya exist while((x=readdir(directory))!=NULL && RESULT==false){ Sleep(1); string h = lokasi_folder+x->d_name; if(strcmp(x->d_name,".")==1 && strcmp(x->d_name,"..")==1){ //artinya sebuah folder diluar folder parent /* untuk cek file atau folder?? https://stackoverflow.com/questions/30877110/how-to-determine-directory-or-file-in-linux-in-c */ struct stat filestat; stat(h.c_str(), &filestat); if(filestat.st_mode==16895){ //adalah sebuah folder! h = h+"/"; cout<<h<<endl; cariFile(h,nama_file); }else{ cout<<h<<endl; if(strcmp(x->d_name,nama_file.c_str())==0){ cout<<"DITEMUKAN DILOKASI: "<<h<<endl; closedir (directory); //biar nggak keblabasan kalau sudah break! RESULT = true; //untuk hentikan looping rekursif } } } } closedir (directory); //close directory.... } } int main() { cariFile("D:/ultah kea/","mulkan.txt"); cout << "Hello world!" << endl; return 0; }
Penggunaan dirent.h
diatas, saya ambil dari http://www.cplusplus.com/forum/beginner/80465/ dan diberikan modifikasi untuk searching file
Menggunakan compiler C++ 17
Bila menggunakan compiler C++17 maka proses ini pun cukup sederhana saja cukup menggunakan directory_iterator
#include <iostream> #include <filesystem> #include <dirent.h> using namespace std; namespace fs = std::filesystem; int main() { /* https://en.cppreference.com/w/cpp/filesystem/directory_iterator */ const std::filesystem::path sandbox{"D:/ultah kea/"}; for (auto const& dir_entry : std::filesystem::recursive_directory_iterator{sandbox}) { /* https://en.cppreference.com/w/cpp/filesystem/path/filename */ //cout<<fs::path(dir_entry).filename()<<endl; fs::path nama_file = fs::path(dir_entry).filename(); if(strcmp(nama_file.string().c_str(),"mulkan.txt")==0){ std::cout << "lokasinya : "<<dir_entry << '\n'; break; } } return 0; }
Lebih jelasnya cara menggunakan iterator directory yaitu
- https://en.cppreference.com/w/cpp/filesystem/directory_iterator
- https://en.cppreference.com/w/cpp/filesystem/path/filename
Bagaimana menurut kalian? feature yang ada di C++ saat ini sudah banyak mempermudah pekerjaan untuk urusan file dan folder