复制文件而不带原元数据
我正在用以下命令复制一个文件:
shutil.copy2(oldFile, newFile)
但是,它返回的不是新文件的创建日期,而是旧文件的日期。我是通过以下方式获取日期的:
dateCreated = os.path.getctime(newFile)
我原以为这是因为使用了 copy2
函数,它会保留一些元数据,所以我尝试用 copy
,但还是没有解决。
不过奇怪的是,在Windows资源管理器中,“修改日期”显示的是正确的日期和时间。
3 个回答
我想补充一点关于这个话题的说明:
如果你想让一个文件的创建日期变成新的,你必须在创建新版本之前主动删除这个文件,可以使用复制或者复制文件的方式。否则,创建日期会保留原来的时间。
我想写一个脚本,用来备份一些文件,并在备份数量超过n个时进行轮换。如果你手动删除现有文件,比如在另一个命令提示符窗口中输入 'del c:\test.txt',然后再运行备份脚本,这样文件就会有新的创建时间。反之,如果同名的文件已经存在,而你想要创建一个副本,那么这个副本的创建时间会和被删除的文件保持一致。
我写了一个示例:
test.py:import os
import shutil
import datetime
f_path = 'c:\\test.txt'
print f_path
print 'ctime = ' + str(datetime.datetime.utcfromtimestamp(os.path.getctime(f_path)))
print 'mtime = ' + str(datetime.datetime.utcfromtimestamp(os.path.getmtime(f_path)))
print ''
bkp_file = f_path + '.bkp'
print 'copying to ' + bkp_file
shutil.copyfile(f_path, bkp_file)
print 'ctime = ' + str(datetime.datetime.utcfromtimestamp(os.path.getctime(bkp_file)))
print 'mtime = ' + str(datetime.datetime.utcfromtimestamp(os.path.getmtime(bkp_file)))
print ''
print 'removing backup...'
os.remove(bkp_file)
print 'os.path.exists(bkp_file) = ' + str(os.path.exists(bkp_file))
print ''
print 'copying to ' + bkp_file
shutil.copyfile(f_path, bkp_file)
print 'ctime = ' + str(datetime.datetime.utcfromtimestamp(os.path.getctime(bkp_file)))
print 'mtime = ' + str(datetime.datetime.utcfromtimestamp(os.path.getmtime(bkp_file)))
print ''
print 'removing backup again...'
os.remove(bkp_file)
print 'os.path.exists(bkp_file) = ' + str(os.path.exists(bkp_file))
import tempfile
tmp = tempfile.mktemp(dir='c:\\')
print ''
print 'Created temp file name - ' + tmp
print 'Copying to temp file name...'
shutil.copyfile(f_path, tmp)
print 'ctime = ' + str(datetime.datetime.utcfromtimestamp(os.path.getctime(tmp)))
print 'mtime = ' + str(datetime.datetime.utcfromtimestamp(os.path.getmtime(tmp)))
print ''
print 'renaming file to the same name as the one already deleted'
shutil.move(tmp, bkp_file)
print 'ctime = ' + str(datetime.datetime.utcfromtimestamp(os.path.getctime(bkp_file)))
print 'mtime = ' + str(datetime.datetime.utcfromtimestamp(os.path.getmtime(bkp_file)))
当文件从未存在(或者在不同的命令提示符窗口中被删除)时的输出
c:\test.py
c:\test.txt
ctime = 2014-04-30 14:43:41.649976
mtime = 2014-05-05 11:19:19.344976
copying to c:\test.txt.bkp
ctime = 2014-05-05 12:19:38.281976
mtime = 2014-05-05 12:19:38.282976
removing backup... os.path.exists(bkp_file) = False
copying to c:\test.txt.bkp
ctime = 2014-05-05 12:19:38.281976
mtime = 2014-05-05 12:19:38.284976
removing backup again... os.path.exists(bkp_file) = False
Created temp file name - c:\tmpn5ofid Copying to temp file name...
ctime = 2014-05-05 12:19:38.311976
mtime = 2014-05-05 12:19:38.312976
renaming file to the same name as the one already deleted
ctime = 2014-05-05 12:19:38.281976
mtime = 2014-05-05 12:19:38.312976
C:\>
当脚本在同一个命令提示符窗口中第二次运行时的输出
C:\>test.py
c:\test.txt
ctime = 2014-04-30 14:43:41.649976
mtime = 2014-05-05 11:19:19.344976
copying to c:\test.txt.bkp
ctime = 2014-05-05 12:19:38.281976 # ctime of old file
mtime = 2014-05-05 12:21:58.179976
removing backup... os.path.exists(bkp_file) = False
copying to c:\test.txt.bkp
ctime = 2014-05-05 12:19:38.281976 # ctime of old file that does not exist
mtime = 2014-05-05 12:21:58.190976
removing backup again... os.path.exists(bkp_file) = False
Created temp file name - c:\tmpzi2lp2 Copying to temp file name...
ctime = 2014-05-05 12:21:58.222976
mtime = 2014-05-05 12:21:58.222976
renaming file to the same name as the one already deleted
ctime = 2014-05-05 12:19:38.281976 # after renaming existing file it gets old ctime
mtime = 2014-05-05 12:21:58.222976
C:\>
在我刚才做的测试中,我观察到了以下情况:
test.txt -> Created: Tuesday, January 24, 2012 2:52 PM
-> Modified: Tuesday, January 24, 2012 2:52 PM
>>> from shutil import *
>>> copy('test.txt','test1.txt')
在目录中没有test1.txt这个文件的情况下,我得到了:
test1.txt -> Created: Today 8:54 AM
-> Modified: Today 8:54 AM
然后我删除了test1.txt,并运行:
>>> copy2('test.txt','test1.txt')
在目录中没有test1.txt这个文件的情况下,我得到了:
test1.txt -> Created: Tuesday, January 24, 2012 2:52 PM
-> Modified: Tuesday, January 24, 2012 2:52 PM
接着我运行:
>>> copy('test.txt','test1.txt')
所以在目录中有test1.txt这个文件的情况下,我得到了:
test1.txt -> Created: Tuesday, January 24, 2012 2:52 PM
-> Modified: Today 9:00 AM
然后我运行:
>>> copy('test.txt','test1.txt')
所以在目录中有test1.txt这个文件的情况下,我得到了:
test1.txt -> Created: Tuesday, January 24, 2012 2:52 PM
-> Modified: Today 9:01 AM
这就是你看到的情况,你引用的内容:
我认为这是因为使用了copy2这个函数,它会保留一些元数据,所以我尝试了使用copy,但没有成功。
要想获得一个新的创建日期,你需要在创建新版本之前主动删除这个文件,可以使用copy
或copyfile
。否则,创建日期
会保留原来的创建时间。copyfile
在处理创建日期
时表现得和copy
一样。