Анимация
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

Файл

Чтение

Запись

Присоединение

Создание

7.1.

Очистка содержимого

Открытие файла 245 Флаги Символы

о

<файл

RDONLY

"r"

> файл,

WRONLY

"w"

режим

TRUNC

открытия>

GREAT

» файл>.

WRONLY

"a"

режим

APPEND

открытия>

GREAT

+< файл

RDWR

"r+"

+> файл,

RDWR

режим

TRUNC

открытия>

GREAT

+» файл>,

RDWR

"a+"

режим

APPEND

открытия>

GREAT

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

Функция sysopen получает три или четыре аргумента:

sysopen(FILEHANDLE, sysopen(FILEHANDLE,

Sname, Sflags) or die "Cant open Sname

Sname, Sflags, Sperms) or die "Cant open Sname

Здесь Sname - имя файла без «довесков» в виде < или +; Sflags - число, полученное объединением констант режимов 0 СЯЕАТ, 0 WRONLY, 0 TRUNG и т. д. операцией OR. Конкретный состав доступных констант 0 зависит от операционной системы. Дополнительные сведения модно найти в электронной документации (обычно ореп(2), но не всегда) или в файле /usr/include/fcntl.h. Обычно встречаются следующие константы:

0 RDONLY Только чтение. 0 WRONLY Только запись. 0 RDWR Чтение и запись.

0 CREAT Создание файла, если он не существует.

0 EXCL Неудачное заверщение, если файл уже существует.

0 APPEND Присоединение к файлу.

0 TRUNC Очистка содержимого файла.

0 NONBLOCK Асинхронный доступ.

К числу менее распространенных констант принадлежат 0 SHLOCK, 0 EXLOCK, 0 BINARY, 0 NOCTTY и 0 SYNC. Обращайтесь к странице руководства ореп(2) или к ее эквиваленту.

Если функции sysopen не передается аргумент Sperms, Perl использует восьмеричное число 0666. Права доступа задаются в восьмеричной системе и учитыва-



ют текущее значение маски доступа (задаваемой функцией umask) процесса. В маске доступа сброшенные биты соответствуют запрещенным правам. Например, если маска равна 027 (группа не может записывать; прочие не могут читать, записывать или выполнять), то вызов sysopen с параметром 066 создает файл с правами 0640 (0666&-027 = 0640).

Если у вас возникнут затруднения с масками доступа, воспользуйтесь простым советом: передавайте значение 0666 для обычных файлов и 0777 для каталогов и исполняемых файлов. У пользователя появляется выбор: если ему понадобятся защищенные файлы, то может выбрать маску 022, 027 или антиобщественную маску 077. Как правило, решения из области распределения прав должны приниматься не программой, а пользователем. Исключения возникают при записи в файлы, доступ к которым ограничен: почтовые файлы, cookies в Web-броузерах, файлы .rhosts и т. д. Короче говоря, функция sysopen почти никогда не вызывается с аргументом 0644, так как у пользователя пропадает возможность выбрать более либеральную маску.

Приведем примеры практического использования open и sysopen.

Открытие файла для чтения:

open(FH, "< Spath") or die$!;

sysopen(FH, Spath, 0 RDONLY) or die$!;

Открытие файла для записи (если файл не существует, он создается, а если существует - усекается):

open(FH, "> Spath") or dle$!;

sysopen(FH, Spath, 0 WRONLY0 TRUNC0 CREAT) or dle$!;

sysopen(FH, Spath, 0 WRONLY0 TRUNC0 CREAT, 0600) or die$!;

Открытие файла для записи с созданием нового файла (файл не должен существовать):

sysopenCFH, Spath, 0 WRONLY0 EXCL0 CREAT) or dieS!;

sysopen(FH, Spath, 0 WRONLY0 EXCL0 CREAT, 0600) or die$!;

Открытие файла для присоединения (в случае необходимости файл создается):

open(FH, "» Spath") or dieS!

sysopenCFH, Spath, 0 WRONLY0 APPEND0 CREAT) or die$!

sysopen(FH, Spath, 0 WRONLY0 APPEND0 CREAT, 0600) or die$!

Открытие файла для присоединения (файл должен существовать);

sysopen(FH, Spath, 0 WRONLY0 APPEND) ordieS!;

Открытие файла для обновления (файл должен существовать):

open(FH, "+< Spath") or dieS!;

sysopen(FH, Spath, 0 RDWR) or die$!;

Открытие файла для обновления (в случае необходимости файл создается):

sysopen(FH, Spath, 0 RDWR0 CREAT) or dieS!;

sysopen(FH, Spath, 0 RDWR0 CREAT, 0600) or die$!;

Открытие файла для обновления (файл не должен существовать):



7.2. Открытие файлов с нестандартными именами 247

sysopen(FH, Spath, 0 RDWR0 EXCL0 CfiEAT) or dieS!;

sysopen(FH, Spath, 0 RDWR0 EXCL0 CREAT, 0600) or die$!;

Маска 0600 всего лишь поясняет, как создаются файлы с ограниченным доступом. Обычно этот аргумент пропускается.

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

Описание функций open, sysopen и umask в perlfunc(i); документация по стан- дартным модулям IO::File и Fcntl; страницы руководства ореп(2), fopen(3) и umask(2); рецепт 7.2.

7.2. Открытие файлов с нестандартными именами

Проблема

Требуется открыть файл с нестандартным именем - например, "-"; начинающимся с символа <, > или ; содержащим начальные или конечные пропуски; заканчивающимся символом I. Функция open не должна принимать эти функции за служебные, поскольку вам нужно совершенно иное.

Решение

Выполните предварительное преобразование:

Sfilename =~ s#~(\s)#./Sl#;

open(HANDLE, "< Sfilename\0") or die "cannot open Sfilename : S!\n";

Или просто воспользуйтесь функцией sysopen:

sysopen(HANDLE, Sfilename, 0 RD0NLY) or die "cannot open Sfilename : $!\n";

Комментарий

Функция open определяет имя файла и режим открытия по одному строковому аргументу. Если имя файла начинается с символа, обозначающего один из режимов, open вполне может сделать что-нибудь неожиданное. Рассмотрим следующий фрагмент:

Sfilename = shift @ARGV;

open(INPUT, Sfilename) or die "cannot open Sfilename ; S!\n";

Если пользователь указывает в командной строке файл ">/etc/passwci", программа попытается открыть/etc/passwd для записи - со всеми вытекающими последствиями! Режим можно задать и явно (например, для записи):

open(0UTPUT, ">$filename")

or die "Couldnt open Sfilename for writing: S!\n";

ho даже в этом случае пользователь может ввести имя ">data", после чего программа будет дописывать данные в конец файла data вместо того, чтобы стереть прежнее содержимое.



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