2013-04-07 38 views
10

Có thể thực hiện việc này không?bạn có thể tạo/ghi/nối thêm một chuỗi vào một tệp trong một dòng trong Ruby

v='some text' 
w='my' + Time.new.strftime("%m-%d-%Y").to_s + '.txt' 
File.write(w,v) # will create file if it doesn't exist and recreates everytime 

mà không cần phải thực hiện File.open? Tức là chỉ là một phương thức lớp học sẽ thêm hoặc tạo và viết? Lý tưởng nhất là ruby ​​1.9.3.

thx

Sửa 1

đây là những gì tôi đã cố gắng dựa trên tài liệu. Tôi đã không nhìn thấy rdoc nhưng đã thấy một số ví dụ khác. Một lần nữa tôi chỉ hỏi nếu có thể mở một tập tin trong chế độ nối thêm thông qua File.write? thx

irb(main):014:0> File.write('some-file.txt','here is some text',"a") 
TypeError: can't convert String into Integer 
    from (irb):14:in `write' 
    from (irb):14 
    from /usr/local/rvm/rubies/ruby-1.9.3-p392/bin/irb:13:in `<main>' 
irb(main):015:0> 


irb(main):015:0> File.write('some-file.txt','here is some text',O_APPEND) 
NameError: uninitialized constant O_APPEND 
    from (irb):15 
    from /usr/local/rvm/rubies/ruby-1.9.3-p392/bin/irb:13:in `<main>' 
irb(main):016:0> 
+3

soln. cám ơn. Thật là một biểu hiện lịch sự. – sawa

+0

Bạn luôn có thể làm điều gì đó trong một dòng nếu bạn muốn. – squiguy

+0

@sawa không chắc chắn những gì soln phiền bạn, oh cũng – timpone

Trả lời

37

Ruby đã có IO::write từ 1.9.3. Chỉnh sửa của bạn cho thấy bạn đang truyền sai args. Arg đầu tiên là tên tệp, chuỗi thứ hai để viết, thứ ba là phần bù tùy chọn và thứ tư là một băm có thể chứa các tùy chọn để chuyển sang mở. Vì bạn muốn thêm, bạn sẽ cần phải vượt qua bù đắp như kích thước hiện tại của tập tin để sử dụng phương pháp này:

File.write('some-file.txt', 'here is some text', File.size('some-file.txt'), mode: 'a') 

nâng hạ từ các chủ đề thảo luận: Phương pháp này có vấn đề đồng thời cho append vì tính toán bù đắp vốn đã là racy. Mã này đầu tiên sẽ tìm thấy kích thước là X, mở tập tin, tìm kiếm X và viết. Nếu một quy trình hoặc luồng khác ghi vào cuối số File.size và tìm kiếm/ghi bên trong File::write, chúng tôi sẽ không còn được thêm và sẽ ghi đè dữ liệu.

Nếu người dùng mở tệp bằng chế độ 'a' và không tìm kiếm, người ta được đảm bảo viết vào cuối từ ngữ nghĩa POSIX được xác định cho fopen(3) with O_APPEND; vì vậy tôi khuyên này để thay thế:

File.open('some-file.txt', 'a') { |f| f.write('here is some text') } 
+0

thx, điều này dường như làm điều đó. Không phải là một fan hâm mộ lớn của mảnh api ruby ​​- chỉ thực sự xấu xí. Ban đầu đã xem xét điều này để xử lý các vấn đề luồng với cú pháp khối mà chúng tôi có với mã được viết như @ennuikiller. Tôi nghi ngờ điều này sẽ sửa chữa điều đó mặc dù. thx một lần nữa cho câu trả lời, khi tôi đọc rằng tài liệu api lần đầu tiên tôi không thể tin rằng đó là cú pháp. – timpone

+0

@timpone Vâng, trường hợp sử dụng cho 'IO.write' là tốt đẹp cho việc tạo hoặc ghi đè ngữ nghĩa, nhưng khó xử để chắp thêm. Có thể xem xét việc mở rộng IO với 'lớp IO; def self.append (fn, str, opts = {}); IO.write (fn, str, File.size (fn), {mode: 'a'}. Kết hợp (opts)); kết thúc; end' – dbenhur

+0

Khi tôi nghĩ về nó một lần nữa, giao diện này thổi cho chắp thêm trong một bối cảnh đồng thời bởi vì luôn luôn có một cuộc chạy đua giữa việc tìm kiếm kích thước tập tin và phát hành viết. Tôi nghĩ rằng bạn tốt nhất chỉ cần mở tập tin trong chế độ đồng bộ nối thêm và viết. – dbenhur

4
File.open('my' + Time.new.strftime("%m-%d-%Y").to_s + '.txt', 'w') { |file| file.write("some text") } 
+0

ok, một cuộc gọi? thx – timpone

+3

Thao tác này sẽ ghi, nhưng không thêm, để gửi. Tôi tin rằng OP đang cố gắng thêm vào một tập tin. Tạo tập tin xử lý bằng 'a' khi bạn muốn nối thêm. – thomax

2

MRI có phương pháp mà đã (Tôi nghĩa là sao chép và dán mã của bạn và nó làm việc), nhưng lần cuối cùng tôi đã kiểm tra, JRuby và Rubinius thì không. Họ có thể bây giờ, tôi không cảm thấy như cài đặt các phiên bản mới nhất để xem.

http://rdoc.info/stdlib/core/IO.write

+0

thx để đăng, tôi đã thấy câu hỏi này và cập nhật với chỉnh sửa 1.Tôi đã thử tập tin ghi với "a" nhưng nói rằng nó đang tìm kiếm một int (mà doens't xuất hiện để được phù hợp với rdoc) và sau đó đã cố gắng tiêu chuẩn UNIX liên tục nhưng không giống như một trong hai. Thực sự, chỉ cần tìm xem liệu cú pháp này có khả thi hay không. Không chắc chắn tại sao tất cả các downvotes – timpone

+0

Nếu bạn sao chép và dán và nó đã làm việc, ruby ​​của bạn bị hỏng. Vấn đề với cuộc gọi của anh ta là đối số thứ ba được coi là một số nguyên offset, không phải là một chế độ tệp. – dbenhur

+0

thx - chỉnh sửa # 1 là tiếp theo cho câu trả lời này – timpone

7

Để làm cho nó rõ ràng như một số ý kiến ​​đang đề xuất Tôi đã thử nghiệm làm việc này: IO.write("/tmp/testfile", "gagaga\n", mode: 'a')

Đó là một gắn thêm vào tập tin mà không cần phải tính toán bù đắp. Rubydoc ít gây hiểu lầm. Đây là lỗi về điều đó: https://bugs.ruby-lang.org/issues/11638

Các vấn đề liên quan