Nawigacja w systemie plikówFile System Navigation

<Filesystem > implementuje nagłówka C++ 18822:2015 TS ISO/IEC specyfikacji technicznych systemu plików (ostatecznego projektu: ISO/IEC JTC 1/SC 22/WG 21 N4100) i zawiera typy i funkcje, które umożliwiają pisanie kodu niezależne od platformy do nawigowania w systemie plików.The <filesystem> header implements the C++ File System Technical Specification ISO/IEC TS 18822:2015 (Final draft: ISO/IEC JTC 1/SC 22/WG 21 N4100) and has types and functions that enable you to write platform-independent code for navigating the file system. Ponieważ jest dla wielu platform, zawiera interfejsy API, które nie są istotne dla systemu Windows.Because it is cross-platform, it contains APIs that are not relevant for Windows systems. Oznacza to, że na przykład is_fifo(const path&) zawsze zwraca false na Windows.For example, this means that is_fifo(const path&) always returns false on Windows.

OmówienieOverview

Użyj <filesystem > interfejsy API w celu uwzględnienia poniższych zadań:Use the <filesystem> APIs for the following tasks:

  • Iteracja plików i katalogów w określonej ścieżceiterate over files and directories under a specified path

  • uzyskać informacje na temat plików w tym momencie tworzenia, rozmiar, rozszerzenia i katalog głównyget information about files including the time created, size, extension, and root directory

  • narzędzia Compose, rozkładania i porównywanie ścieżkicompose, decompose, and compare paths

  • Tworzenie, kopiowanie i usuwanie katalogówcreate, copy and delete directories

  • Kopiuj i usuwaj plikicopy and delete files

Aby uzyskać więcej informacji na temat we/wy pliku przy użyciu standardowej biblioteki zobacz iostream Programming.For more information about File IO using the Standard Library, see iostream Programming.

ŚcieżkiPaths

Konstruowanie i tworzenie ścieżkiConstructing and composing paths

Ścieżki w Windows (od XP) są przechowywane w natywnie w formacie Unicode.Paths in Windows (since XP) are stored natively in Unicode. Ścieżki klasy automatycznie wykonuje wszystkie konwersje niezbędne parametry.The path class automatically performs all necessary string conversions. Akceptuje argumenty zarówno szerokiej i tablice wąskiego znaku, a także std::string i std::wstring typy w formacie UTF8 lub UTF16.It accepts arguments of both wide and narrow character arrays, as well as std::string and std::wstring types formatted as UTF8 or UTF16. path Klasy również automatycznie normalizuje separatorami ścieżki.The path class also automatically normalizes path separators. Pojedynczy ukośnik służy jako separator katalogu w argumentach konstruktora.You can use a single forward slash as a directory separator in constructor arguments. Dzięki temu można używać tego samego ciągów do przechowywania ścieżek w środowiskach Windows i UNIX:This enables you to use the same strings to store paths in both Windows and UNIX environments:

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.

Do łączenia dwóch ścieżek, można użyć przeciążonej / i /= operatorów, które są analogiczne do + i += operatory na std::string i std::wstring.To concatenate two paths, you can use the overloaded / and /= operators, which are analogous to the + and += operators on std::string and std::wstring. path Obiektu wygodnie będzie dostarczać separatory, jeśli nie istnieje.The path object will conveniently supply the separators if you don’t.

path myRoot("C:/FileSystemTest");  // no trailing separator, no problem!
myRoot /= path("SubDirRoot");      // C:/FileSystemTest/SubDirRoot

Badanie ścieżekExamining paths

Klasa ścieżka ma kilka metod, które zwracają informacje dotyczące różnych części ścieżki, jak różniący się od jednostki systemu plików, którego może dotyczyć.The path class has several methods that return information about various parts of the path itself, as distinct from the file system entity it might refer to. Można uzyskać katalogu głównego, ścieżki względnej, nazwę pliku i rozszerzenie pliku.You can get the root, the relative path, the file name, the file extension, and more. Użytkownik może przejść przez obiekt ścieżki, aby sprawdzić wszystkie foldery w hierarchii.You can iterate over a path object to examine all the folders in the hierarchy. Poniższy przykład pokazuje, jak iteracji ścieżki (nie do katalogu, który odwołuje się do) i pobieranie informacji o jego części.The following example shows how to iterate over a path (not the directory it refers to), and to retrieve information about its parts.

// filesystem_path_example.cpp
// compile by using: /EHsc
#include <string>
#include <iostream>
#include <sstream>
#include <filesystem>

using namespace std;
using namespace std::experimental::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();
}

void main(int argc, char* argv[])
{
    wcout << DisplayPathInfo() << endl;
    // wcout << ComparePaths() << endl; // see following example
    wcout << endl << L"Press Enter to exit" << endl;
    wstring input;
    getline(wcin, input);
}

Kod generuje te dane wyjściowe:The code produces this output:

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

Porównywanie ścieżkiComparing paths

path Klasy przeciążenia tej samej operatory porównania jako std::string i std::wstring.The path class overloads the same comparison operators as std::string and std::wstring. Podczas porównywania dwóch ścieżek po mają zostać znormalizowane separatory są wykonywane porównywania ciągów.When you compare two paths, you are performing a string comparison after the separators have been normalized. Jeśli brakuje ukośnika (lub ukośnik odwrotny) nie jest dodawany i wpływa na wynik porównania.If a trailing slash (or backslash) is missing it is not added and affects the comparison. W poniższym przykładzie pokazano, jak porównanie wartości ścieżek:The following example demonstrates how path values compare:

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

Aby uruchomić ten kod, wklej go w pełnym przykładzie powyżej przed main i usuń znaczniki komentarza, który ją wywołuje w głównym oknie.To run this code, paste it into the full example above before main and uncomment the line that calls it in main.

Konwertowanie między typami ścieżki i parametryConverting between path and string types

A path obiekt jest niejawnie konwertowany na std::wstring lub std::string.A path object is implicitly convertible to std::wstring or std::string. Oznacza to, że można podać ścieżkę do funkcji takich jak wofstream::open, jak pokazano w poniższym przykładzie:This means you can pass a path to functions such as wofstream::open, as shown in this example:

// filesystem_path_conversion.cpp
// compile by using: /EHsc
#include <string>
#include <iostream>
#include <fstream>
#include <filesystem>

using namespace std;
using namespace std::experimental::filesystem;

void main(int argc, char* argv[])
{
    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

Iteracja plików i katalogówIterating directories and files

<Systemu plików > zawiera nagłówek directory_iterator typu do wykonywania iteracji jednego katalogów i recursive_directory_iterator klasy do wykonywania iteracji cyklicznie katalog i jego podkatalogach.The <filesystem> header provides the directory_iterator type to iterate over single directories, and the recursive_directory_iterator class to iterate recursively over a directory and its subdirectories. Po utworzenia iterator przez przekazanie jej path obiektu iterator który wskazuje na pierwszy directory_entry w ścieżce.After you construct an iterator by passing it a path object, the iterator points to the first directory_entry in the path. Utwórz iteratora zakończenia przez wywołanie konstruktora domyślnego.Create the end iterator by calling the default constructor.

Podczas iteracji w katalogu, istnieje kilka rodzajów elementów, które można napotkać, w tym między innymi do katalogów, plików, linki symboliczne i plików gniazda.When iterating through a directory, there are several kinds of items you might encounter, including but not limited to directories, files, symbolic links, and socket files. directory_iterator Zwraca jego elementów jako directory_entry obiektów.The directory_iterator returns its items as directory_entry objects.