[C++]简单记录一下C++17的filesystem日常使用的坑

311 阅读1分钟
  1. filename()函数也要看情况。如果构建path的时候字符串是以/结尾的, 那就输出空;否则输出最后一个目录的名字。如:
filesystem::path p("/Users/parcool/temp/cursor/");
cout << p.filename() << endl; // 输出:null

filesystem::path p("/Users/parcool/temp/cursor");
cout << p.filename() << endl; // 输出:cursor

不过原因也很简单,因为如果你以不带/结尾的字符串构建path的时候,没有任何人能知道它是真的指向一个文件还是一个目录,所以它就默认把它当作一个文件来处理了。

  1. relativelexically_relative函数的区别。
filesystem::path p("/Users/parcool/Library/Group Containers/group.com.venyore.ps/Raw/files");
filesystem::path p2("/Users/parcool/Library/Group Containers/group.com.venyore.ps/Raw/");

//如果files是普通文件的话,那没区别:
cout << filesystem::relative(p, p2) << endl; // 输出:files
cout << p.lexically_relative(p2) << endl; // 输出:files
//如果files是一个软连接的话,那就有区别了:relative会解析;lexically_relative不会解析
cout << filesystem::relative(p, p2) << endl; // 输出它真实指向的文件路径:A/B/files
cout << p.lexically_relative(p2) << endl; // 输出:files