Przejdź do głównej zawartości

System plików

Wymaga znajomości: 1. Pierwszy program - 9. Metody oraz 11. Referencje oraz artykułu o obsłudze plików.

W tym artykule pokażemy Ci jak poprawnie korzystać z systemu plików w języku C++.

Motywacja

Korzystanie z systemu plików jest często niezbędną częścią aplikacji. Programy przechowują swoje dane na dysku komputerowym. Aplikacje biurowe zapisują dokumenty utworzone przez użytkownika. Często korzystają z plików konfiguracyjnych, które również znajdują się na dysku. Gry wideo trzymają modele, dźwięki, tekstury i inną tego typu zawartość wewnątrz swoich plików.

Wstęp

Do obsługi systemu plików będziemy korzystali z nagłówka z biblioteki standardowej:

#include <filesystem>

Dzięki niemu będziemy mogli m.in.:

  • tworzyć i usuwać foldery
  • przeglądać zawartość folderów
  • sprawdzać rozmiar plików
  • sprawdzać czy pliki lub foldery istnieją
Wsparcie kompilatora

Upewnij się, że Twój kompilator wspiera wersję języka C++17 i ten tryb wsparcia jest włączony, ponieważ <filesystem> został dodany do biblioteki standardowej właśnie w tej wersji.

Alias dla filesystem

Uwaga

Ten krok jest opcjonalny.

Ze względu na to, że wszelka funkcjonalność związana z <filesystem> jest zawarta wewnątrz przestrzeni nazw std::filesystem, będziemy dla wygody używać aliasu fs, który tworzymy w ten sposób:

namespace fs = std::filesystem;

Porównanie:

std::filesystem::path("file.txt")
std::filesystem::exists("other_file.txt")
std::filesystem::recursive_directory_iterator("folder")

Powyższy alias możesz umieścić w zależności od preferencji:

  • wewnątrz funkcji, by ograniczyć zakres "działania" aliasu do danego bloku kodu
Details
Przykład
#include <filesystem>

void createSettingsFolder()
{
namespace fs = std::filesystem;

fs::create_directories(fs::current_path() / "settings");
}

void printCurrentPath()
{
namespace fs = std::filesystem;

std::cout << fs::current_path() << '\n';
}
  • zaraz po instrukcji #include <filesystem>, by móc używać go w całym pliku
Details
Przykład
#include <filesystem>

namespace fs = std::filesystem;

void createSettingsFolder()
{
fs::create_directories(fs::current_path() / "settings");
}

void printCurrentPath()
{
std::cout << fs::current_path() << '\n';
}

Przy czym warto podkreślić, że pierwszy sposób jest bezpieczniejszy i powinien być używany, chyba że jesteś dobrze zaznajomiony z przestrzeniami nazw i aliasami i masz absolutną pewność, że wiesz co robisz.

Klasa ścieżki path

auto p = fs::path("C:/plik.txt");

Czy plik istnieje

auto p = fs::path("plik.txt");
std::cout << "Plik " << p << (fs::exists(p) ? "istnieje" : "nie istnieje") << '\n';

Folder roboczy i relatywne ścieżki

std::cout << fs::current_path() << '\n';

Zawartość folderu

Iteracja po zawartości

for (auto entry : fs::directory_iterator("C:/folder"))
{
std::cout << entry.path() << '\n';
}

Iteracja rekursywna

for (auto entry : fs::recursive_directory_iterator("C:/folder"))
{
std::cout << entry.path() << '\n';
}

Więcej przykładów

System plików

Wymaga znajomości: 1. Pierwszy program - 9. Metody oraz 11. Referencje oraz artykułu o obsłudze plików.

W tym artykule pokażemy Ci jak poprawnie korzystać z systemu plików w języku C++.

Motywacja

Korzystanie z systemu plików jest często niezbędną częścią aplikacji. Programy przechowują swoje dane na dysku komputerowym. Aplikacje biurowe zapisują dokumenty utworzone przez użytkownika. Często korzystają z plików konfiguracyjnych, które również znajdują się na dysku. Gry wideo trzymają modele, dźwięki, tekstury i inną tego typu zawartość wewnątrz swoich plików.

Wstęp

Do obsługi systemu plików będziemy korzystali z nagłówka z biblioteki standardowej:

#include <filesystem>

Dzięki niemu będziemy mogli m.in.:

  • tworzyć i usuwać foldery
  • przeglądać zawartość folderów
  • sprawdzać rozmiar plików
  • sprawdzać czy pliki lub foldery istnieją
Wsparcie kompilatora

Upewnij się, że Twój kompilator wspiera wersję języka C++17 i ten tryb wsparcia jest włączony, ponieważ <filesystem> został dodany do biblioteki standardowej właśnie w tej wersji.

Alias dla filesystem

Uwaga

Ten krok jest opcjonalny.

Ze względu na to, że wszelka funkcjonalność związana z <filesystem> jest zawarta wewnątrz przestrzeni nazw std::filesystem, będziemy dla wygody używać aliasu fs, który tworzymy w ten sposób:

namespace fs = std::filesystem;

Porównanie:

std::filesystem::path("file.txt")
std::filesystem::exists("other_file.txt")
std::filesystem::recursive_directory_iterator("folder")

Powyższy alias możesz umieścić w zależności od preferencji:

  • wewnątrz funkcji, by ograniczyć zakres "działania" aliasu do danego bloku kodu
Details
Przykład
#include <filesystem>

void createSettingsFolder()
{
namespace fs = std::filesystem;

fs::create_directories(fs::current_path() / "settings");
}

void printCurrentPath()
{
namespace fs = std::filesystem;

std::cout << fs::current_path() << '\n';
}
  • zaraz po instrukcji #include <filesystem>, by móc używać go w całym pliku
Details
Przykład
#include <filesystem>

namespace fs = std::filesystem;

void createSettingsFolder()
{
fs::create_directories(fs::current_path() / "settings");
}

void printCurrentPath()
{
std::cout << fs::current_path() << '\n';
}

Przy czym warto podkreślić, że pierwszy sposób jest bezpieczniejszy i powinien być używany, chyba że jesteś dobrze zaznajomiony z przestrzeniami nazw i aliasami i masz absolutną pewność, że wiesz co robisz.

Klasa ścieżki path

auto p = fs::path("C:/plik.txt");

Czy plik istnieje

auto p = fs::path("plik.txt");
std::cout << "Plik " << p << (fs::exists(p) ? "istnieje" : "nie istnieje") << '\n';

Folder roboczy i relatywne ścieżki

std::cout << fs::current_path() << '\n';

Zawartość folderu

Iteracja po zawartości

for (auto entry : fs::directory_iterator("C:/folder"))
{
std::cout << entry.path() << '\n';
}

Iteracja rekursywna

for (auto entry : fs::recursive_directory_iterator("C:/folder"))
{
std::cout << entry.path() << '\n';
}

Więcej przykładów