C++’da Dosya Sistemi Yönetimi (Filesystem)

Uzun zamandır blok yazısı yazmayı bıraktıktan sonra C++’da klasör yönetimi için nasıl kod yazarım konusunda yaptığım araştırmalarda C++17 standartı içerisinde artık dosya sistemi yönetimi için bir özelliğin standart kütüphaneye dahil edilmiş olduğunu gördüm. Bilindiği üzere dosya sistemi işletim sistemi ve kullandığı dosya yönetim yapısına göre farklılık arzettiği için C++’ın ilk tasarımında bu özellik için bir kütüphane ekli değildi. Dosya işlemlerini yapmak için hangi işletim sistemi için kodlama yapıyorsak o işletim sisteminin dosya yönetim mantalitesine uygun kütüphaneleri eklememiz gerekiyordu.

C++17 sürümünde artık <filesystem> adında bir kütüphane ile bu özellikler tek çatı altında toplanmıştır. Sürecin ilerlemesi ve konu hakkında detaylara bakacakları aşağıdaki siteleri incelemeye davet ederim.

CppReference::FileSystem & CppReference::FileSystem Documentation (Deneme aşamasında)

CppReference sitesinde filesystem kütüphanesinin Boost.FileSystem kütüphanesinden esinlenerek tasarlandığı beriltilmektedir. Bu nedenle İnternette kullanımı ile ilgili yeterince örnek göremeyen arkadaşlara Boost’un sayfasındaki örnekleri incemeyi tavsiye ederim. Bu sayfada filesystem kütüphanesi ile yapılan her işlem için bir örnek gösterilmektedir.

Aşağıda benim için gerekli olan bir klasör altındaki belli bir uzantıya sahip dosyaları bulan ve bunların adlarını listeleyen bir örnek gösterilmektedir.

/* In this example I want to show basic folder operations in C++. Here We have a modern approch introduced in C++17 standart. In the documentation from C++reference site (https://en.cppreference.com/w/cpp/experimental/fs) we see that it is directly based on Boost.Filesystem library https://www.boost.org/doc/libs/1_75_0/libs/filesystem/doc/index.htm In boost web site you can find more documenatation which is also adaptable to cpp std::filesystem library. Note that there is a warning about the underlying filesystem. Some features are not in stable statu in all filesystems. */ #include <iostream> #include <fstream> #include <filesystem> //https://en.cppreference.com/w/cpp/filesystem using namespace std; using namespace std::filesystem; int main() { try { path p(".\\"); //gets the current path. if (!is_directory(p)) { cout << "!not in a accessable directory!" << endl; return 1; } cout << "Current Path:" << absolute(p) << endl; cout << "--------------------------------------" << endl; cout << "Text (.txt) files in this folder" << endl; cout << "--------------------------------------" << endl; for (const directory_entry& dre : directory_iterator(p)) { if (!is_directory(dre)) // is a file { if (dre.path().extension() == ".txt") { cout << dre.path().filename() << endl; } } } } catch (const filesystem_error& ex) { cout << ex.what() << endl; } }
Code language: C++ (cpp)

Not: Bu kod parçasının derlenebilmesi için derleyicinizde C++17 seçilmiş olması ve filesystem kütüphanesinin derleme işlemine tabi olması aynı zamanda üzerinde derleme yaptığınız sistemin uygun bir dosya sistemi kullanıyor olması gerekmektedir. GNU Compiler ve LLVM için gerekli bilgi Filesystem library – cppreference.com sayfasında verilmektedir.

Eğer Visual Studio2019 veya daha üst bir sürüm ile derleme yapıyorsanız projenizin ayarlarından C++17 derleme rutinini aktive etmeniz gerekmektedir. Bunun için Solution Explorer penceresinde projenize sağ tıklayarak Properties ekranını açarak ilgili ayarı seçebilirsiniz. Aşağıda olması gereken proje özellikleri gösterilmektedir.

Solution Explorer -> Your C++ project -> Properties

Yukarıdaki uygulamayı çalıştırdığınızda aktif klasör bilgisini ve bu klasörde bulunan .txt uzantılı dosyaları konsol ekranına basan aşağıdaki gibi bir çıktı elde edeceksiniz.

Uygulamanın çalıştırılması sonucu örnek ekran görüntüsü

Bu yazı C++ kategorisine gönderilmiş ve , , , ile etiketlenmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.