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ą
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
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:
- 🟡 Bez aliasu
- 🟢 Z aliasem
std::filesystem::path("file.txt")
std::filesystem::exists("other_file.txt")
std::filesystem::recursive_directory_iterator("folder")
fs::path("file.txt")
fs::exists("other_file.txt")
fs::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';
}