Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 [ 104 ] 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242

9.2. Удаление файла 329

$SECONDS PER DAY = 60 . 60 . 24; ($atime, $mtime) = (stat($file))[8, 9]; $atime -= 7 • $SECQNDS PER DAY; Smtime -= 7 * $SECONDS PER DAY;

utime($atime, Smtime, $file)

or die "couldnt backdate $file by a week w/ utime; $!";

Функция utime должна вызываться для обоих атрибутов, atime и mtime. Если вы хотите задать лишь одно из этих значений, необходимо предварительно получить другое с помощью функции stat:

Smtime = (stat $file)[9]; utime(time, $mtime, $file);

Применение модуля File::stat упрощает этот фрагмент:

use File::stat;

utime(time, stat($file)->mtime, Sfile);

Функция utime позволяет сделать вид, будто к файлу вообще никто не притрагивался (если не считать обновления ctime). Например, для редактирования файла можно воспользоваться программой из примера 9.1.

Пример 9.1. uvi

#!/usr/bin/perl -w

# uvi - редактирование файла в vi без изменения атрибутов времени

Sfile = shift or die "usage; uvi filename\n"; (Satime, Smtime) = (stat(Sfile))[8,9]; system($ENV{EDITOR} "vi", Sfile); utime($atime, Smtime, Sfile)

or die "couldnt restore Sfile to orig times: S!";

> Смотри также-

Описание функций stat и utime и perlfunc{\); стандартный модуль File::stat и страница руководства utime{3).

9.2. Удаление файла

Проблема

Требуется удалить файл. Функция Perl delete вам не подходит.

Решение

Воспользуйтесь функцией Perl unlink:

unlink(SFlLENAME) or die "Cant delete SFILENAME; S!\n"

unlink(@FlLENAMES) == ©FILENAMES or die

"Couldnt unlink all of ©FILENAMES: $!\n";



Если для каталога не был установлен бит запрета 010000, который разрешает удаление только владельцу В общих каталогах типа /tmp по соображениям безопасности обычно испо г1ьзуется режим 01777

Комментарий

функция unlink была названа но имени системной функции UNIX. В Perl она получает список имен файлов и возвращает количество успещно удаленных файлов. Возвращаемое значение можно проверить с помощью или о г:

unlink($file) or die Can t unlink Sfile S

Функция unlink не сообщает, какие файлы не были удалены - лищь их общее количество. Следующий фрагмент проверяет, успешно ли состоялось удаление нескольких файлов, и выводит количество удаленных файлов:

unless {(Scount = unlink(@filelist)) == @filelist) { warn could only delete Scount of (@filelist) files ,

Перебор @filelist в цикле foreach позволяет выводить отдельные сообщения об ошибках.

В UNIX удаление файла из каталога требует права записи для каталога, а не для файла, поскольку изменяется именно каталог. В некоторых ситуациях появляется возможность удаления файла, в который запрещена запись, или записи в файл, который нельзя удалить.

Если удаляемый файл открыт некоторым процессом, операционная система удаляет элемент каталога, но не освобождает блоки данных до закрытия файла во всех процессах. Именно так работает функция new trnpf ile в lO.File (см рецепт 7.5).

[> Смотри также-

Описание функции unlink в perlfunc{\)\ страница руководства unlink{2). Идея с удаленным файлом, который продолжает оставаться доступным, применяется в рецепте 7.5.

9.3. Копирование или перемещение файла

Проблема

Необходимо скопировать файл, однако в Perl не существует встроенной команды копирования.

Решение

Воспользуйтесь функцией сору стандартного модуля FiIe::Copy.

use File Copy, copy($oldfile, Snewfile),



9.3. Копирование или перемещение файла 331

open(IN, < Soldfile ) or die can t open $oldfile $i ,

open(OUT, > $newfile ) or die can t open $newfile $ ,

Sblksize = (stat IN)[11] 16384, # Желательный размер блока

while ($len = sysread IN, $buf, $blksize) { If (idefmed $len) {

next if $1 =~ /"Interrupted/

die System read error $\n ,

Soffset = 0,

while (Slen) { # Частичные операции записи

defined($written = syswrite OUT Sbuf, Slen, Soffset)

or die System write error $\en Slen -= Swritten, Soffset += Swritten,

close(IN) close(OUT),

Также можно воспользоваться программой copy вашей системы:

system( ср Soldfile Snewfile ), # unix

system( copy Soldfile Snewfile ) # dos, vms

Комментарий

Модуль File::Copy содержит функции copy и move. Они удобнее низкоуровневых функций ввода/вывода и обладают большей переносимостью по сравнению с вызовом system. Функция move допускает перемещение между каталогами, а стандартная функция Perl rename - нет (обычно).

use File Copy,

сору( datafile dat , datafile bak ) or die copy failed S

move( datafile new , datafile dat ) or die move failed $ ,

Поскольку обе функции возвращают лишь простой признак успешного заверщения, вы не сможете легко определить, какой файл помешал успешному копированию или перемещению. При ручном копировании файлов можно узнать, какие файлы не были скопированы, но в зтом случае ваша программа забивается сложными вызовами sysread и syswrite.

> Смотри также-

Описание функций rename, read и syswrite в perlfunc(l); документация по стандартному модулю File:: Сору.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 [ 104 ] 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242