Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
C++17-huvudet <filesystem> innehåller typer och funktioner som gör att du kan skriva plattformsoberoende kod för att navigera i filsystemet. Eftersom den är plattformsoberoende innehåller den API:er som inte är relevanta för Windows system. Till exempel is_fifo(const path&) returnerar false alltid på Windows.
Anmärkning
Den här artikeln beskriver det aktuella C++17-biblioteket std::filesystem . Den historiska förstandard-MSVC-implementeringen som togs bort med början i MSVC version 14.51 finns <experimental/filesystem>i .
Overview
<filesystem> Använd API:erna för följande uppgifter:
iterera över filer och kataloger under en angiven sökväg
hämta information om filer, inklusive den tid som skapas, storlek, tillägg och rotkatalog
skapa, dela upp och jämföra sökvägar
skapa, kopiera och ta bort kataloger
kopiera och ta bort filer
Mer information om fil-I/O med hjälp av standardbiblioteket finns i iostream Programming.
Paths
Skapa och skapa sökvägar
Sökvägar i Windows (sedan XP) lagras internt i Unicode. Klassen path utför automatiskt alla nödvändiga strängkonverteringar. Den accepterar argument för både breda och smala teckenmatriser och både std::string och std::wstring typer som formateras som UTF8 eller UTF16. Klassen path normaliserar också sökvägsavgränsare automatiskt. Du kan använda ett enda snedstreck som katalogavgränsare i konstruktorargument. Med den här avgränsaren kan du använda samma strängar för att lagra sökvägar i både Windows- och UNIX-miljöer:
path pathToDisplay(L"/FileSystemTest/SubDir3"); // OK!
path pathToDisplay2(L"\\FileSystemTest\\SubDir3"); // Still OK as always
path pathToDisplay3(LR"(\FileSystemTest\SubDir3)"); // Raw string literals are OK, too.
Om du vill sammanfoga två sökvägar kan du använda de överlagrade / operatorerna och /= operatorerna, som är analoga med operatorerna + och += på std::string och std::wstring. Objektet path tillhandahåller avgränsarna om du inte gör det.
path myRoot("C:/FileSystemTest"); // no trailing separator, no problem!
myRoot /= path("SubDirRoot"); // C:/FileSystemTest/SubDirRoot
Undersöka sökvägar
Sökvägsklassen har flera metoder som returnerar information om olika delar av själva sökvägen. Den här informationen skiljer sig från den information om filsystementiteten som den kan referera till. Du kan hämta roten, den relativa sökvägen, filnamnet, filtillägget med mera. Du kan iterera över ett sökvägsobjekt för att undersöka alla mappar i hierarkin. I följande exempel visas hur du itererar över ett sökvägsobjekt. Och hur du hämtar information om dess delar.
// filesystem_path_example.cpp
// compile by using: /EHsc /W4 /permissive- /std:c++17 (or later)
#include <string>
#include <iostream>
#include <sstream>
#include <filesystem>
using namespace std;
using namespace std::filesystem;
wstring DisplayPathInfo()
{
// This path may or may not refer to an existing file. We are
// examining this path string, not file system objects.
path pathToDisplay(L"C:/FileSystemTest/SubDir3/SubDirLevel2/File2.txt ");
wostringstream wos;
int i = 0;
wos << L"Displaying path info for: " << pathToDisplay << endl;
for (path::iterator itr = pathToDisplay.begin(); itr != pathToDisplay.end(); ++itr)
{
wos << L"path part: " << i++ << L" = " << *itr << endl;
}
wos << L"root_name() = " << pathToDisplay.root_name() << endl
<< L"root_path() = " << pathToDisplay.root_path() << endl
<< L"relative_path() = " << pathToDisplay.relative_path() << endl
<< L"parent_path() = " << pathToDisplay.parent_path() << endl
<< L"filename() = " << pathToDisplay.filename() << endl
<< L"stem() = " << pathToDisplay.stem() << endl
<< L"extension() = " << pathToDisplay.extension() << endl;
return wos.str();
}
int main()
{
wcout << DisplayPathInfo() << endl;
// wcout << ComparePaths() << endl; // see following example
wcout << endl << L"Press Enter to exit" << endl;
wstring input;
getline(wcin, input);
}
Koden genererar följande utdata:
Displaying path info for: C:\FileSystemTest\SubDir3\SubDirLevel2\File2.txt
path part: 0 = C:
path part: 1 = \
path part: 2 = FileSystemTest
path part: 3 = SubDir3
path part: 4 = SubDirLevel2
path part: 5 = File2.txt
root_name() = C:
root_path() = C:\
relative_path() = FileSystemTest\SubDir3\SubDirLevel2\File2.txt
parent_path() = C:\FileSystemTest\SubDir3\SubDirLevel2
filename() = File2.txt
stem() = File2
extension() = .txt
Jämföra sökvägar
Klassen path överbelastar samma jämförelseoperatorer som std::string och std::wstring. När du jämför två sökvägar gör du en strängjämförelse när avgränsarna har normaliserats. Om ett avslutande snedstreck (eller omvänt snedstreck) saknas läggs det inte till och det påverkar jämförelsen. I följande exempel visas hur sökvägsvärden jämförs:
wstring ComparePaths()
{
path p0(L"C:/Documents"); // no trailing separator
path p1(L"C:/Documents/"); // p0 < p1
path p2(L"C:/Documents/2013/"); // p1 < p2
path p3(L"C:/Documents/2013/Reports/"); // p2 < p3
path p4(L"C:/Documents/2014/"); // p3 < p4
path p5(L"D:/Documents/2013/Reports/"); // p4 < p5
wostringstream wos;
wos << boolalpha <<
p0.wstring() << L" < " << p1.wstring() << L": " << (p0 < p1) << endl <<
p1.wstring() << L" < " << p2.wstring() << L": " << (p1 < p2) << endl <<
p2.wstring() << L" < " << p3.wstring() << L": " << (p2 < p3) << endl <<
p3.wstring() << L" < " << p4.wstring() << L": " << (p3 < p4) << endl <<
p4.wstring() << L" < " << p5.wstring() << L": " << (p4 < p5) << endl;
return wos.str();
}
C:\Documents < C:\Documents\: true
C:\Documents\ < C:\Documents\2013\: true
C:\Documents\2013\ < C:\Documents\2013\Reports\: true
C:\Documents\2013\Reports\ < C:\Documents\2014\: true
C:\Documents\2014\ < D:\Documents\2013\Reports\: true
Om du vill köra den här koden klistrar du in den i det fullständiga exemplet ovan och main avkommentarer den rad som anropar den i main.
Konvertera mellan sökvägs- och strängtyper
Ett path objekt kan implicit konverteras till std::wstring eller std::string. Det innebär att du kan skicka en sökväg till funktioner som wofstream::open, som du ser i det här exemplet:
// filesystem_path_conversion.cpp
// compile by using: /EHsc /W4 /permissive- /std:c++17 (or later)
#include <string>
#include <iostream>
#include <fstream>
#include <filesystem>
using namespace std;
using namespace std::filesystem;
int main()
{
const wchar_t* p{ L"C:/Users/Public/Documents" };
path filePath(p);
filePath /= L"NewFile.txt";
// Open, write to, and close the file.
wofstream writeFile(filePath, ios::out); // implicit conversion
writeFile << L"Lorem ipsum\nDolor sit amet";
writeFile.close();
// Open, read, and close the file.
wifstream readFile;
wstring line;
readFile.open(filePath); // implicit conversions
wcout << L"File " << filePath << L" contains:" << endl;
while (readFile.good())
{
getline(readFile, line);
wcout << line << endl;
}
readFile.close();
wcout << endl << L"Press Enter to exit" << endl;
wstring input;
getline(wcin, input);
}
File C:\Users\Public\Documents\NewFile.txt contains:
Lorem ipsum
Dolor sit amet
Press Enter to exit
Iterera kataloger och filer
Rubriken <filesystem> innehåller den typ som directory_iterator ska iterera över enskilda kataloger och recursive_directory_iterator klassen för att iterera rekursivt över en katalog och dess underkataloger. När du har konstruerat en iterator genom att skicka ett path objekt pekar iteratorn på den första directory_entry i sökvägen. Skapa slut iteratorn genom att anropa standardkonstruktorn.
När du itererar via en katalog finns det flera typer av objekt som du kan upptäcka. Dessa objekt omfattar kataloger, filer, symboliska länkar, socketfiler och andra.
directory_iterator Returnerar dess objekt som directory_entry objekt.