2009-11-01 3 views
3

Я использую File :: модуль Copy, чтобы скопировать файл в Perl:Как скопировать файл в Perl и сохранить его временную метку?

#! /usr/bin/perl -w 

use File::Copy; 

copy("somefile.log", "copiedfile.log"); 

Я хотел бы сохранить временные метки (в частности, время модификации), но это, кажется, не вариант.

Есть ли простой способ достичь этого, не прибегая к системному вызову «cp -p»?

+0

сохранить временную метку (использовать stat), сделать копию и применить временную метку снова (используя utime) не будет работать? (так же, как команда «touch») –

+0

Джеймс, вы комментируете ответ Брайана: «Я бы с удивлением обнаружил, что обширные библиотеки Perl не имеют функции« копировать и сохранять атрибуты »(которая работает в Linux)», что вы имеете в виду под «работает над Linux»? Если вы говорите о cp -p, исходный код Linux делает именно то, что я предложил выше, используйте stat и utime для выполнения «сохранения». Вот он: (* (x-> xstat)) (src_path, & src_sb) ... \t utb.actime = src_sb.st_atime; \t utb.modtime = src_sb.st_mtime; \t utime (dst_path, & utb) –

+0

Murali, Perl имеет чистую команду «копировать и сохранять атрибуты», rmscopy (см. Ниже ответ на ghostdog74), но он доступен только для систем VMS. В Windows я считаю, что syscopy выполнит эту работу, так как я думаю, что стандартная семантика для копирования файла в Windows сохраняет метки времени. В Linux это не так, поэтому комбинация с тремя строками «copy, stat, utime» кажется самым чистым решением «чистого Perl». Это кажется мне неэлегантным, но, по-видимому, это единственный вариант, не делая обратный системный вызов. –

ответ

4

Вы можете использовать stat, чтобы получить отметку времени и utime, чтобы установить ее. Если вам это удастся, система не всегда плохая. Вы никогда не будете делать что-то быстрее, чем cp -p. Вы думаете, что File::Copy сделает это, но на unix это не так. Абигейл подала RT #96158, но она была закрыта без каких-либо действий. У него есть презентация о его разрыве, но я не видел его в Интернете.

+0

stat и utime являются опцией, но на самом деле не соответствуют критериям «прямолинейности». Возможно, я ожидаю слишком много, хотя мне было бы удивительно, если бы обширные библиотеки Perl не имели функции «копировать и сохранять атрибуты» (которая работает в Linux). –

+3

Возможно, ваше определение просто отличается. Что касается удивления отсутствием хорошего модуля, то это потому, что никто не верит, как сломанный File :: Copy, поэтому никто не придумал лучшего. –

+1

Похоже, это лучшее решение. В моей программе я пошел на 'cp -p', что является приемлемым и простым для довольно отложенного сценария, который я не собираюсь распространять, но я думаю, что чистым решением будет завершение копирования, stat и utime в аккуратную библиотечную функцию. –

4

Проверить File::Copy. Посмотрите под syscopy или rmscopy. Там говорится о временных отметках.

+0

http://perldoc.perl.org/File/Copy.html –

+0

rmscopy представляется многообещающим, но доступен только на системах VMS (а не на Linux, которые я использую). Форматирование документации делает это несколько неясным, но я проверил файл Copy.pm в моей установке 5.10.0, а rmscopy не определен. –