更改文件名为创建文件的日期
最近再学习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;
}
希望有经验的大神可以一起交流 最后还是感觉代码语言在这个问题上用起来很是方便{:10_332:}
页:
[1]