Глава 12 - Файлы
Руководство пользователя REBOL/Core Основное содержание Отправьте нам отзыв
Содержание:
1. Обзор
2. Имена и пути
2.1 Имена файлов
2.2 Строки пути
2.3 Чувствительность к регистру
2.4 Функции имени файла
3. Чтение файлов
3.1 Чтение текстовых файлов
3.2 Чтение двоичных файлов
3.3 Чтение по сети
4. Запись файлов
4.1 Запись текстовых файлов
4.2 Запись двоичных файлов
4.3 Запись файлов в сеть
5. Преобразование строк
6. Блоки строк
7. Информация о файлах и каталогах
7.1 Проверка каталога
7.2 Существование файла
7.3 Размер файла
7.4 Дата изменения файла
7.5 Информация о каталоге
8. Каталоги
8.1 Чтение каталога
8.2 Создание каталога
8.3 Переименование каталогов и файлов
8.4 Удаление каталогов и файлов
8.5 Текущий каталог
8.6 Изменение текущего каталога
8.7 Список текущего каталога
1. Обзор
Важным аспектом возможностей REBOL является его способность манипулировать файлами и каталогами. REBOL предоставляет широкий спектр функций, позволяющих выполнять операции от простого чтения файлов до прямого доступа к файлам и каталогам. Дополнительные сведения о прямом доступе к файлам и каталогам см. В главе «Порты».
2. Имена и пути
REBOL предоставляет стандартное машинно-независимое соглашение об именах файлов и путей.
2.1 Имена файлов
В сценариях имена файлов и пути записываются со знаком процента (%), за которым следует последовательность символов:
%examples.r
%big-image.jpg
%graphics/amiga.jpg
%/c/plug-in/video.r
%//sound/goldfinger.mp3
Знак процента необходим для предотвращения интерпретации имен файлов как слов в пределах языка.
Хотя это не очень хорошая практика, в имена файлов можно включать пробелы, заключив имя файла в двойные кавычки (" "). Двойные кавычки не позволяют интерпретировать имя файла как несколько слов:
%"this file.txt"
%"cool movie clip.mpg"
Стандартное Интернет-соглашение об использовании знака процента (%) и шестнадцатеричного кода также разрешено для кодировки символов. Когда это будет сделано, кавычки не требуются. Вышеупомянутые имена файлов также могут быть записаны как:
%this%20file.txt
%cool%20movie%20clip.mpg
Обратите внимание, что стандартным суффиксом файла для сценариев REBOL является «.r». В системах, где это соглашение противоречит другому типу файлов, вместо него может использоваться суффикс «.reb».
2.2 Строки пути
Пути к файлам записываются со знаком процента (%), за которым следует последовательность имен каталогов, каждое из которых разделено косой чертой (/).
%dir/file.txt
%/file.txt
%dir/
%/dir/
%/dir/subdir/
%../dir/file.txt
Стандартным символом для разделения каталогов является косая черта (/), а не обратная косая черта (\). Если обнаружены обратные косые черты, они преобразуются в прямые:
probe %\some\cool\movie.mpg
%/some/cool/movie.mpg
REBOL предоставляет стандартный, независимый от операционной системы метод определения путей к каталогам. Пути могут быть относительными к текущему каталогу или абсолютными от файловой структуры верхнего уровня операционной системы.
Пути к файлам, которые не начинаются с косой черты (/), являются относительными.
%docs/intro.txt
%docs/new/notes.txt
%"new mail/inbox.mbx"
Также поддерживается стандартное соглашение об использовании двойных точек (..) для обозначения родительского каталога или одиночной точки (.) Для обозначения текущего каталога. Например:
%.
%./
%./file.txt
%..
%../
%../script.r
%../../plans/schedule.r
В путях к файлам используется стандартное Интернет-соглашение о начале абсолютных путей с косой черты (/). Косая черта указывает на начало с верхнего уровня файловой системы. (Как правило, следует избегать абсолютных путей, чтобы гарантировать машинно-независимые сценарии.) Пример:
%/home/file.txt
будет ссылаться на том или раздел диска с именем home. Другие примеры:
%/ram/temp/test.r
%/cd0/scripts/test/files.r
Для обозначения тома C, который часто используется в Windows, используются следующие обозначения:
%/C/docs/file.txt
%"/c/program files/qualcomm/eudora mail/out.mbx"
Обратите внимание, что в приведенных выше строках дисковый том C не записывается как:
%c:/docs/file.txt
Приведенный выше пример не является машинно-независимым форматом и вызывает ошибку.
Если имя первого каталога отсутствует, а путь начинается с двойной косой черты (//), то путь к файлу указывается относительно текущего тома:
%//docs/notes
2.3 Чувствительность к регистру
В REBOL имена файлов по умолчанию не чувствительны к регистру. Однако, когда новые файлы создаются языком, они сохраняют тот регистр, в котором были введены:
write %Script-File.r file-data
В приведенном выше примере создается имя файла с буквами S и F в верхнем регистре.
Кроме того, когда имена файлов считываются из каталогов, регистр сохраняется:
print read %/home
Для систем с учетом регистра, таких как UNIX, REBOL находит наиболее близкое совпадение регистра с указанным файлом. Например, если сценарий просит прочитать %test.r, но находит только %TEST.r, будет прочитан файл %TEST.r. Такое поведение необходимо, чтобы разрешить машинно-независимые сценарии
2.4 Функции имени файла
Предусмотрены различные функции, которые помогут вам создавать имена и пути к файлам. Они перечислены ниже в разделе «Функции имени файла».
| | to-file | Преобразует строки и блоки в имя файла или путь к файлу.
|
| | split-path | Разбивает путь на часть каталога и имя файла.
|
| | clean-path | Возвращает абсолютный путь, эквивалентный любому заданному пути, содержащему двойную точку (..) или точку (.).
|
| | what-dir | Возвращает абсолютный путь к текущему каталогу.
|
3. Чтение файлов
Файлы читаются как последовательность текстовых символов или как двоичные байты. Источником файла является либо локальный файл в вашей системе, либо файл из сети.
3.1 Чтение текстовых файлов
Чтобы прочитать локальный текстовый файл, используйте функцию read:
text: read %file.txt
Функция read возвращает строку, содержащую весь текст файла. В приведенном выше примере переменный text относится к этой строке.
В строке, возвращаемой методом read, окончание строки преобразуются в символы новой строки newline, независимо от того, какой стиль завершения строки используется в вашей операционной системе. Это позволяет вам писать сценарии, которые ищут новую строку (newline), не заботясь о том, какой конкретный символ или символы составляют завершение строки.
next-line: next find text newline
Файл также можно читать как отдельные строки, которые хранятся в блоке
lines: read/lines %file.txt
Смотрите раздел конверсионной линии для получения дополнительной информации о новых строках (newline) и чтении строк.
Чтобы читать файл по частям, используйте функцию open, как описано в главе «Порты».
Чтобы просмотреть содержимое текстового файла, вы можете прочитать его с помощью функции read и распечатать с помощью функции print:
print read %service.txt
I wanted the gold, and I sought it,I scrabbled and mucked like
a slave.
3.2 Чтение двоичных файлов
Чтобы прочитать двоичный файл, такой как изображение, программа или звук, используйте read/binary:
data: read/binary %file.bin
Функция read/binary кода возвращает двоичный ряд, содержащий все содержимое файла. В приведенном выше примере переменные data относятся к двоичной серии. Никакого преобразования в файл не производится.
Чтобы читать двоичный файл по частям, используйте функцию open, как описано в главе «Порты».
3.3 Чтение по сети
Файлы можно читать из сети. Например, чтобы просмотреть текстовый файл из сети по протоколу HTTP:
print read http://www.rebol.com/test.txt
Hellotherenewuser!
Файл можно было записать локально со строкой:
write %test.txt read http:/www.rebol.com/test.txt
В процессе записи конец строки файла будет преобразован в то, что используется вашей операционной системой.
Чтобы прочитать и сохранить двоичный файл, например изображение, используйте следующую строку:
write %image.jpg
read/binary http:/www.rebol.com/image.jpg
Обратитесь к главе «Сетевые протоколы» для получения дополнительной информации и примеров доступа к файлам в сети.
4. Запись файлов
Вы можете записать файл как серию текстовых символов или как двоичные байты. Местоположение файла может быть либо локальным файлом в вашей системе, либо файлом в сети.
4.1 Запись текстовых файлов
Чтобы написать локальный текстовый файл, используйте следующую строку кода:
write %file.txt "sample text here"
Это запишет весь текст в файл.
Если файл содержит символы новой строки (newline), они будут преобразованы в символы, используемые вашей локальной файловой системой. Это позволяет работать с файлами в последовательном порядке, но записывать их с помощью конвенции, которая является стандартной для вашей файловой системы.
Например, следующая строка преобразует любой текстовый файл из однострочного формата завершения (UNIX, Macintosh, PC, Amiga) в формат, используемый вашей локальной системой:
write %newfile.txt read %file.txt
Вышеупомянутая строка считывает весь файл при преобразовании окончания строки в стандарт REBOL, а затем записывает файл, преобразовывая его в формат локальной операционной системы.
Чтобы добавить в конец файла, используйте уточнение /append:
write/append %file.txt "more text"
Файл также можно записать из отдельных строк, которые хранятся в блоке.
write/lines %file.txt lines
Чтобы записать файл по частям, используйте функцию open, как описано в главе «Порты».
4.2 Запись двоичных файлов
Чтобы записать двоичный файл, такой как изображение, программа, звук, используйте
write/binary:
write/binary %file.bin data
Функция write/binary файла создает файл, если он не существует, или перезаписывает файл, если он уже существует. Никакого преобразования в файл не производится.
Чтобы записать двоичный файл по частям, используйте функцию open, как описано в главе «Порты».
4.3 Запись файлов в сеть
Файлы также можно записывать в сеть. Например, чтобы записать текстовый файл в сеть с помощью FTP, используйте:
write ftp://ftp.domain.com/file.txt "save this text"
Файл можно прочитать локально и записать в сеть с помощью такой строки, как:
write ftp://ftp.domain.com/file.txt read %file.txt
При этом окончание строки файла преобразуется в стандартный формат CRLF.
Чтобы записать двоичный файл, например изображение, в сеть, используйте следующие строки кода:
write/binary ftp://ftp.domain.com/file.txt/image.jpg
read/binary %image.jpg
См. Главу «Сетевые протоколы» для получения дополнительной информации и примеров доступа к файлам из сетей.
5. Преобразование строк
Когда файл читается как текст, все символы конца строки преобразуются в символы новой строки (newline, "перевода строки"). Перевод строки (используемый в качестве ограничителя строки в системах Amiga, Linux и UNIX), возврат каретки (используемый в качестве ограничителя строки в Macintosh) и комбинация CR / LF (ПК и Интернет) преобразуются в эквивалентные символы новой строки.
Использование в сценариях стандартного терминатора строки позволяет им работать машинно-независимым образом. Например, чтобы найти и подсчитать все символы новой строки в текстовом файле:
text: read %file.txt
count: 0
while [spot: find text newline][
count: count + 1
text: next spot
]
Преобразование строк также полезно для чтения сетевых файлов:
text: read ftp://ftp.rebol.com/test.txt
Когда файл записывается, символ новой строки преобразуется в стандарт стиля завершения строки для используемой операционной системы. Например, символ новой строки преобразуется в CRLF на ПК, LF в UNIX или Amiga или CR в Macintosh. Сетевые файлы пишутся с помощью CRLF.
Следующая функция преобразует любой текстовый файл с любым стилем терминатора в файл, используемый локальной операционной системой:
convert-lines: func [file] [write file read file]
Файл читается, и все символы конца строки преобразуются, затем файл записывается, и символы новой строки преобразуются в стиль локальной операционной системы
Преобразование строк можно отключить, прочитав файл как двоичный. Например, следующая строка:
write/binary %newfile.txt read/binary %oldfile.txt
сохраняет символы окончания строки текстового файла.
6. Блоки линий
Доступ к текстовым файлам и управление ими можно выполнять как отдельные строки текста, а не как одну серию символов. Например, чтобы прочитать файл как блок строк:
lines: read/lines %service.txt
В приведенном выше примере возвращается блок, содержащий серию строк (по одной для каждой строки) без символов оканчания строки. Пустые строки представлены пустыми строками.
Чтобы напечатать определенную строку, вы используете следующий код:
print first lines
print last lines
print pick lines 100
print lines/500
Чтобы напечатать все строки файла, используйте следующую строку кода:
foreach line lines [print line]
I wanted the gold, and I sought it,
I scrabbled and mucked like a slave.
Was it famine or scurvy -- I fought it;
I hurled my youth into a grave.
I wanted the gold, and I got it --
Came out with a fortune last fall, --
Yet somehow life's not what I thought it,
And somehow the gold isn't all.
Чтобы напечатать все строки, содержащие строку gold, используйте следующую строку кода:
foreach line lines [
if find line "gold" [print line]
]
I wanted the gold, and I sought it,
I wanted the gold, and I got it --
And somehow the gold isn't all.
Вы можете записать текстовый файл в виде строк, используя функцию write:
write/lines %output.txt lines
Чтобы записать определенные строки из блока, используйте:
write/lines %output.txt [
"line one"
"line two"
"line three"
]
Фактически, функции read/lines (чтения/строк) и write/lines (записи/строк) могут быть объединены для обработки файлов по одной строке за раз. Например, следующий код удаляет все комментарии из сценария REBOL:
script: read/lines %script.r
foreach line script [
where: find line ";"
if where [clear where]
]
write/lines %script1.r script
Образец сценария в приведенном выше примере предназначен только для демонстрационных целей. Помимо удаления комментариев, пример сценария также удаляет действительные точки с запятой в строках, заключенных в кавычки.
Файлы также можно читать как строки из сети:
data: read/lines http://www.rebol.com
print pick (read/lines ftp://ftp.rebol.com/test.txt) 3
new
Уточнение /lines может быть использовано с функцией open, чтобы прочитать строку в то время от консольного ввода. Дополнительную информацию см. В главе «Порты».
Кроме того, /lines можно использовать с /append для добавления строк из блока в файл.
7. Информация о файлах и каталогах
Существует ряд функций, которые предоставляют полезную информацию о файле, например, существует ли он, размер его файла в байтах, когда он был в последний раз изменен и является ли он каталогом.
7.1 Проверка каталога
Чтобы определить, совпадает ли имя файла с именем каталога, используйте команду функции dir?:
print dir? %file.txt
false
print dir? %.
true
Функция dir? также работает с некоторыми сетевыми протоколами:
print dir? ftp://www.rebol.com/pub/
true
7.2 Существование файла
Чтобы определить, существует ли файл, используйте команду функции b>exists?:
print exists? %file.txt
Чтобы определить, существует ли файл, прежде чем вы его прочитаете, используйте:
if exists? file [text: read file]
Чтобы избежать перезаписи файла, с помощью которого вы можете проверить его, используйте:
if not exists? file [write file data]
Функция exists? также работает с некоторыми сетевыми протоколами:
print exists? ftp://www.rebol.com/file.txt
7.3 Размер файла
Чтобы получить размер файла в байтах, используйте функцию size?:
print size? %file.txt
Функция size? также работает с некоторыми сетевыми протоколами:
print size? ftp://www.rebol.com/file.txt
7.4 Дата изменения файла
Чтобы получить дату последнего изменения файла, используйте функцию modified?:
print modified? %file.txt
30-Jun-2000/14:41:55-7:00
Не все операционные системы отслеживают дату создания файла, поэтому для того, чтобы сценарии REBOL оставались независимыми от операционной системы, доступна только дата последнего изменения.
Функция modified? также работает с некоторыми сетевыми протоколами:
print modified? ftp://www.rebol.com/file.txt
7.5 Справочная информация/h3>
Функция info? получает всю информацию о каталоге или файле одновременно. Информация возвращается в виде объекта:
probe info? %file.txt
make object! [
size: 306
date: 30-Jun-2000/14:41:55-7:00
type: 'file
]
Чтобы распечатать информацию обо всех файлах в текущем каталоге, используйте:
foreach file read %. [
info: info? file
print [file info/size info/date info/type]
]
build-guide.r 22334 30-Jun-2000/14:24:43-7:00 file
code/ 11 11-Oct-1999/18:37:04-7:00 directory
data.r 41 30-Jun-2000/14:41:36-7:00 file
file.txt 306 30-Jun-2000/14:41:55-7:00 file
Функция info? также работает с некоторыми сетевыми протоколами:
probe info? ftp://www.rebol.com/file.txt
8. Директории
Есть несколько простых в использовании функций для чтения каталогов, управления подкаталогами, создания новых каталогов, переименования файлов и удаления файлов. Кроме того, есть стандартные функции для получения, изменения и вывода текущего каталога. Дополнительную информацию о прямом доступе к каталогам см. В главе «Порты».
8.1 Чтение каталога
Каталоги читаются так же, как файлы. Функция read возвращает блок имен файлов, а не текстовые или двоичные данные.
Чтобы прочитать все имена файлов из текущего каталога, используйте следующую строку кода:
read %.
В приведенном выше примере считывается весь каталог и возвращается блок имен файлов.
Чтобы распечатать имена всех файлов в каталоге intro, используйте следующую строку кода:
print read %intro/
CVS/ history.t intro.t overview.t quick.t
В возвращаемом блоке имена каталогов обозначаются косой чертой в конце. Чтобы напечатать каждое имя файла в отдельной строке, используйте:
foreach file read %intro/ [print file]
CVS/
history.t
intro.t
overview.t
quick.t
Вот простой способ распечатать только найденные каталоги:
foreach file read %intro/ [
if #"/" = last file [print file]
]
CVS/
Если вы хотите прочитать каталог из сети, не забудьте включить косую черту в конце URL-адреса, чтобы указать протокоу, что вы ссылаетесь на каталог:
print read ftp://ftp.rebol.com/
8.2 Создание каталога
Функция make-dir создает новый каталог. Новое имя каталога может быть указанно как относительно текущего каталога, так и содержать абсолютный пути.
make-dir %new-dir
make-dir %local-dir/
make-dir %/work/docs/old-docs/
Завершающая косая черта не является обязательной для этой функции.
Внутренне вызовы функции make-dir это вызов функции open с уточнением /new. Строка:
close open/new %local-dir/
также создает новый каталог. Завершающая косая черта важна в этом примере, указывая на то, что создается каталог, а не файл.
Если вы используете функцию make-dir для создания каталога, который уже существует, произойдет ошибка. Ошибка может быть обнаружена с помощью функции try. Каталог можно заранее проверить с помощью функции exists?.
8.3 Переименование каталогов и файлов
Чтобы переименовать файл, используйте функцию rename:
rename %old-file %new-file
Старое имя файла может включать полный путь к файлу, но новое имя файла не должно включать путь. Это связано с тем, что функция rename не предназначена для перемещения файлов между каталогами (различные операционные системы не поддерживают эту функцию).
rename %../docs/intro.txt %conclusion.txt
Если старое имя файла каталога (обозначается слэш), то функция rename переименовывает каталог:
rename %../docs/ %manual/
Если файл не может быть переименован, произойдет ошибка. Ошибка может быть обнаружена с помощью функции try.
8.4 Удаление каталогов и файлов
Файлы можно удалить с помощью функции delete:
delete %file
Удаляемый файл может включать путь:
delete %source/docs/file.txt
Также можно удалить блок файлов в том же каталоге:
delete [%file1 %file2 %file3]
Группа файлов может быть удалена с помощью подстановочного знака и уточнения /any:
delete/any %file*
delete/any %secret.?
Подстановочный знак звездочка (*) соответствует всем символам, а подстановочный знак вопросительного знака (?) соответствует одному символу.
Чтобы удалить каталог, укажите в конце косую черту
delete %dir/
delete %../docs/old/
Если файл не может быть удален, произойдет ошибка. Ошибка может быть обнаружена с помощью функции try.
8.5 Текущий каталог
Используйте функцию what-dir, чтобы определить текущий каталог:
print what-dir
/work/REBOL/
Функция what-dir ссылается на путь к каталогу текущего скрипта, который находится в system/script/path.
8.6 Изменение текущего каталога
Изменение текущего каталога
change-dir %new-path/to-dir/
Если косая черта в конце не указана, функция добавляет ее.
8.7 Список текущего каталога
Чтобы вывести список содержимого текущего каталога, используйте:
list-dir
Количество столбцов, используемых для отображения каталога, зависит от размера окна консоли и максимальной длины имени файла.
|