C++17 özellikleri: Filesystem

C++ için “batteries not included” denmesinin bir sebebi var. Java ve .NET dillerinin en başından beri desteklediği bazı şeyler C++‘da ‘standard’ olarak yok. Mesela bir grafik arayüz yapmak veya network üzerinde bir iş yapmak isterseniz, bunlar için kütüphane bulabilirsiniz ama bunlar standard değil.

C++ komitesi Boost’taki önemli özellikleri Standarda ekleme kararı aldı ve filesystem de bunlardan biri. <filesystem> kütüphenesinde tanımlandı ve std::filesystem isim uzayını kullanıyor.

Derleyicilerin standardı implemente etmede ne durumda olduğunu buradan görebilirsiniz.

Ben Visual Studio Community 2017 Versiyon 15.7.2 kullanarak bazı örnekler denedim.

Önce ortamı hazırlayalım :)

#include <filesystem>
#include <iostream>

using namespace std;
using namespace std::filesystem;

sonra bir dizin yol oluşturalım ve yazdıralım:

    path p = current_path();

    if (exists(p)) // yolun var olduğunu kontrol eder.
        cout << p << endl;
  • Yolu parçalar halinde yazdırabiliriz:
    for (auto i = p.begin(); i != p.end(); i++)
        cout << *i << endl;

veya

    for (const auto& x : p)
        cout << x << endl;  

bende aşağıdaki çıktıyı veriyor;

       "C:\\Users\\Adem\\source\\repos\\filesystemTryouts\\filesystemTryouts" 

path sınıfının pek çok üye fonksiyonu var:

    cout << is_directory(p) << endl     // 1
        << p.empty() << endl            // 0
        << p.root_name() << endl        // "C:"
        << p.root_path() << endl        // "C:\\"
        << p.root_directory() << endl   // "\\"
        << p.relative_path() << endl    // "Users\\Adem\\source\\repos\\filesystemTryouts\\filesystemTryouts"
        << p.has_parent_path() << endl  // 1
        << p.parent_path() << endl      // "C:\\Users\\Adem\\source\\repos\\filesystemTryouts"
        << p.filename() << endl         //"filesystemTryouts"
        << p.stem() << endl             // "filesystemTryouts"
        << p.has_extension() << endl    // 0
        << p.extension() << endl;       // ""
  • Bir dizini dolaşabiliriz:

    for (const auto& x : directory_iterator(p))
        cout << x.path().string() << endl;
    
        C:\Users\Adem\source\repos\filesystemTryouts\filesystemTryouts\Debug
        C:\Users\Adem\source\repos\filesystemTryouts\filesystemTryouts\filesystemTryouts.cpp
        ...
    
  • Bir dizini, alt dizinleriyle beraber dolaşabiliriz:

    for (const auto& x : recursive_directory_iterator(p))
        cout << x.path().string() << endl;
        C:\Users\Adem\source\repos\filesystemTryouts\filesystemTryouts\Debug
        C:\Users\Adem\source\repos\filesystemTryouts\filesystemTryouts\Debug\filesyst.B43CA10B.tlog
        C:\Users\Adem\source\repos\filesystemTryouts\filesystemTryouts\Debug\filesyst.B43CA10B.tlog\CL.command.1.tlog
        ... 
  • Yeni bir dizin oluşturabiliriz:
    create_directories(p / "a/b/c");
  • Bir dizindeki dosyaları ötekine kopyalayabiliriz:
    copy(p / "Debug", p / "a");
  • Bir dizini kaldırabiliriz:

    remove(p / "a");
    

    veya

    auto i = remove_all(p / "a");
    cout << i << "files removed" << endl;
    
  • Bir dizin içeriğinin diskteki boyutunu görebiliriz (byte cinsinden):

    cout << file_size(p);
    

C++17

324 Words

2018-06-12 03:00 +0300