Cách tạo tệp trong Ruby


169

Tôi đang cố gắng tạo một tệp mới và mọi thứ dường như không hoạt động như tôi mong đợi. Đây là những gì tôi đã thử:

File.new "out.txt"
File.open "out.txt"
File.new "out.txt","w"
File.open "out.txt","w"

Theo tất cả mọi thứ tôi đã đọc trực tuyến, tất cả những thứ đó sẽ hoạt động nhưng mỗi một trong số chúng đều mang lại cho tôi điều này:

ERRNO::ENOENT: No such file or directory - out.txt

Điều này xảy ra từ IRB cũng như tập lệnh Ruby. Tôi đang thiếu gì?


13
Hai cái đầu không nên hoạt động, nhưng hai cái thứ hai đồng nghĩa và chắc chắn nên hoạt động.
Andrew Marshall

@Andrew: Bạn đang nghĩ rằng chỉ có hai người đầu tiên được thử?
mu quá ngắn

1
@muistooshort Đó là kết luận duy nhất tôi có thể đạt được. Một lỗi cấp phép sẽ bị ném Errno::EACCES, không ENOENT.
Andrew Marshall

2
OK, bây giờ tôi cảm thấy ngu ngốc. Hai cái đầu chắc chắn không hoạt động nhưng hai cái thứ hai thì có. Không chắc làm thế nào tôi thuyết phục bản thân mình rằng tôi đã thử chúng. Xin lỗi vì đã lãng phí thời gian của mọi người.
Civilatrix

1
@Civatrix Đó không phải là vấn đề. Tất cả chúng ta đôi khi lãng phí thời gian.
Darth Egregious

Câu trả lời:


433

Sử dụng:

File.open("out.txt", [your-option-string]) {|f| f.write("write your stuff here") }

lựa chọn của bạn là ở đâu:

  • r- Chỉ đọc. Các tập tin phải tồn tại.
  • w - Tạo một tập tin trống để viết.
  • a - Nối vào một tệp. Tệp được tạo nếu nó không tồn tại.
  • r+- Mở một tệp để cập nhật cả đọc và viết. Các tập tin phải tồn tại.
  • w+ - Tạo một tập tin trống cho cả đọc và viết.
  • a+- Mở một tập tin để đọc và nối thêm. Các tập tin được tạo ra nếu nó không tồn tại.

Trong trường hợp của bạn, 'w'là thích hợp hơn.

HOẶC bạn có thể có:

out_file = File.new("out.txt", "w")
#...
out_file.puts("write your stuff here")
#...
out_file.close

11
câu trả lời chính xác. Ruby conevntion là trường hợp rắn cho tên var. Chỉ cần một đầu lên cho người mới. outFilesẽ giống như thế out_file.
Adam Chờ đợi

3
@AdamWaite Tôi đã chỉnh sửa câu trả lời theo đề xuất của sn_case của bạn, để lại nhận xét này cho ngữ cảnh.
Kris

3
@zanbri - Điều gì xảy ra nếu tôi không đóng tệp?
Erran Morad

1
câu trả lời tuyệt vời, toàn diện và ngắn gọn
Boris

2
@BoratSagdiyev "Một đối tượng Tệp không còn được tham chiếu sẽ đủ điều kiện để thu gom rác. Tệp sẽ được đóng tự động khi đối tượng Tệp là rác được thu thập." rootr.net/rubyfaq-9.html
jkdev

35

Thử

File.open("out.txt", "w") do |f|     
  f.write(data_you_want_to_write)   
end

không sử dụng

File.new "out.txt"

25

Hãy thử sử dụng "w+"làm chế độ ghi thay vì chỉ "w":

File.open("out.txt", "w+") { |file| file.write("boo!") }

4
Phụ thuộc nếu bạn chỉ muốn viết ( w) hoặc cả đọc và viết ( w+).
jkdev

20

OK, bây giờ tôi cảm thấy ngu ngốc. Hai cái đầu chắc chắn không hoạt động nhưng hai cái thứ hai thì có. Không chắc làm thế nào tôi thuyết phục bản thân mình rằng tôi đã thử chúng. Xin lỗi vì đã lãng phí thời gian của mọi người.

Trong trường hợp điều này giúp bất kỳ ai khác, điều này có thể xảy ra khi bạn đang cố gắng tạo một tệp mới trong một thư mục không tồn tại.


11

Thư mục không tồn tại. Hãy chắc chắn rằng nó tồn tại vì opensẽ không tạo ra các thư mục đó cho bạn.

Tôi chạy vào đây một lúc.


11

File.newFile.openmặc định để đọc chế độ ( 'r') như một cơ chế an toàn, để tránh có thể ghi đè lên một tệp. Chúng tôi phải thông báo rõ ràng cho Ruby sử dụng chế độ ghi ( 'w'là cách phổ biến nhất) nếu chúng tôi sẽ xuất ra tệp.

Nếu văn bản được xuất là một chuỗi, thay vì viết:

File.open('foo.txt', 'w') { |fo| fo.puts "bar" }

hoặc tồi tệ hơn:

fo = File.open('foo.txt', 'w')
fo.puts "bar"
fo.close

Sử dụng ngắn gọn hơn write:

File.write('foo.txt', 'bar')

writeđã chế độ cho phép vì vậy chúng tôi có thể sử dụng 'w', 'a', 'r+'nếu cần thiết.

openvới một khối là hữu ích nếu bạn phải tính toán đầu ra trong một vòng lặp và muốn để tệp mở khi bạn làm như vậy. writelà hữu ích nếu bạn sẽ xuất nội dung trong một vụ nổ sau đó đóng tệp.

Xem tài liệu để biết thêm thông tin.


Phản ứng tuyệt vời, đây là cách thành ngữ nhất và do đó là cách "Rubyist". Nên là câu trả lời hàng đầu.
Gino

Tốt tôi đồng ý. Tôi hiếm khi sử dụng các hình thức khối để viết các tập tin. Nó quá ồn ào.
Tin Man

11

Nếu mục tiêu chỉ là tạo một tệp, cách trực tiếp nhất tôi thấy là:

 FileUtils.touch "foobar.txt"

1
data = 'data you want inside the file'.

Bạn có thể dùng File.write('name of file here', data)


0

Bạn cũng có thể sử dụng hằng số thay vì chuỗi để chỉ định chế độ bạn muốn. Lợi ích là nếu bạn tạo một lỗi đánh máy trong một tên không đổi, chương trình của bạn sẽ đưa ra một ngoại lệ thời gian chạy.

Các hằng số là File::RDONLYhoặcFile::WRONLY hay File::CREAT. Bạn cũng có thể kết hợp chúng nếu bạn thích.

Mô tả đầy đủ về các chế độ mở tệp trên ruby-doc.org

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.