#ruby #file #io #errno
#ruby #файл #io #ошибка отсутствует
Вопрос:
Я пытаюсь создать новый файл, и, похоже, все работает не так, как я ожидаю. Вот что я пробовал:
File.new "out.txt"
File.open "out.txt"
File.new "out.txt","w"
File.open "out.txt","w"
Согласно всему, что я прочитал в Интернете, все это должно работать, но каждый из них дает мне это:
ERRNO::ENOENT: No such file or directory - out.txt
Это происходит как из IRB, так и из Ruby-скрипта. Чего мне не хватает?
Комментарии:
1. Первые два не должны работать, но вторые два являются синонимами и определенно должны работать.
2. @Andrew: Вы думаете, что были опробованы только первые два?
3. @muistoosh Это единственный вывод, к которому я могу прийти. Ошибка разрешений вызвала бы
Errno::EACCES
, а неENOENT
.4. Хорошо, теперь я чувствую себя глупо. Первые два определенно не работают, но вторые два работают. Не уверен, как я убедил себя, что я их пробовал. Извините, что отнял у всех время.
5. @Civatrix Это не проблема. Мы все иногда тратим время впустую.
Ответ №1:
Используйте:
File.open("out.txt", [your-option-string]) {|f| f.write("write your stuff here") }
где ваши варианты:
r
— Только для чтения. Файл должен существовать.w
— Создайте пустой файл для записи.a
— Добавить в файл.Файл создается, если он не существует.r
— Откройте файл для обновления как для чтения, так и для записи. Файл должен существовать.w
— Создайте пустой файл как для чтения, так и для записи.a
— Откройте файл для чтения и добавления. Файл создается, если он не существует.
В вашем случае 'w'
предпочтительнее.
ИЛИ вы могли бы:
out_file = File.new("out.txt", "w")
#...
out_file.puts("write your stuff here")
#...
out_file.close
Комментарии:
1. отличный ответ. Ruby conevntion — это змеиный регистр для имен переменных. Просто предупреждение для новичков.
outFile
должно выглядеть такout_file
.2. @AdamWaite я отредактировал ответ в соответствии с вашим предложением snake_case, оставив этот комментарий для контекста.
3. @zanbri — что произойдет, если я не закрою файл?
4. @BoratSagdiyev «Файловый объект, на который больше нет ссылок, становится пригодным для сборки мусора. Файл будет автоматически закрыт, когда объект File будет собран для мусора. » rootr.net/rubyfaq-9.html
5. @jkdev, да, он будет закрыт, но полагаться на это по-прежнему считается запахом кода, как если бы программист никогда не закрывал файлы и позволял ОС закрывать файлы, когда интерпретатор завершает работу. И то, и другое может привести к серьезной ошибке, если открыто несколько файлов, и код никогда не закрывает их, что приводит к выходу из-под контроля и ошибке. Просто лучше и безопаснее намеренно закрывать их или полагаться на блок, который делает это автоматически.
Ответ №2:
Попробуйте
File.open("out.txt", "w") do |f|
f.write(data_you_want_to_write)
end
без использования
File.new "out.txt"
Ответ №3:
Попробуйте использовать "w "
в качестве режима записи вместо просто "w"
:
File.open("out.txt", "w ") { |file| file.write("boo!") }
Комментарии:
1. Зависит от того, хотите ли вы использовать только write (
w
) или read и write (w
) .
Ответ №4:
Хорошо, теперь я чувствую себя глупо. Первые два определенно не работают, но вторые два работают. Не уверен, как я убедил себя, что я их пробовал. Извините, что отнял у всех время.
В случае, если это поможет кому-либо еще, это может произойти, когда вы пытаетесь создать новый файл в каталоге, который не существует.
Ответ №5:
Если цель состоит в том, чтобы просто создать файл, самый прямой способ, который я вижу, это:
FileUtils.touch "foobar.txt"
Ответ №6:
Каталог не существует. Убедитесь, что он существует, поскольку open
он не создаст для вас эти каталоги.
Я сам столкнулся с этим некоторое время назад.
Ответ №7:
File.new
и File.open
по умолчанию используется режим чтения ( 'r'
) в качестве механизма безопасности, чтобы избежать возможной перезаписи файла. Мы должны явно указать Ruby использовать режим записи ( 'w'
это наиболее распространенный способ), если мы собираемся выводить данные в файл.
Если выводимый текст представляет собой строку, а не запись:
File.open('foo.txt', 'w') { |fo| fo.puts "bar" }
или хуже:
fo = File.open('foo.txt', 'w')
fo.puts "bar"
fo.close
Используйте более лаконичный write
:
File.write('foo.txt', 'bar')
write
разрешены ли режимы, чтобы мы могли использовать 'w'
, 'a'
, 'r '
при необходимости.
open
использование блока полезно, если вам нужно вычислить выходные данные в итеративном цикле и вы хотите оставить файл открытым при этом. write
полезно, если вы собираетесь выводить содержимое за один раз, а затем закрыть файл.
Смотрите документацию для получения дополнительной информации.
Комментарии:
1. Отличный ответ, это самый идиоматичный и, следовательно, «рубиновый» способ. Должен быть главный ответ.
2. Что ж, я согласен. Я редко использую блочную форму для записи файлов. Это слишком визуально шумно.
Ответ №8:
data = 'data you want inside the file'.
Вы можете использовать File.write('name of file here', data)
Ответ №9:
Вы также можете использовать константы вместо строк, чтобы указать нужный режим. Преимущество в том, что если вы допустите опечатку в имени константы, ваша программа вызовет исключение во время выполнения.
Константами являются File::RDONLY
или File::WRONLY
или File::CREAT
. Вы также можете объединить их, если хотите.