当前位置:网站首页>Day24: file system
Day24: file system
2022-07-04 21:15:00 【_ Doris___】
Catalog
One 、firesystem brief introduction :
1.C++17 Standard only , In fact, it's about folders 、 File directory
2.filesystem brief introduction :
4. Common methods :( notes : stay filesystem In the namespace of filesystem::)
(3) Get the time when the file was last modified
How to convert std::filesystem::file_time_type to time_t?
Two 、 Three categories path class
1. Determine whether this path exists
2. Get path related properties :
3、 ... and 、 Three categories file_status class
1. Create file_status object : utilize filesystem::status(string url)
2. Methods in class :type() Returns one of several enumeration types (filesystem::file_type Medium )
Four 、 Three categories file_status class
1. Traverse all files in the current directory
2. Traverse all files in the current folder ---> Only the current directory
3. Traverse all folder files under the current folder
4. Delete all files in the current path ( Folder not included !)
One 、firesystem brief introduction :
1.C++17 Standard only , In fact, it's about folders 、 File directory
#include<filesystem>
2.filesystem brief introduction :
3. Three broad categories :
①path class ②file_status class ③directory_entry class
4. Common methods :( notes : stay filesystem In the namespace of filesystem::)
(1) establish
①create_directory(string url)
The second parameter is a error_code object , By calling error_code Medium message() Method , Whether the output is successfully created . secondly , You cannot create a parent folder and create subfolders in it ( Only single tier directories can be created )
②create_directories(string url) Can create multistage Catalog
notes : If the path already exists , It will not be cleared .
filesystem::path url("fileBox");
if (!filesystem::exists(url))
{
cout << " non-existent " << endl;
}/* Be sure to give priority to detection */
// Path storage Do nothing else
filesystem::create_directory("fileBox"); // Create a single level directory
error_code temp;
filesystem::create_directory("fileBox/xx",temp);
cout << temp.message() << endl;
filesystem::create_directories("a/b/c",temp); // Create multi-level directory
cout << temp.message() << endl;
(2) Delete path
remove_all(string url)
filesystem::remove_all(url);
(3) Get the time when the file was last modified
last_write_time(string url)
Return to one file_time_type type , Need further adjustment time_since_epoch() Method .count() Get the form of timestamp
Last class mainly talked about two ways : Method of converting timestamp into readable time .
①ctime(&m_tm)
②std::tm* p=localtime(&m_tm);
cout << " Format time :" << put_time(p, "%F %T") << endl;
notes : Later, through the following two lines of code to detect the data type ,count() It is not time_t type , So the above two methods are not very effective .
#include<typeinfo>
typeid(m_time).name()
Start with the essence : The problem is :(from stack_overflow)
How to convert std::filesystem::file_time_type to time_t?
C++20 Of solution:
const auto fileTime = std::filesystem::last_write_time(filePath);
const auto systemTime = std::chrono::clock_cast<std::chrono::system_clock>(fileTime);
const auto time = std::chrono::system_clock::to_time_t(systemTime);
So the example code is changed to :
auto filetime = filesystem::last_write_time("B");
const auto systemTime =
std::chrono::clock_cast<std::chrono::system_clock>(filetime);
const auto time = std::chrono::system_clock::to_time_t(systemTime);
std::tm* p = localtime(&time);
cout << " File change time :" << put_time(p,"%F %T") << endl;
Two 、 Three categories path class
1. Determine whether this path exists
notes : It must be filesystem Scope discriminator in bool filesystem::exist(string url)
#include<iostream>
#include<filesystem>
filesystem::path url("file");
if (!filesystem::exists(url))
{
cout << " path does not exist " << endl;
}
2. Get path related properties :
(i) Get the current path (ii) Get the root directory (iii) Relative paths (iv) Get root name (v) Get the root path
filesystem::path curURL = filesystem::current_path();
//C:\Users\team\Desktop\ The first 24 course C++ file system \filesystem System \path class
cout << curURL.string() << endl; // Double slash becomes single slash
cout <<" current path :" << curURL << endl; // Double slash
cout << " root directory :" << curURL.root_directory() << endl;
cout << " Relative paths :" << curURL.relative_path() << endl;
cout << " Root name :" << curURL.root_name() << endl;
cout << " The root path :" << curURL.root_path() << endl;
Output :
D:\C++\C++ file system \filesystem System \path class
current path :"D:\\C++\\C++ file system \\filesystem System \\path class "
root directory :"\\"
Relative paths :"C++\\C++ file system \\filesystem System \\path class "
Root name :"D:"
The root path :"D:\\"
3、 ... and 、 Three categories file_status class
1. Create file_status object : utilize filesystem::status(string url)
2. Methods in class :type() Returns one of several enumeration types (filesystem::file_type Medium )
#include <filesystem>
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
void test_file_status(filesystem::file_status x)
{
switch (x.type())
{
case filesystem::file_type::regular:
cout << " Disk files " << endl;
break;
case filesystem::file_type::directory:
cout << " Directory file " << endl;
break;
case filesystem::file_type::not_found:
cout << " directory does not exist " << endl;
break;
case filesystem::file_type::unknown:
cout << " Unrecognized file " << endl;
break;
}
}
int main()
{
filesystem::create_directory("file");
filesystem::file_status x = filesystem::status("file");
test_file_status(x);
fstream file("file\\test.dat", ios::out | ios::trunc);
if (!file)
{
cout << " File creation failed !" << endl;
}
test_file_status(filesystem::status("file\\test.dat"));
return 0;
}
Output :
Directory file
Disk files
Four 、 Three categories file_status class
notes : If you can't recognize filesystem It must be that the standard is not adjusted c++17 above !
directory_entry: File entry
dirctory_iterator: Traversal filerecursive_directory_iterator Traverse all ( With recursive traversal of all folders !!!)
1. Traverse all files in the current directory
// Traverse all files in the current directory :
void traverseDirectory()
{
filesystem::path url("D:\\BaiduNetdiskDownload");
if (!filesystem::exists(url))
{
cout << " The current path does not exist " << endl;
return;
}
filesystem::directory_entry input(url);// entrance
if (input.status().type() != filesystem::file_type::directory)
{
cout << "url Not a directory " << endl;
return;
}
filesystem::directory_iterator dir(url);
for (auto v : dir)
{/*path Is a path object */
cout << v.path().filename() << endl;
}
}
2. Traverse all files in the current folder ---> Only the current directory
// Traverse all files in the current folder ---> Only the current directory
void traverseDirectoryAllFile()
{
filesystem::path url("D:\\BaiduNetdiskDownload");
if (!filesystem::exists(url))
{
cout << " The current path does not exist " << endl;
return;
}
set<string> dirset;
filesystem::directory_iterator begin(url);
for (filesystem::directory_iterator end; begin != end; ++begin)
{
if (!filesystem::is_directory(begin->path()))
{
dirset.insert(begin->path().filename().string());
}
}
for (auto v : dirset)
{
cout << v << endl;
}
}
3. Traverse all folder files under the current folder
recursive_directory_iterator Traverse all ( With recursive traversal of all folders !!!)
// Traverse all folder files under the current folder
void traverseAllDirectoryAllFile()
{
filesystem::path url("D:\\BaiduNetdiskDownload");
if (!filesystem::exists(url))
{
cout << " The current path does not exist " << endl;
return;
}
set<string> dirset;
//recursive_directory_iterator Traverse all ( With recursive traversal of all folders !!!)
filesystem::recursive_directory_iterator begin(url);
for (filesystem::recursive_directory_iterator end; begin != end; ++begin)
{
if (!filesystem::is_directory(begin->path()))
{
dirset.insert(begin->path().filename().string());
}
}
for (auto v : dirset)
{
cout << v << endl;
}
}
4. Delete all files in the current path ( Folder not included !)
// Delete all files in the current path ( Folder not included !)
void deleteURLAllFile()
{
filesystem::path root = filesystem::current_path();
set<string> dirset;
for (filesystem::directory_iterator end, begin(root); begin != end; ++begin)
{
if (!filesystem::is_directory(begin->path()))/* Exclude folders */
{
dirset.insert(begin->path().filename().string());
}
}
for (auto v : dirset)
{
if(v!="test.exe")/* The program cannot put itself .exe Delete the file , So we need to rule out */
filesystem::remove_all(v); // heavy load /
}
}
边栏推荐
- 华为ensp模拟器 DNS服务器的配置
- Go notes (1) go language introduction and characteristics
- 杰理之AD 系列 MIDI 功能说明【篇】
- UTF encoding and character set in golang
- LeetCode 8. String conversion integer (ATOI)
- __init__() missing 2 required positional arguments 不易查明的继承错误
- hash 表的概念及应用
- HWiNFO硬件检测工具v7.26绿色版
- 杰理之AD 系列 MIDI 功能说明【篇】
- go defer的使用说明
猜你喜欢
随机推荐
LeetCode 7. 整数反转
【申博攻略】六.如何联系心仪的博导
扩展你的KUBECTL功能
Huawei simulator ENSP common commands
Automatic generation of interface automatic test cases by actual operation
测试员的算法面试题-找众数
maya灯建模
基于OpenCV haarcascades的对象检测
nmap扫描
heatmap.js图片热点热力图插件
acwing 3302. Expression evaluation
Golang中UTF编码和字符集
Idea plug-in
[micro service SCG] use of predict
Some suggestions for interface design
JS closure
HMS Core 统一扫码服务
杰理之AD 系列 MIDI 功能说明【篇】
华为ensp模拟器 DNS服务器的配置
华为模拟器ensp的路由配置以及连通测试