utime()在Windows中没有效果

时间:2017-03-06 16:08:29

标签: python python-2.7 windows-10 os.walk

我有一个python脚本,它应该循环遍历目录中的所有文件,并将每个文件的日期设置为当前时间。它似乎没有任何效果,即文件资源管理器中的Date列显示没有变化。我看到代码循环遍历所有文件,只是看起来对utime的调用没有效果。

问题是not this,因为大部分日期都是几个月。

# set file access time to current time
#!/usr/bin/python

import os
import math

import datetime

def convertSize(size):
    if (size == 0):
        return '0B'
    size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
    i = int(math.floor(math.log(size,1024)))
    p = math.pow(1024,i)
    s = round(size/p,2)
    return '%s %s' % (s,size_name[i])

# see www.tutorialspoint.com/python/os_utime.htm
def touch(fname, times=None):
    fhandle = open(fname, 'a')
    try:
        os.utime(fname, times)
    finally:
        fhandle.close()

def main():

    print ("*** Touch Files ***");

    aml_root_directory_string  = "C:\\Documents"

    file_count = 0
    file_size = 0

    # traverse root directory, and list directories as dirs and files as files
    for root, dirs, files in os.walk(aml_root_directory_string):
        path = root.split('/')
        #print((len(path) - 1) * '---', os.path.basename(root))
        for file in files:
            filename, file_extension = os.path.splitext(file)
            print(len(path) * '---', file)
            touch(filename, )

#  
    print ("\n*** Total files: " + str(file_count) + "  Total file size: " + convertSize(file_size) + " ***");
    print ("*** Done: Time: " + str(datetime.datetime.now()) + "  - Touch Files ***");


# main ###############################################################################

if __name__ == "__main__":
    # stuff only to run when not called via 'import' here
    main()

编辑:
如果将来有人读到这个,那么注意文件浏览器可以display more than 1 kind of date

也很重要

2 个答案:

答案 0 :(得分:3)

您有三个问题:

  1. touch时使用的是文件名,而不是完整路径,因此所有touch都发生在工作目录中
  2. 您也正在剥离文件扩展名,因此触摸的文件缺少扩展程序
  3. 您正在触摸有打开文件句柄的文件,而在Windows上,在Python 2.7上,这是一个问题,因为os.utime opens the files with no sharing allowed,它与现有的打开文件句柄不兼容
  4. 要修复#3,请将touch方法更改为:

    def touch(fname, times=None):
        # Open and immediately close file to force existence
        with open(fname, 'ab') as f:
            pass
        # Only alter times when file is closed
        os.utime(fname, times)
    

    要修复#1和#2,请将主要方法更改为touch,如下所示:

                touch(os.path.join(root, file))
    

    使用原始名称并将其与正在遍历的根目录连接,其中touch(filename)在程序的工作目录中触摸没有扩展名的文件(因为您使用了非限定名称)。如果您发现程序的工作目录(print os.getcmd()将告诉您在哪里查看),您会发现一堆随机空文件对应于您正在遍历的树中找到的文件,剥离了路径和文件扩展名。

    旁注:如果你可以转到Python 3(已经有一段时间了,并且有很多改进),你可以做一个更安全(无竞赛)和更快{{1}感谢touch中的文件描述符支持:

    os.utime

    并非所有系统都支持文件描述符,因此如果您需要处理此类系统,请根据file descriptor support via os.supports_fd的测试定义def touch(fname, times=None): with open(fname, 'ab') as f: os.utime(f.fileno(), times)

答案 1 :(得分:0)

os.utime可以在Windows上运行,但可能你在浏览器中查看错误的日期。 os.utime不会修改创建日期(它看起来像是在资源管理器中的日期字段中使用的日期)。它会更新“修改日期”字段。如果右键单击类别栏并选中“修改日期”框,则可以看到此信息。或者,启动命令行并输入“dir”。那里显示的日期应反映出变化。

我在python 2.7上测试了os.utime,你必须提供两个参数:

date("z")+1;  

在Python 3上,第二个参数默认为None:

detail::tmat4x4<T> glm::gtc::quaternion::mat4_cast  (   detail::tquat< T > const &      x   )