项目需要,某些场景下需要修改文件的创建(Date created)及修改时间(Date modified),另外还有个访问时间(Date accessed),不过这个时间打开文件夹访问时就会更新。

文档

需要安装pywin32模块。

关键代码

import pywintypes
import win32file

def change_file_time(filename: str, create_time: float, modified_time: float):
    """
    修改文件的创建时间和修改时间
    :param filename: 文件名
    :param create_time: 创建时间
    :param modified_time: 修改时间
    :return:
    """
    # 若为文件夹
    if os.path.isdir(filename):
        os.utime(filename, (create_time, modified_time))
        return
    handle = win32file.CreateFile(filename, win32file.GENERIC_WRITE, 0, None, win32file.OPEN_EXISTING, win32file.FILE_ATTRIBUTE_NORMAL, None)
    win32file.SetFileTime(handle, pywintypes.Time(create_time), pywintypes.Time(modified_time), pywintypes.Time(modified_time))

递归方式 获取全部文件(夹)

def get_all_files(path_dir: str):
    """
    获取指定目录下的所有文件
    :param path_dir:
    :return:
    """
    files = []
    for dirpath, dirnames, filenames in os.walk(path_dir):
        for filename in filenames:
            abs_file = os.path.join(dirpath, filename)
            files.append(abs_file)
        for dirname in dirnames:
            abs_dir = os.path.join(dirpath, dirname)
            # 添加文件夹
            files.append(abs_dir)
            # 递归获取文件
            files += get_all_files(abs_dir)
    return files

业务逻辑

将日期修改为四、五月份,时间修改为[10-19]点之间,尽量随机一些。

创建与修改时间间隔大概为[10, 50]天。

代码如下:

def rnd_minute():
    return random.randint(1, 59)


def rnd_hour():
    return random.randint(10, 19)


def rnd_day():
    return random.randint(1, 30)


def rnd_month():
    return random.randint(4, 5)


def rnd_days():
    return random.randint(10, 50)

def main():
    files = get_all_files()

    for idx, file in enumerate(files):
        create_time = datetime.strptime(f'2023-{rnd_month()}-{rnd_day()} {rnd_hour()}:{rnd_minute()}:{rnd_minute()}',
                                        '%Y-%m-%d %H:%M:%S').timestamp()
        modified_time = datetime.strptime(f'2023-{rnd_month()}-20 {rnd_hour()}:{rnd_minute()}:{rnd_minute()}',
                                          '%Y-%m-%d %H:%M:%S').timestamp()
        # 将modified_time 添加range_day()天数
        modified_time += rnd_days() * 24 * 60 * 60
        # 修改时间
        change_file_time(file, create_time, modified_time)

Gist

https://gist.github.com/lpe234/c131cdffa0cf9721e94a4bf701d9b42b