C++'ta Dosya Boyutu Almak

C++17'den önce, dosya boyutu almak gibi basit işlerin bile karmaşık olduğundan şikayet edilebilirdi. std::filesystem ile işler biraz daha kolaylaşıyor!

C++17'den önce STL, bir dosya sistemiyle çalışmak için hiçbir doğrudan olanak içermiyordu. Yalnızca Boost gibi üçüncü parti kütüphaneler veya işletim sistemlerinin sistem UPA'ları kullanabilirdi.

Dosya boyutunu elde etmek için popüler bir teknik bir dosyayı açmak ve ardından dosyanın boyutunu hesaplamak için dosya konum işaretçisini kullanmaktı. stream kütüphanesini kullanan bir örnek şuradan görülebilir. Programla elde ettiğimiz değer, 38100108. Dosya boyutunun Dolphin'de görünüşü de şu şekilde:


std::filesystem ile Dosya Boyutu

C++17, dosyalar ve dizinler üzerinde birçok görevi düzene sokan std::filesystem'ı sunmaya başlamıştır. Sadece hızlı bir şekilde dosya boyutunu, özniteliklerini elde etmekle kalmaz, aynı zamanda yeni dizinler oluşturabilir, dosyalar arasında ilerleyebilir, yol nesneleriyle çalışabilirsiniz.

Yeni kütüphane bize kullanabileceğimiz iki fonksiyon veriyor:
  • std::uintmax_t std::filesystem::file_size( const std::filesystem::path& p );
  • std::uintmax_t std::filesystem::directory_entry::file_size() const;
Bunlardan birincisi std::filesystem içindeki serbest bir fonksiyondur, ikincisiyse bir directory_entry metodudur. Biri serbest fonksiyon ve diğeri de yöntem olmak üzere neden iki yönteme sahip olduğumuzu merak edebilirsiniz. Bunun nedeni, directory_entry'nin dosya özniteliklerini önbelleklemesidir. Bu nedenle, bir dizin üzerinde ilerlerseniz veya bir dosyaya birkaç kez erişirseniz, önbellekleme performans iyileştirmeleri sağlayabilir.

Örneğin, buradaki kodla bir dosyanın boyutunu alabiliriz. Eğer error_codes'u da kullanmak istersek şöyle bir kod parçası yazabiliriz.

Bu kısa örneklerle, std::filesystem'daki file_size fonksiyonunun nasıl kullanılacağını gördük. Dosya ve dizinlerle çalışıyorsanız, kodunuzu çok daha rahat ve taşınabilir hale getirebilirsiniz. C++17'de bu ve bunun gibi pek çok güçlü ekleme keşfedilmeyi bekliyor.

Not: Örnekleri GitHub Gist üzerinde tek bir girdiye eklediğim için yazının ilgili bölümlerine ekleyemedim ama hepsini toplu olarak aşağıda görebilirsiniz:

Kaynak

Yorumlar

Bu blogdaki popüler yayınlar

Diğer Dillerde Hoşçakal

Mızıka Tabları Nasıl Okunur

conio.h