Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Copying file without previous meta data

Tags:

python

copy

I'm doing multiple copies of a file with the following command:

shutil.copy2(oldFile, newFile)

And rather than returning the creation date of the newly created file, it's keeping the older one. I'm retrieving the date with:

dateCreated = os.path.getctime(newFile)

I thought this was due to the function being copy2 which carries over meta data I believe, so I tried it with just copy to no avail.

However the odd thing is that the 'Data Modified' tab in a Windows Explorer is showing the correct date and time.

like image 375
Federer Avatar asked Sep 06 '25 03:09

Federer


2 Answers

In the test I tried just now, I see the following behaviour:

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')

With no pre-existing version of test1.txt in the directory I get:

test1.txt -> Created: Today 8:54 AM
          -> Modified: Today 8:54 AM

I then delete test1.txt and run:

>>> copy2('test.txt','test1.txt')

With no pre-existing version of test1.txt in the directory I get:

test1.txt -> Created: Tuesday, January 24, 2012 2:52 PM
          -> Modified: Tuesday, January 24, 2012 2:52 PM

I then run:

>>> copy('test.txt','test1.txt')

So with a pre-existing version of test1.txt in the directory I get:

test1.txt -> Created: Tuesday, January 24, 2012 2:52 PM
          -> Modified: Today 9:00 AM

I then run:

>>> copy('test.txt','test1.txt')

So with a pre-existing version of test1.txt in the directory I get:

test1.txt -> Created: Tuesday, January 24, 2012 2:52 PM
          -> Modified: Today 9:01 AM

This is the behaviour you're seeing, your quote:

I thought this was due to the function being copy2 which carries over meta data I believe, so I tried it with just copy to no avail.

To get a new creation date you're going to have to actively remove the file before you create a new version of it using either copy or copyfile. Otherwise the date created will remain from it's original time of creation. copyfile evokes the same behaviour as copy with respect to date creation.

like image 130
sgallen Avatar answered Sep 07 '25 19:09

sgallen


Just to add one note regarding:

To get a new creation date you're going to have to actively remove the file before you create a new version of it using either copy or copyfile. Otherwise the date created will remain from it's original time of creation.

I wanted to write a script that makes a backup of some files and rollover files if there are more then n backups. When you remove the existing file manualy e.g. by 'del c:\test.txt' from other CMD window then running the script, and then run the script that makes a backup, the file gets new ctime. Otherwise, if the file with same name existed and you want to create a copy, the ctime will be somehow the same as in the deleted file.

I wrote an example: 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)))

output when file never existed (or deleted in different CMD window)

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:\>

output when script started second time in one CMD window

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:\>
like image 21
autoinstall Avatar answered Sep 07 '25 19:09

autoinstall