Ruby/Работа с файлами: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
м <source> -> <syntaxhighlight> (phab:T237267)
 
Строка 29:
Для чтения файла целиком используется метод <code>.read</code>. Он считывает весь файл в виде строки. Во время его использования не сто́ит задумываться об открытии/закрытии файла, так как эти операции скрыты внутри метода.
 
<sourcesyntaxhighlight lang="ruby">config = IO.read('config.yaml')
config.class #=> String</sourcesyntaxhighlight>
 
Имя файла — это строка.
Строка 44:
Очень часто программист проектирует программу таким образом, чтобы ввод данных осуществлялся с клавиатуры. После сотни-другой циклов отладки программист так устаёт вводить данные, что создаёт файл, который содержит все необходимые входные данные, и перенаправляет на него поток ввода с клавиатуры, добавляя всего одну строчку в начало своей программы:
 
<sourcesyntaxhighlight lang="ruby">$stdin = File.open('входные данные.txt')</sourcesyntaxhighlight>
 
А вот другая история. Программист пишет и отлаживает программу, которая все необходимые данные выводит на экран. Но в конечном итоге программа должна запускаться без участия человека, и её вывод нужно сохранять в файл для дальнейшей обработки. Переписывать всю программу лень, и поэтому в начало своей программы он вставляет парочку волшебных строчек:
 
<sourcesyntaxhighlight lang="ruby">$stdout = File.open('выходные данные.txt', 'w')
$stderr = File.open('сообщения об ошибках.txt', 'a')</sourcesyntaxhighlight>
 
Вторым параметром метода <code>.open</code> передаётся модификатор доступа, то есть кодовое слово, по которому метод <code>.open</code> может предположить то, что вы будете делать с этим файлом. В нашем примере мы использовали модификатор <code>w</code> ({{англ|write}} — писать), который говорит о том, что мы будем только писать в файл. Причём каждый раз файл будет перезаписываться. При помощи модификатора <code>a</code> ({{англ|append}} — добавлять) мы указываем, что мы будем добавлять данные в файл, а не перезаписывать, как в случае с <code>w</code>.
Строка 55:
После этого весь вывод на экран и сообщения об ошибках записываются в соответствующие файлы. Для того, чтобы посмотреть пример в действии, предлагаю вам выполнить следующую программу:
 
<sourcesyntaxhighlight lang="ruby">$stdout = File.open('выходные данные.txt', 'w')
$stderr = File.open('сообщения об ошибках.txt', 'a')
 
puts 'Очень важные данные,'
puts 'которые будут сохранены в файл'
raise 'Принудительно вызываем ошибку'</sourcesyntaxhighlight>
 
Метод <code>raise</code> — для принудительного вызова ошибки.
Строка 70:
Универсальным способом я назвал способ с использованием метода <code>File.open</code>. Дело в том, что при помощи него можно осуществлять не только считывание, запись и перезапись, но и закрытие файлов (чего нельзя сделать при использовании способа с переменными <code>$stdout</code>, <code>$stdin</code> и <code>$stderr</code>). Это позволяет несколько раз (за время выполнения программы) осуществлять операции открытия-закрытия файла. В виду того, что эта возможность нужна далеко не всегда, то и используется этот способ только тогда, когда использование всех предыдущих невозможно. Чтение из файла <code>входные данные.txt</code> при помощи универсального метода будет выглядеть следующим образом:
 
<sourcesyntaxhighlight lang="ruby">string = File.open('входные данные.txt', 'r'){ |file| file.read }</sourcesyntaxhighlight>
 
Модификатор доступа <code>r</code> указывать необязательно, так как он устанавливается по умолчанию. Поэтому следующий код тоже верен:
 
<sourcesyntaxhighlight lang="ruby">string = File.open('входные данные.txt'){ |file| file.read }</sourcesyntaxhighlight>
 
Если необходимо записать данные, то нужно использовать модификатор доступа <code>a</code> (добавление к концу файла) или <code>w</code> (запись в файл с его предварительной очисткой). Запись данных в файл осуществляется методами <code>puts</code>, <code>write</code> и так далее.
 
<sourcesyntaxhighlight lang="ruby">File.open('выходные данные.txt', 'w'){ |file| file.write string }
File.open('выходные данные.txt', 'a'){ |file| file.puts string }</sourcesyntaxhighlight>
 
Замыкание метода <code>.open</code> (то есть фигурные скобки) нужен для того, чтобы при выходе из замыкания автоматически осуществлять закрытие файла.
Строка 85:
===Удаление файла===
Удаление файла осуществляется при помощи метода <code>delete</code> класса <code>File</code>. Например:
<sourcesyntaxhighlight lang="ruby">
File.delete("example.txt") #=> Файл был удалён (не помещён в корзину, как во многих операционных системах!)
</syntaxhighlight>
</source>
 
{{BookCat}}