鱼C论坛

 找回密码
 立即注册
查看: 2728|回复: 1

[技术交流] 更改文件名为创建文件的日期

[复制链接]
发表于 2018-4-29 21:52:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近再学习WindowsSDK编程,一个群里有一个大佬说要更改文件名为创建文件的日期的程序,无论什么方法,实现目的就行,
当时第一反应是要写python代码,还好,很快写了出来并且运行了,只不过有的文件重名无法更改
下面是python程序:
  1. import time
  2. import os

  3. def TransformTime(filePath):
  4.    
  5.     buildTime = os.path.getctime(filePath);     # 获取文件创建的时间

  6.     timeLocal = time.localtime(buildTime);
  7.     filePrior = time.strftime("%Y_%m_%d_%H_%M_%S",timeLocal)   # 时间格式转化

  8.     return filePrior;      # 返回字符串


  9. def MakeFileName(filePath):
  10.     os.chdir(filePath);     # 修改文件路径为输入路径
  11.     for each_file in os.listdir(os.curdir):
  12.         if os.path.isdir(each_file):#如果是文件夹递归
  13.             MakeFileName(each_file)
  14.             os.chdir(os.pardir)# 记得回溯
  15.             
  16.         filePrior = TransformTime(each_file);#文件名
  17.    

  18.         fileExtension = os.path.splitext(each_file)[1];#后缀
  19.         fileName = filePrior + fileExtension;#修改后的文件全名

  20.         
  21.         if os.path.isdir(each_file):
  22.             continue;
  23.         else:
  24.             try:
  25.                 print(each_file);#打印源文件名
  26.                 os.rename(each_file,fileName);
  27.                 print(fileName);#打印修改后的文件名
  28.             except Exception as e:
  29.                 print(e);
  30.             
  31.         
  32.    

  33. if __name__ == "__main__":
  34.     filePath = input("请输入您要格式化文件名的文件夹的路径:");
  35.     MakeFileName(filePath);


  36.     print("完毕");
  37.    
复制代码




后来也是琢磨想用C语言来写一个,但是这个就是比较恼火了,我查了好多资料,但是思路和python代码是一样的,
但是这个程序有个问题,有时候我要对目标文件夹运行好几次程序,才能把目标文件夹里的深层目录的文件改了名字,当然,文件重名无法更改的问题还是存在
附上代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>                //可以获取文件的后缀名
  3. #include <sys/stat.h>   //获取文件的状态
  4. #include <time.h>                //时间处理函数相关的头文件
  5. #include <io.h>
  6. #include <windows.h>
  7. #include <fcntl.h>                //修改文件名的函数的头文件


  8. //获取文件创建时间
  9. void TransformFileMakeTime(struct stat buf, char *fileMakeTime){
  10.         memset(fileMakeTime, 0, sizeof(fileMakeTime));//先全部置零
  11.         strftime(fileMakeTime, 24, "%Y_%m_%d_%H_%M_%S", localtime(&buf.st_mtime));                //时间戳转化为标准
  12. }

  13. //更改文件名并且打印文件创建的时间
  14. void ChangeFileName(PCHAR szFileFullPath){
  15.         struct stat buf;
  16.         stat(szFileFullPath, &buf);
  17.         CHAR fileMakeTime[24];
  18.         TransformFileMakeTime(buf, fileMakeTime);        //函数调用
  19.         printf("%s\t", fileMakeTime);                                //打印文件创建的时间



  20.         //对全路径的每一部分进行分解
  21.         CHAR szFileDrive[MAX_PATH];                        //驱动器盘符
  22.         CHAR szFileDir[MAX_PATH];                        //中间的路径
  23.         CHAR szFileExtension[MAX_PATH];                //文件后缀名


  24.         //获取文件的每一个有用的部分,不想要的参数部分填NULL
  25.         _splitpath(szFileFullPath, szFileDrive, szFileDir, NULL, szFileExtension);       


  26.         CHAR szFileNewName[MAX_PATH];                //新文件名
  27.         lstrcpy(szFileNewName, szFileDrive);
  28.         lstrcat(szFileNewName, szFileDir);
  29.         lstrcat(szFileNewName, "\");
  30.         lstrcat(szFileNewName, fileMakeTime);
  31.         lstrcat(szFileNewName, szFileExtension);


  32.         if (rename(szFileFullPath, szFileNewName)==0){//修改文件名
  33.                 printf("###############修改成功####################\n");
  34.         }
  35.         else{
  36.                 perror("rename");
  37.                 printf("**********************%s**********************\n", szFileNewName);
  38.         }

  39. }



  40. //枚举文件
  41. DWORD EnumListFile(LPSTR szPath){
  42.         HANDLE hFileList;
  43.         WIN32_FIND_DATA FileData;
  44.         CHAR szFilePath[MAX_PATH];
  45.         CHAR szFileFullPath[MAX_PATH];

  46.         lstrcpy(szFilePath, szPath);
  47.         lstrcat(szFilePath, "\\*");

  48.         hFileList = FindFirstFile(szFilePath, &FileData);
  49.         if (hFileList == INVALID_HANDLE_VALUE){
  50.                 printf("错误:%d\n", GetLastError());
  51.                 return 1;
  52.         }

  53.         else{
  54.                 do{//遍历文件
  55.                         if (lstrcmp(FileData.cFileName, TEXT(".")) == 0 || lstrcmp(FileData.cFileName, TEXT("..")) == 0){
  56.                                 continue;
  57.                         }
  58.                         wsprintf(szFileFullPath, "%s\\%s", szPath, FileData.cFileName);

  59.                         ChangeFileName(szFileFullPath);
  60.                         printf("\t\t%s\n\n", szFileFullPath);
  61.                        
  62.                         if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){        // 如果是文件夹就递归
  63.                                 EnumListFile(szFileFullPath);
  64.                         }
  65.                 } while (FindNextFile(hFileList, &FileData));
  66.         }
  67.         CloseHandle(hFileList);
  68.         return 0;
  69. }




  70. int main(int argc, char *argv[]){

  71.         CHAR szFilePath[MAX_PATH] = "C:\\Users\\pc\\Desktop\\测试文件夹";
  72.         EnumListFile(szFilePath);

  73.         return 0;
  74. }
复制代码




希望有经验的大神可以一起交流
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-4-29 21:53:18 | 显示全部楼层
最后还是感觉代码语言在这个问题上用起来很是方便
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 18:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表