复制到新的子目录C ++时更改文件扩展名

时间:2018-12-06 17:24:47

标签: c++ c++17

我有一个包含文件(主要是图像)的目录,并且正在尝试创建一个名为Thumbnails的新子目录,该目录将复制所有图像并替换“ .jpg”中的文件扩展名。 “ .png”到“ .thumb”。

到目前为止,我的代码会将所有文件复制到新的子目录中,但是我找不到一种方法来忽略所有不是图像的文件(它正在复制原始目录中的每个文件)并更改扩展名复制的文件中。

#include <iostream>
#include <filesystem>

using namespace std;
namespace fs = std::experimental::filesystem;

//Predefined Functions
void createThumbnails(string path);


int main(void)
{
    string DailyFolderPath =  ".../images";

    createThumbnails(DailyFolderPath);

    return 0;
}

void createThumbnails(string path)
{

    //Create Thumbnail Sub Directory 
    string newThumbDir = path + "/Thumbnails"; 
    fs::create_directories(newThumbDir);

    //Copy files into Thumbnail Directory
    fs::copy(path, newThumbDir);

    for (const auto & p : fs::directory_iterator(newThumbDir))
    cout << p.path().filename() << endl; 

}

1 个答案:

答案 0 :(得分:0)

您在注释中建议的尝试无效,因为您仅传递文件名而不是文件的完整路径:

fs::copy_file(p.path().filename(), p.path().filename().replace_extension(".thumb"));
                       ^^^^^ your app doesn't see these files

您可以尝试以下操作:

void createThumbnails(string source)
{
    fs::path newThumbDir = source + "/Thumbnails"; 
    fs::create_directories(newThumbDir);

    for (const auto & p : fs::directory_iterator(source)) // iterate over all files in source dir
    {
      fs::path fileToCopy = p; // make copy of path to source file
      if (fileToCopy.extension() == ".png" || fileToCopy.extension() == ".jpg")
      {
        fileToCopy.replace_extension(".thumb"); // change extension
        fs::path target = newThumbDir / fileToCopy.filename(); // targetDir/name.thumb
        fs::copy_file(p,target); // pass full paths
      }
    }
}