2017-03-06 52 views
0

我有一個Python腳本應該循環遍歷目錄中的所有文件,並將每個文件的日期設置爲當前時間。它似乎沒有效果,即文件資源管理器中的日期列顯示沒有變化。我看到代碼循環遍歷所有文件,看起來對utime的調用沒有效果。utime()在Windows中沒有效果

問題是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

+1

爲什麼在'touch()'中打開()'文件?你不需要這麼做 –

+0

感謝您的回覆。也許這不是必需的。我刪除了除utime之外的所有內容,行爲也沒有什麼不同。 –

+0

@Chris_Rands:需要像* NIX命令行'touch'那樣操作,如果該文件不存在,則創建該文件。如果沒有它,它會像一個輕微破壞的'touch -c'(它不會創建不存在的文件,事實上,當'os.utime'找不到該文件時引發異常)。 – ShadowRanger

回答

3

你有三個問題:

  1. 您正在使用的文件名,而不是完整路徑,因爲touch ing,所以所有的touch ing出現在工作目錄中
  2. 您也在剝離文件擴展名,所以被觸及的文件缺少擴展名
  3. 您正在觸摸具有打開文件句柄的文件,並且在Windows上,在Python 2.7上,這是一個問題,因爲os.utime opens the files with no sharing allowed,這與現有的開放式文件不兼容處理

要解決#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(這已經有一段時間了,並且有很多改進),你可以做一個更安全的(無競爭的),更快的touch,這要歸功於文件描述符的支持。 os.utime

def touch(fname, times=None): 
    with open(fname, 'ab') as f: 
     os.utime(f.fileno(), times) 

並非所有系統都將支持文件描述符,所以如果你需要處理這樣的系統,基於測試file descriptor support via os.supports_fd定義touch

+0

我認爲你已經破解了它,+1 –

+0

@Chris_Rands:當我意識到他們應該看到一堆空的新文件時,你讓我想到了最後一個問題。那時我注意到他們在走路時忘記了在根路徑上「加入」。這些文件在那裏,但沒有找到他們正在走的文件的地方。 – ShadowRanger

+0

@ShadowRanger你介意解釋你爲什麼在觸摸之前打開fname?我在win 10上使用Python 3,我可以不用'open()'來觸摸文件和文件夾。我在這裏錯過了什麼嗎? –

0

os.utime確實在Windows上工作,但可能是你在看瀏覽器中錯誤的日期。 os.utime不會修改創建日期(它看起來像是在資源管理器中的日期字段中使用的)。它會更新「修改日期」字段。你可以看到這個,如果你右鍵點擊類別欄並檢查「修改日期」框。或者,啓動一個命令行並鍵入「dir」。在那裏顯示的日期應該反映更改。

我測試了Python 2.7版,你必須os.utime給兩個參數:

os.utime("file.txt", None) 

和Python 3中,其中第二個參數默認爲無:

os.utime("file.txt") 
+0

嗯......這是可能的,我修改了我的默認視圖,但我的文件夾都顯示修改時間,而不是創建時間。當其他一切都被修復後,這可能是最後一個問題。 – ShadowRanger