nit*_*tin 5 python pywin32 pywin
我正在尝试使用python更改Windows系统的目录创建时间戳。我有一个从其他驱动器复制过来的目录,并且目录创建时间没有保留。这就是我希望做的
步骤1:使用以下代码读取源目录列表和创建时间,
import os
source_dir_path = r'd:\data'
list_of_directories = os.listdir(source_dir_path)
creation_times = {}
for d in list_of_directories:
creation_times[d] = os.path.getctime(os.path.join(source_dir_path, d))
Run Code Online (Sandbox Code Playgroud)
步骤2:遍历目录列表并设置目录创建时间。为此,我依靠Python For Windows Extensions。代码如下所示,
from win32file import CreateFile, SetFileTime, GetFileTime, CloseHandle
from win32file import GENERIC_READ, GENERIC_WRITE, OPEN_EXISTING
from pywintypes import Time
destination_dir_path = r'f:\data'
#list_of_directories = os.listdir(source_dir_path)
for d in creation_times:
fh = CreateFile(os.path.join(destination_dir_path,d), 0, 0, None, OPEN_EXISTING, 0,0)
SetFileTime(fh, creation_times[d])
Run Code Online (Sandbox Code Playgroud)
我在CreateFile行上收到“访问被拒绝”。我不确定这是否是设置目录创建时间的有效方法。这是设置目录创建时间的正确方法吗
以下方法应该有效,尽管这确实也设置了上次访问和上次写入时间的创建时间。它创建文件名和创建时间的元组列表(而不是字典),将文件从源复制到目标目录。您的代码遇到的主要问题是调用所需的参数CreateFile:
from win32file import CreateFile, SetFileTime, GetFileTime, CloseHandle
from win32file import GENERIC_WRITE, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, FILE_SHARE_WRITE
import os
import shutil
source_dir_path = r"c:\my_source"
destination_dir_path = r"c:\my_target"
creation_times = [(d, os.path.getctime(os.path.join(source_dir_path, d))) for d in os.listdir(source_dir_path)]
for filename, ctime in creation_times:
src = os.path.join(source_dir_path, filename)
target = os.path.join(destination_dir_path, filename)
shutil.copy(src, target)
fh = CreateFile(target, GENERIC_WRITE, FILE_SHARE_WRITE, None, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)
SetFileTime(fh, ctime, ctime, ctime)
CloseHandle(fh)
Run Code Online (Sandbox Code Playgroud)