Копирование файла без предыдущих метаданных - PullRequest
2 голосов
/ 27 января 2012

Я делаю несколько копий файла с помощью следующей команды:

shutil.copy2(oldFile, newFile)

И вместо того, чтобы возвращать дату создания вновь созданного файла, он сохраняет более старую.Я извлекаю дату с помощью:

dateCreated = os.path.getctime(newFile)

Я думал, что это из-за функции copy2, которая переносит метаданные, я полагаю, поэтому я попробовал ее с copy безрезультатно.

Однако странным является то, что на вкладке «Изменение данных» в проводнике Windows отображаются правильные дата и время.

Ответы [ 3 ]

4 голосов
/ 27 января 2012

В тесте, который я только что попробовал, я вижу следующее поведение:

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 или copyfile.В противном случае date created останется от его первоначального времени создания.copyfile вызывает то же поведение, что и copy в отношении date creation.

1 голос
/ 05 мая 2014

Просто добавьте одну заметку, касающуюся:

Чтобы получить новую дату создания, вам нужно будет активно удалить файл, прежде чем создавать его новую версию с использованием функции copy или copyfile.В противном случае дата создания останется от первоначального времени создания.

Я хотел написать сценарий, который создает резервную копию некоторых файлов и файлов ролловеров, если существует более n резервных копий.Когда вы удаляете существующий файл вручную, например, с помощью 'del c: \ test.txt' из другого окна CMD, затем запускаете сценарий, а затем запускаете сценарий, который создает резервную копию, файл получает новое время ctime.В противном случае, если файл с таким именем существует и вы хотите создать копию, ctime будет как-то таким же, как в удаленном файле.

Я написал пример: 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)))

вывод, когда файл никогда не существовал (или не удалялся в другом окне CMD)

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

вывод, когда скрипт запускался второй раз в одном окне CMD

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:\>
0 голосов
/ 27 января 2012

Использование:

shutil.copyfile(src, dst)

Из документов : "[Это копирует] содержимое ( без метаданных ) файла с именем src в файл с именем dst."

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...