2011-06-22 29 views
7

Có cách nào để tạo một tempfile, mà không cần mở nó? Tôi phải chạy một tập tin thực thi, chuyển hướng đầu ra của nó vào một tập tin, và sau đó đọc & phân tích cú pháp đó. Mọi thứ được tạo bởi tempfile đã được mở và điều này sẽ gây ra lỗi do tệp bị khóa.Tạo một tempfile mà không cần mở nó trong Ruby

+0

Tôi đoán thực thi là một quá trình riêng biệt mà duy trì tempfile mở (bị khóa) trong khi chương trình ruby ​​đang chạy. Tôi có đúng không? –

+0

Vâng, Sony Santos. Bạn đúng rồi. – Geo

Trả lời

0

Bạn đang sử dụng giải pháp FileUtils.touch có thể chấp nhận? Bạn có thể chạm vào một tập tin và xóa nó một khi bạn đã làm xong với bất cứ điều gì bạn muốn.

+1

#touch không phải là giải pháp được chấp nhận rộng rãi bởi vì lợi thế đáng kể của Dir :: Tmpname (và trên thực tế, rất quan trọng trong hầu hết các trường hợp) là tên tệp duy nhất được đảm bảo. –

0

Bạn có thể muốn sử dụng đường ống.

Nếu tệp thực thi được bắt đầu từ chương trình ruby ​​của bạn, hãy xem xét sử dụng IO.popen.

Nếu là các quy trình khác nhau, bạn có thể thử named pipes.

1

tôi không nhận được một lỗi:

Andrew-Grimms-MacBook-Pro:~ agrimm$ irb 
>> require "tempfile" 
=> true 
>> tempfile = Tempfile.new("temporary_file.txt", "/tmp") 
=> #<File:/tmp/temporary_file.txt20110622-648-pkynjw-0> 
>> tempfile.close 
=> nil 
>> system("echo foo > #{tempfile.path}") 
=> true 
>> system("cat #{tempfile.path}") 
foo 
=> true 
>> tempfile.path 
=> "/tmp/temporary_file.txt20110622-648-pkynjw-0" 
>> exit 
Andrew-Grimms-MacBook-Pro:~ agrimm$ cat /tmp/temporary_file.txt20110622-648-pkynjw-0 
foo 

Sau đó, một lần nữa, các tập tin tạm thời không có vẻ hết sức tạm thời.

Lỗi xảy ra với tất cả các chương trình hay chỉ một chương trình cụ thể? Ngoài ra, bạn có thể đăng các mã gây ra vấn đề, và những gì lỗi backtrace bạn nhận được?

+0

Andrew, có lẽ Windows xử lý điều này một cách khác nhau. Lỗi mà tôi nhận được là 'Quá trình không thể truy cập tệp vì nó đang được sử dụng bởi một tiến trình khác' – Geo

+0

Tôi đoán bạn không gặp lỗi vì trong trường hợp của bạn, quá trình ghi tempfile đã kết thúc khi bạn cố gắng sử dụng lại. Vấn đề ở đây là tệp thực thi là một quy trình riêng biệt duy trì tệp được mở khi chương trình ruby ​​cố gắng truy cập nó. –

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