Skip to content

Commit 0ea52d0

Browse files
authored
Merge pull request #2805 from corob-msft/cr-file-system-navigation
Fix broken examples in filesystem navigation
2 parents 74f05fc + 710909e commit 0ea52d0

File tree

1 file changed

+16
-15
lines changed

1 file changed

+16
-15
lines changed

docs/standard-library/file-system-navigation.md

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
---
22
title: "File System Navigation"
3-
ms.date: "11/04/2016"
3+
description: "How to use the C++ Standard library filesystem APIs to navigate the file system."
4+
ms.date: "04/13/2020"
45
ms.assetid: f7cc5f5e-a541-4e00-87c7-a3769ef6096d
56
---
67
# File System Navigation
78

8-
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](https://wg21.link/n4100)) and has types and functions that enable you to write platform-independent code for navigating the file system. Because it is cross-platform, it contains APIs that are not relevant for Windows systems. For example, this means that `is_fifo(const path&)` always returns **false** on Windows.
9+
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](https://wg21.link/n4100)) and has types and functions that enable you to write platform-independent code for navigating the file system. Because it's cross-platform, it contains APIs that aren't relevant for Windows systems. For example, `is_fifo(const path&)` always returns **false** on Windows.
910

1011
## Overview
1112

@@ -17,7 +18,7 @@ Use the \<filesystem> APIs for the following tasks:
1718

1819
- compose, decompose, and compare paths
1920

20-
- create, copy and delete directories
21+
- create, copy, and delete directories
2122

2223
- copy and delete files
2324

@@ -27,7 +28,7 @@ For more information about File IO using the Standard Library, see [iostream Pro
2728

2829
### Constructing and composing paths
2930

30-
Paths in Windows (since XP) are stored natively in Unicode. The [path](../standard-library/path-class.md) class automatically performs all necessary string conversions. It accepts arguments of both wide and narrow character arrays, as well as `std::string` and `std::wstring` types formatted as UTF8 or UTF16. The `path` class also automatically normalizes path separators. You can use a single forward slash as a directory separator in constructor arguments. This enables you to use the same strings to store paths in both Windows and UNIX environments:
31+
Paths in Windows (since XP) are stored natively in Unicode. The [path](../standard-library/path-class.md) class automatically does all necessary string conversions. It accepts arguments of both wide and narrow character arrays, and both `std::string` and `std::wstring` types formatted as UTF8 or UTF16. The `path` class also automatically normalizes path separators. You can use a single forward slash as a directory separator in constructor arguments. This separator lets you use the same strings to store paths in both Windows and UNIX environments:
3132

3233
```cpp
3334
path pathToDisplay(L"/FileSystemTest/SubDir3"); // OK!
@@ -44,18 +45,18 @@ myRoot /= path("SubDirRoot"); // C:/FileSystemTest/SubDirRoot
4445

4546
### Examining paths
4647

47-
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. You can get the root, the relative path, the file name, the file extension, and more. You can iterate over a path object to examine all the folders in the hierarchy. The following example shows how to iterate over a path (not the directory it refers to), and to retrieve information about its parts.
48+
The path class has several methods that return information about various parts of the path itself. This information is distinct from the information about the file system entity it might refer to. You can get the root, the relative path, the file name, the file extension, and more. You can iterate over a path object to examine all the folders in the hierarchy. The following example shows how to iterate over a path object. And, how to retrieve information about its parts.
4849

4950
```cpp
5051
// filesystem_path_example.cpp
51-
// compile by using: /EHsc
52+
// compile by using: /EHsc /W4 /permissive- /std:c++17 (or /std:c++latest)
5253
#include <string>
5354
#include <iostream>
5455
#include <sstream>
5556
#include <filesystem>
5657

5758
using namespace std;
58-
using namespace std::experimental::filesystem;
59+
using namespace std::filesystem;
5960

6061
wstring DisplayPathInfo()
6162
{
@@ -82,7 +83,7 @@ wstring DisplayPathInfo()
8283
return wos.str();
8384
}
8485

85-
int main(int argc, char* argv[])
86+
int main()
8687
{
8788
wcout << DisplayPathInfo() << endl;
8889
// wcout << ComparePaths() << endl; // see following example
@@ -113,7 +114,7 @@ extension() = .txt
113114

114115
### Comparing paths
115116

116-
The `path` class overloads the same comparison operators as `std::string` and `std::wstring`. When you compare two paths, you are performing a string comparison after the separators have been normalized. If a trailing slash (or backslash) is missing it is not added and affects the comparison. The following example demonstrates how path values compare:
117+
The `path` class overloads the same comparison operators as `std::string` and `std::wstring`. When you compare two paths, you make a string comparison after the separators have been normalized. If a trailing slash (or backslash) is missing, it isn't added, and that affects the comparison. The following example demonstrates how path values compare:
117118

118119
```cpp
119120
wstring ComparePaths()
@@ -148,22 +149,22 @@ To run this code, paste it into the full example above before `main` and uncomme
148149

149150
### Converting between path and string types
150151

151-
A `path` object is implicitly convertible to `std::wstring` or `std::string`. This means you can pass a path to functions such as [wofstream::open](../standard-library/basic-ofstream-class.md#open), as shown in this example:
152+
A `path` object is implicitly convertible to `std::wstring` or `std::string`. It means you can pass a path to functions such as [wofstream::open](../standard-library/basic-ofstream-class.md#open), as shown in this example:
152153

153154
```cpp
154155
// filesystem_path_conversion.cpp
155-
// compile by using: /EHsc
156+
// compile by using: /EHsc /W4 /permissive- /std:c++17 (or /std:c++latest)
156157
#include <string>
157158
#include <iostream>
158159
#include <fstream>
159160
#include <filesystem>
160161

161162
using namespace std;
162-
using namespace std::experimental::filesystem;
163+
using namespace std::filesystem;
163164

164-
int main(int argc, char* argv[])
165+
int main()
165166
{
166-
wchar_t* p = L"C:/Users/Public/Documents";
167+
const wchar_t* p{ L"C:/Users/Public/Documents" };
167168
path filePath(p);
168169

169170
filePath /= L"NewFile.txt";
@@ -203,4 +204,4 @@ Press Enter to exit
203204

204205
The \<filesystem> header provides the [directory_iterator](../standard-library/directory-iterator-class.md) type to iterate over single directories, and the [recursive_directory_iterator](../standard-library/recursive-directory-iterator-class.md) class to iterate recursively over a directory and its subdirectories. After you construct an iterator by passing it a `path` object, the iterator points to the first directory_entry in the path. Create the end iterator by calling the default constructor.
205206

206-
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. The `directory_iterator` returns its items as [directory_entry](../standard-library/directory-entry-class.md) objects.
207+
When iterating through a directory, there are several kinds of items you might discover. These items include directories, files, symbolic links, socket files, and others. The `directory_iterator` returns its items as [directory_entry](../standard-library/directory-entry-class.md) objects.

0 commit comments

Comments
 (0)