所以我希望能够自动重命名用户指定目录中的所有文件(我知道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个字符并将其附加到新名称来解决) ,但不确定,帮助将不胜感激)。
答案 0 :(得分:2)
使用c++17的<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
,并且由于该目录中不存在,重命名不会任何东西。要解决此问题,您应该将路径附加到oldname
和newname
,例如:
oldname = (std::string(DIRECTORY)+pent->d_name).c_str();
newname = (std::string(DIRECTORY)+"August " + s).c_str();