|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
最近再学习WindowsSDK编程,一个群里有一个大佬说要更改文件名为创建文件的日期的程序,无论什么方法,实现目的就行,
当时第一反应是要写python代码,还好,很快写了出来并且运行了,只不过有的文件重名无法更改
下面是python程序:
- import time
- import os
- def TransformTime(filePath):
-
- buildTime = os.path.getctime(filePath); # 获取文件创建的时间
- timeLocal = time.localtime(buildTime);
- filePrior = time.strftime("%Y_%m_%d_%H_%M_%S",timeLocal) # 时间格式转化
- return filePrior; # 返回字符串
- def MakeFileName(filePath):
- os.chdir(filePath); # 修改文件路径为输入路径
- for each_file in os.listdir(os.curdir):
- if os.path.isdir(each_file):#如果是文件夹递归
- MakeFileName(each_file)
- os.chdir(os.pardir)# 记得回溯
-
- filePrior = TransformTime(each_file);#文件名
-
- fileExtension = os.path.splitext(each_file)[1];#后缀
- fileName = filePrior + fileExtension;#修改后的文件全名
-
- if os.path.isdir(each_file):
- continue;
- else:
- try:
- print(each_file);#打印源文件名
- os.rename(each_file,fileName);
- print(fileName);#打印修改后的文件名
- except Exception as e:
- print(e);
-
-
-
- if __name__ == "__main__":
- filePath = input("请输入您要格式化文件名的文件夹的路径:");
- MakeFileName(filePath);
- print("完毕");
-
复制代码
后来也是琢磨想用C语言来写一个,但是这个就是比较恼火了,我查了好多资料,但是思路和python代码是一样的,
但是这个程序有个问题,有时候我要对目标文件夹运行好几次程序,才能把目标文件夹里的深层目录的文件改了名字,当然,文件重名无法更改的问题还是存在
附上代码:
- #include <stdio.h>
- #include <stdlib.h> //可以获取文件的后缀名
- #include <sys/stat.h> //获取文件的状态
- #include <time.h> //时间处理函数相关的头文件
- #include <io.h>
- #include <windows.h>
- #include <fcntl.h> //修改文件名的函数的头文件
- //获取文件创建时间
- void TransformFileMakeTime(struct stat buf, char *fileMakeTime){
- memset(fileMakeTime, 0, sizeof(fileMakeTime));//先全部置零
- strftime(fileMakeTime, 24, "%Y_%m_%d_%H_%M_%S", localtime(&buf.st_mtime)); //时间戳转化为标准
- }
- //更改文件名并且打印文件创建的时间
- void ChangeFileName(PCHAR szFileFullPath){
- struct stat buf;
- stat(szFileFullPath, &buf);
- CHAR fileMakeTime[24];
- TransformFileMakeTime(buf, fileMakeTime); //函数调用
- printf("%s\t", fileMakeTime); //打印文件创建的时间
- //对全路径的每一部分进行分解
- CHAR szFileDrive[MAX_PATH]; //驱动器盘符
- CHAR szFileDir[MAX_PATH]; //中间的路径
- CHAR szFileExtension[MAX_PATH]; //文件后缀名
- //获取文件的每一个有用的部分,不想要的参数部分填NULL
- _splitpath(szFileFullPath, szFileDrive, szFileDir, NULL, szFileExtension);
- CHAR szFileNewName[MAX_PATH]; //新文件名
- lstrcpy(szFileNewName, szFileDrive);
- lstrcat(szFileNewName, szFileDir);
- lstrcat(szFileNewName, "\");
- lstrcat(szFileNewName, fileMakeTime);
- lstrcat(szFileNewName, szFileExtension);
- if (rename(szFileFullPath, szFileNewName)==0){//修改文件名
- printf("###############修改成功####################\n");
- }
- else{
- perror("rename");
- printf("**********************%s**********************\n", szFileNewName);
- }
- }
- //枚举文件
- DWORD EnumListFile(LPSTR szPath){
- HANDLE hFileList;
- WIN32_FIND_DATA FileData;
- CHAR szFilePath[MAX_PATH];
- CHAR szFileFullPath[MAX_PATH];
- lstrcpy(szFilePath, szPath);
- lstrcat(szFilePath, "\\*");
- hFileList = FindFirstFile(szFilePath, &FileData);
- if (hFileList == INVALID_HANDLE_VALUE){
- printf("错误:%d\n", GetLastError());
- return 1;
- }
- else{
- do{//遍历文件
- if (lstrcmp(FileData.cFileName, TEXT(".")) == 0 || lstrcmp(FileData.cFileName, TEXT("..")) == 0){
- continue;
- }
- wsprintf(szFileFullPath, "%s\\%s", szPath, FileData.cFileName);
- ChangeFileName(szFileFullPath);
- printf("\t\t%s\n\n", szFileFullPath);
-
- if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){ // 如果是文件夹就递归
- EnumListFile(szFileFullPath);
- }
- } while (FindNextFile(hFileList, &FileData));
- }
- CloseHandle(hFileList);
- return 0;
- }
- int main(int argc, char *argv[]){
- CHAR szFilePath[MAX_PATH] = "C:\\Users\\pc\\Desktop\\测试文件夹";
- EnumListFile(szFilePath);
- return 0;
- }
复制代码
希望有经验的大神可以一起交流 |
|