版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/qq_29542611/article/details/88145016
介绍
笔者有需求,需要将指定文件夹下的所有文件在原有名字的基础上进行重命名。 笔者查阅发现在windows API中有移动文件的API,将文件移动到当前文件就相当于重命名,故此可以使用该API。
BOOL WINAPI MoveFile(
_In_ LPCTSTR lpExistingFileName,
_In_ LPCTSTR lpNewFileName
);
这是对指定路径的某个文件进行移动,对所有文件进行移动,需要对文件进行遍历。笔者查阅后,可以使用下面3个函数实现文件的遍历操作。
// 根据filespec匹配 查找到指定文件(可能是多个),返回第一个匹配的句柄
intptr_t _findfirst(
const char *filespec,
struct _finddata_t *fileinfo // 传出参数
);
// 下一个匹配的文件
int _findnext(
intptr_t handle,
struct _finddata_t *fileinfo // 传出参数
);
// 关闭文件句柄
int _findclose(
intptr_t handle
);
效果
添加了指定前缀002-
代码
#include <Windows.h>
#include <stdio.h>
#include <io.h>
#include <stdlib.h>
#define MAX 256
int main() {
struct _finddata_t file = {0};
int fileHandle = 0, i = 0, len = 0;
char filePath[MAX] = {0}, newName[MAX] = {0}, oldPath[MAX] = {0}, newPath[MAX] = {0};
char dir[MAX] = "F:\\Book\\AAA_Learn_Note\\新概念英语(第2册)美音(MP3+LRC)\\NCE2-美音-(MP3+LRC)\\";
char prefix[MAX] = "002-";
sprintf(filePath,"%s%s",dir,"*.*");
fileHandle = _findfirst(filePath,&file); // 根据匹配规则找到指定类型的文件
if(fileHandle == -1) {
printf("not find file\n");
return 0;
}
do {
len = strlen(file.name);
if( len > 2) // 排除目录文件
{
sprintf(newName,"%s%s",prefix,file.name);// 添加前缀
sprintf(oldPath,"%s%s",dir,file.name);
sprintf(newPath,"%s%s",dir,newName);
// printf("%s\n",oldPath);
// printf("%s\n",newPath);
MoveFile(oldPath,newPath); // 移动文件, 移动到当前文件实际上就是重命名,如果是拷贝就用CopyFile
i++;
}
} while( 0 == _findnext(fileHandle,&file) );
_findclose(fileHandle);
printf("move %d file success \n",i);
return 0;
}