修改文件、文件夹的 —— 创建、修改、访问时间

正文

因为一些原因,需要进行修改文件或者文件夹的创建、修改、访问时间。

上网上搜索了一波,有的要修改系统当前时间,然后再对文件做一次修改;有的要下载某些工具(各种各样的工具)。实话说,很多乱七八糟的软件本人并不是很信任,所以就想自己做一个工具出来。

最初的时候我是考虑用 Java 进行编写,但为了方便快捷,后选择了 Python 编写,毕竟脚本语言,在这方面还是有优势的。总共写了两个版本:

  • 版本 1
    用了 os、sys、time 包,只能对文件、文件夹的修改时间、访问时间做修改
  • 版本 2
    用了 win32file、pywintypes、time 中的组件,能对文件、文件夹的创建时间、修改时间、访问时间做修改,但是与系统耦合较大,与系统的类型、版本等等都有关系(不建议用这种方式)

如果一定要修改创建时间,推荐用工具:Total Commande

代码

版本 1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/env python
#_*_coding: utf-8 _*_
#@Time : 2019/4/11 13:15
#@Author : C
#@FileName: modifyFileTimeModule.py

import time
import sys
import os

def modifyFileTime(path, ctime_t, mtime_t, atime_t):
if os.path.isfile(path):
os.utime(path, (atime_t, mtime_t))
if os.path.isdir(path):
file_list = os.listdir(path)
for fName in file_list:
modifyFileTime(path + "/" + fName, ctime_t, mtime_t, atime_t)

# 字符串前面 +r 表示不对字符串进行转义, 如: \\表示双斜杠,而非转义后的单斜杠
path = r'C:/Users/viruser.v-desktop/Desktop/test/test.py'

# get arguments
# cTime = fName[4:-7]
# mTime = cTime
# aTime = cTime
cTime = "2015-02-02 00:01:02" # 创建时间
mTime = "2015-02-02 00:01:03" # 修改时间
aTime = "2015-02-02 00:01:04" # 访问时间

# specify time format
# format = "%Y%m%d_%H%M%S"
format = "%Y-%m-%d %H:%M:%S"

# create struct_time object
ctime_t = time.mktime(time.strptime(cTime, format))
mtime_t = time.mktime(time.strptime(mTime, format))
atime_t = time.mktime(time.strptime(aTime, format))

#调用
modifyFileTime(path, ctime_t, mtime_t, atime_t)

版本 2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/usr/bin/env python
#_*_coding: utf-8 _*_
#@Time : 2019/4/11 13:15
#@Author : C
#@FileName: modifyFileTimeModule.py

from win32file import CreateFile, SetFileTime, GetFileTime, CloseHandle
from win32file import GENERIC_READ, GENERIC_WRITE, OPEN_EXISTING
from pywintypes import Time
import time

def modifyFileTime(filePath,createTime,modifyTime,accessTime,offset):
"""
用来修改任意文件的相关时间属性,时间格式:YYYY-MM-DD HH:MM:SS 例如:2019-02-02 00:01:02
:param filePath: 文件路径名
:param createTime: 创建时间
:param modifyTime: 修改时间
:param accessTime: 访问时间
:param offset: 时间偏移的秒数,tuple格式,顺序和参数时间对应
"""
try:
format = "%Y-%m-%d %H:%M:%S" #时间格式
cTime_t = timeOffsetAndStruct(createTime, format, offset[0])
mTime_t = timeOffsetAndStruct(modifyTime, format, offset[1])
aTime_t = timeOffsetAndStruct(accessTime, format, offset[2])

fh = CreateFile(filePath, GENERIC_READ | GENERIC_WRITE, 0, None, OPEN_EXISTING, 0, 0)
createTimes, accessTimes, modifyTimes = GetFileTime(fh)

createTimes = Time(time.mktime(cTime_t))
accessTimes = Time(time.mktime(aTime_t))
modifyTimes = Time(time.mktime(mTime_t))
SetFileTime(fh, createTimes, accessTimes, modifyTimes)
CloseHandle(fh)
return 0
except BaseException as e:
print(e)
return 1

def timeOffsetAndStruct(times, format, offset):
return time.localtime(time.mktime(time.strptime(times, format)) + offset)


cTime = "2016-02-02 00:01:02" # 创建时间
mTime = "2016-02-02 00:01:03" # 修改时间
aTime = "2016-02-02 00:01:04" # 访问时间

# 文件路径,字符串前面 +r 表示不对字符串进行转义, 如: \\表示双斜杠,而非转义后的单斜杠
fName = r"C:\Users\viruser.v-desktop\Desktop\python\你好答案 - 副本.png"
# 偏移的秒数
offset = (0,1,2)

# 调用
r=modifyFileTime(fName,cTime,mTime,aTime,offset)

if r==0:print('修改完成')
if r==1:print('修改失败')

参考资料

  1. python 修改任意文件的创建时间、修改时间、访问时间
  2. 如何用 python 批量修改文件创建时间?