C++ readdir():重新读取某些文件

C++ readdir():重新读取某些文件,c++,readdir,dirent.h,C++,Readdir,Dirent.h,我得到了一个函数,其任务是重命名文件夹中的所有文件,但它会重新重命名某些文件: ,同样的“错误”每十个数字就会发生一次。到底是什么导致了这个“错误” 函数的两个参数是文件夹的路径和第一个文件的起始值 int查找(std::string path,int*start){ 字符的整数; std::字符串旧的、文件格式的、新的; std::stringout; DIR*DIR; 结构导向; dir=opendir(path.c_str()); if(dir!=NULL){ //阅读“通行证”和“通行证

我得到了一个函数,其任务是重命名文件夹中的所有文件,但它会重新重命名某些文件: ,同样的“错误”每十个数字就会发生一次。到底是什么导致了这个“错误”

函数的两个参数是文件夹的路径和第一个文件的起始值

int查找(std::string path,int*start){
字符的整数;
std::字符串旧的、文件格式的、新的;
std::stringout;
DIR*DIR;
结构导向;
dir=opendir(path.c_str());
if(dir!=NULL){
//阅读“通行证”和“通行证”
ent=readdir(dir);
ent=readdir(dir);
//更改文件夹中所有文件的名称
while((ent=readdir(dir))!=NULL){
//旧字符串值
老路;
旧的附加(ent->d_名称);
//获取图像的格式
文件格式=ent->d\U名称;
字符数=文件格式.rfind(“.”);
文件格式。擦除(0,字符数);
//新字符串值
新的路径;

我发现可能存在的问题有:

  • 重命名文件会使它们两次馈送到您的算法
  • 您计算新文件名的算法错误

您应该能够轻松地为此编写测试,这反过来会帮助您解决问题或编写更具体的问题。除此之外,我没有看到任何严重的问题,但如果您稍微缩小变量的范围,这将有助于确保不同的迭代不会相互影响。

您正在重命名文件s到原始文件所在的同一文件夹,导致无限循环。您将
04.png
重命名为
4.png
,但由于您正在迭代文件夹中的所有文件,因此在某个点上,您将迭代到“新的”
4.png
文件(在您的示例中,在第40次迭代中)然后将该文件重命名为
40.png
,依此类推

通过对现有代码进行最小更改来解决此问题的最简单方法是使用新名称将文件“重命名”(移动)到临时文件夹中。例如:

new_s = temp_path;
out << *start;
new_s += out.str();
new_s.append(file_format);
// Switch name on the file from old string to new string
rename(old_s.c_str(), new_s.c_str());

`

您正在列举正在更改的内容;目录内容。创建一个已更改的文件名(新名称)的
std::set
并跳过集合中的任何内容。或者先读取整个目录,将所有文件名加载到
std::list
或其他类似的容器中,然后迭代该列表,沿途重命名。旁注:如果有保证,则第一个到的文件始终为“.”和“.”,我不知道。除非我不正确(这不是第一次),否则您需要对这些进行明确测试。好的,有一种感觉是这样的,但我发现,一旦我调用openedir,它就会忽略我在文件夹中所做的操作。还有几次我使用dirent(仅限windows)它似乎总是有那两个父文件夹,将更改它,以便它测试,而不只是读取通过它们。谢谢你的帮助!啊,好吧,我担心这是一个这样的问题。我猜可以通过先将所有文件保存在向量/数组中,关闭dir,然后重命名文件来解决它?@DavidS我肯定会这样做t、 减少全局毁灭或错误的机会。这将是更好的解决方案。我的解决方案专注于最小的代码更改
closedir (dir);
deletedir(path);
rename(temp_path, path);