C ++:重命名用户指定目录中的所有文件

时间:2014-08-20 17:43:26

标签: c++ file while-loop directory dirent.h

所以我希望能够自动重命名用户指定目录中的所有文件(我知道c ++不是执行此操作的最佳语言/工具)。

例如,一个目录目前包含数百个随机字符名称的文件,我希望将它们全部更改为8月1日,8月2日,8月3日等。

代码

用户指定此目录

std::string directory;

std::cout << "Enter directory: ";
std::cin >> directory;

目录以这样的方式打开(使用dirent.h)

DIR *pdir = NULL;
struct dirent *pent = NULL;
const char * DIRECTORY;

// convert directory string to const char
DIRECTORY = directory.c_str();

pdir = opendir (DIRECTORY);

重命名指定目录中的所有文件

int i = 1;
std::string s, oldname, newname;
const char * OLDNAME, * NEWNAME;

while (pent = readdir (pdir))
{
    // convert int i to str s
    std::stringstream out;
    out << i;
    s = out.str();

    oldname = pent->d_name;
    newname = "August " + s;

    OLDNAME = oldname.c_str();
    NEWNAME = newname.c_str();

    rename(OLDNAME, NEWNAME);

    i++;
}   

直到while循环一直运行,看起来什么也没做,这就是我被困住的部分。

然而,奇怪的是,这个用于显示目录内容的while循环(使用与非工作循环相同的逻辑和语法)完美地工作

while (pent = readdir (pdir))
{
    std::cout << pent->d_name << "\n";
}

在Win7上使用MSVS2012。

我认为我要遇到的另一个问题是,在目录中,不同的文件具有不同的扩展名(这可以通过保存原始名称的最后4个字符并将其附加到新名称来解决) ,但不确定,帮助将不胜感激)。

2 个答案:

答案 0 :(得分:2)

使用<filesystem>,如今可以做到的,类似于以下内容。我希望这可能对将来的读者有所帮助:

#include <iostream>
#include <string>
#include <filesystem>  //std::filesystem::path, std::filesystem::recursive_directory_iterator

std::string changeFileName(const std::string& currentFileName, const std::string& extension, int number)
{
   std::cout << "Current file name: " << currentFileName << "\n";

   // ....other logics regarding current filename

   const std::string newFileName{ "August - " + std::to_string(number) + extension};    
   std::cout << "File name after renaming: " << newFileName << "\n";
   return newFileName; // new file name
}

int main()
{
   const std::filesystem::path myPath = ".....full path....";
   const std::string extension{ ".txt" };
   int number{ 0 };
   // iterate through all the files in the directory
   for (const auto& dirEntry : std::filesystem::directory_iterator(myPath))
   {
      // if the file is meant for changing name!
      if (std::filesystem::is_regular_file(dirEntry) && dirEntry.path().extension() == extension)
      {
         const std::string currentFileName{ dirEntry.path().filename().string() };
         // following function is meant for the logic to provide the new file names in the directory
         // in your case it cout have been simply: "August - " + std::to_string(number++) + "extension"
         const std::string newFileName{ changeFileName(currentFileName, extension, number++) };
         try
         {
            std::filesystem::rename(myPath / currentFileName, myPath / newFileName);
         }
         catch (std::filesystem::filesystem_error const& error)  // catch the errors(if any)!
         {
            std::cout << error.code() << "\n" << error.what() << "\n";
         }
      }

   }
}

答案 1 :(得分:1)

问题是pent->d_name只是没有关联路径的文件名。因此,当您重命名时,程序将在当前目录中查找oldname,并且由于该目录中不存在,重命名不会任何东西。要解决此问题,您应该将路径附加到oldnamenewname,例如:

oldname = (std::string(DIRECTORY)+pent->d_name).c_str();
newname = (std::string(DIRECTORY)+"August " + s).c_str();