鱼C论坛

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

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

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

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

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

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;
}



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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 21:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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