溯影 发表于 2018-4-29 21:52:21

更改文件名为创建文件的日期

最近再学习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);#后缀
      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;
        TransformFileMakeTime(buf, fileMakeTime);        //函数调用
        printf("%s\t", fileMakeTime);                                //打印文件创建的时间



        //对全路径的每一部分进行分解
        CHAR szFileDrive;                        //驱动器盘符
        CHAR szFileDir;                        //中间的路径
        CHAR szFileExtension;                //文件后缀名


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


        CHAR szFileNewName;                //新文件名
        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;
        CHAR szFileFullPath;

        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 = "C:\\Users\\pc\\Desktop\\测试文件夹";
        EnumListFile(szFilePath);

        return 0;
}




希望有经验的大神可以一起交流

溯影 发表于 2018-4-29 21:53:18

最后还是感觉代码语言在这个问题上用起来很是方便{:10_332:}
页: [1]
查看完整版本: 更改文件名为创建文件的日期