当前位置:网站首页>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 /
}
}
边栏推荐
猜你喜欢
How does wincc7.5 SP1 find variables and their positions through cross indexing?
[server data recovery] a case of RAID5 data recovery stored in a brand of server
Huawei ENSP simulator configures ACL access control list
分析伦敦银走势图的技巧
LeetCode+ 81 - 85 单调栈专题
WGCNA分析基本教程总结
NetWare r7000 Merlin system virtual memory creation failed, prompting that the USB disk reading and writing speed does not meet the requirements. Solution, is it necessary to create virtual memory??
Gobang go to work fishing tools can be LAN / man-machine
TweenMax表情按钮js特效
Huawei ENSP simulator layer 3 switch
随机推荐
Google colab踩坑
接口設計時的一些建議
6月“墨力原创作者计划”获奖名单公布!邀您共话国产数据库
hash 表的概念及应用
Why is TCP three handshakes and four waves
RFID仓储管理系统解决方案的优点
redis布隆过滤器
LeetCode 7. 整数反转
Huawei simulator ENSP common commands
c语言函数形参自增自减情况分析
PermissionError: [Errno 13] Permission denied: ‘data.csv‘
冰河的海报封面
哈希表、哈希函数、布隆过滤器、一致性哈希
LeetCode+ 81 - 85 单调栈专题
Android原生数据库的基本使用和升级
[micro service SCG] use of predict
接口设计时的一些建议
2021 CCPC 哈尔滨 B. Magical Subsequence(思维题)
redis缓存
Leetcode+ 81 - 85 monotone stack topic