关于filesystem在c++11、14、17中的使用问题

1 在C++11时,该类库定义在std::tr2::sys命名空间

#include
using namespace std;
using namespace std::tr2::sys;

//示例

void RemoveFile()
{
    directory_iterator end, ite("aaa\\");

    for (; ite != end; ++ite)
    {
        auto& thePath = ite->path();
        if (!is_directory(thePath))
        {
            const string& sName = ite->path().filename();
            if (sName == "test.txt")
            {
                remove(thePath);
            }
        }
    }
}

2 上述代码在C++14中编译不过,已经不存在tr2命名空间

filesystem放在std::experimental::filesystem空间

#include

using namespace std::experimental::filesystem;

但是,在(VS2019,C++14)编译时可能会报错C1189,提示该头文件已被取代,建议使用新的

如果不想根据提示改用C++17,那么我们可以坚持自己的想法,在项目配置中加预处理宏定义即可

_SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING

3 上述代码到了C++17仍能编译通过,但我们可以使用新版本的库文件

#include 
using namespace std;
using namespace filesystem;

 
void Test()
{
       string filepath = "aaa\\";
       directory_iterator end, ite(filepath);

       for (; ite != end; ++ite)
       {
              auto& thePath = ite->path();
              //string strFullPath = pp.string() / "\\" / thePath.relative_path().string();

              path fp(std::filesystem::current_path() / thePath);
              bool bl = filesystem::exists(fp);

              if (!is_directory(fp))
              {

                     //const string& sName = thePath.filename().c_str();
                     file_status fst(status(fp));
                     file_type ftype =  fst.type();
                     directory_entry de(fp);
                     perms fpem = fst.permissions();
                     size_t sz = file_size(fp);
                     rename(fp, fp);
                     auto sName = thePath.filename().string();
                     auto duration(last_write_time(fp).time_since_epoch());
                     time_t tt = chrono::duration_cast(duration).count();
                     //remove(path(strFullPath));
              }

       }

 
       path dir(filepath);
       directory_iterator di(dir);

       for (const auto& entry : di)
       {
              cout << entry.path().filename() << endl;
              if (entry.is_directory())
              {
              }
              else if(entry.is_regular_file())
              {
              }
              else
              {
              }
       }


       //深度优先遍历
       recursive_directory_iterator rdi(dir);

       for (const auto& entry : di)
       {
              cout << entry.path() << endl;
       }

 
       create_directories(dir);         //创建中间缺失目录
       create_directory(dir / "dd");  //仅末级目录
       remove(dir / "bbb" / "c.txt"); //删除单个
       remove_all(dir);                          //递归删除所有
       const auto options = copy_options::recursive | copy_options::update_existing;
       copy(dir, dir, options);
}

你可能感兴趣的:(C/C++,c++)