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
Trả lời
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.
#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. –
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.
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?
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
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ó. –
Bạn cũng có thể sử dụng Dir :: Tmpname
Dir::Tmpname.create('your_application_prefix') { |path| puts path }
đường dẫn sẽ chứa con đường độc đáo
Xem https://github.com/ruby/ruby/blob/ruby_1_9_3/lib/tmpdir.rb#L116
- 1. Tạo ứng dụng web trong Ruby mà không cần khung
- 2. Ruby 1.9.2 xuất chuỗi CSV mà không cần tạo tệp
- 3. cách đổi tên bảng mà không cần tạo lại nó
- 4. Tạo Marker mà không cần thêm nó vào bản đồ?
- 5. R Reading trong một tệp dữ liệu zip mà không cần giải nén nó
- 6. Khởi chạy Ruby mà không cần tiền tố "Ruby"
- 7. Bạn có thể tạo ngữ cảnh OpenGL mà không cần mở một cửa sổ không?
- 8. Tạo một Lớp Ruby ngay lập tức mà không cần eval
- 9. Tạo nút tweet mà không cần mở một cửa sổ mới
- 10. Làm thế nào để tạo một chuỗi từ mảng char mà không cần sao chép nó?
- 11. Tạo một trang web ASP.Net MVC có thể mở rộng mà không cần sử dụng Session
- 12. Trong python, tạo một tempfile trong cùng thư mục với một tệp khác?
- 13. iOS: làm thế nào để có được kích thước hình ảnh mà không cần mở nó
- 14. Mở các tệp main.py khác nhau trong Eclipse mà không cần tạo dự án mới
- 15. Viết StringIO tới Tempfile
- 16. Khởi tạo OpenGL mà không cần GLUT
- 17. kết nối Ruby với Mysql mà không cần đường ray
- 18. android: lấy kích thước hình ảnh mà không cần mở nó
- 19. Ruby on Rails: Hành động mà không cần xem
- 20. html2canvas tiết kiệm như một jpeg mà không cần mở trong trình duyệt
- 21. Nhận dấu vết ngăn xếp hiện tại trong Ruby mà không cần nêu một ngoại lệ
- 22. Mở cửa sổ mới mà không tập trung vào nó
- 23. Nhận tên lớp Ruby mà không cần phương thức lớp
- 24. Mở một biểu mẫu trong C# mà không cần tập trung
- 25. Làm mới hoạt động mà không cần mở lại?
- 26. Làm thế nào để sử dụng một viên ngọc trong Rails 3 mà không cần tham khảo nó trong Gemfile
- 27. Redirect .php url url mà không cần mở rộng
- 28. Override hàm mà không cần mở rộng các lớp
- 29. Đọc e-mail mà không cần Outlook ứng dụng mở
- 30. Tạo nút tròn trong iOS7 mà không cần hình ảnh
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? –
Vâng, Sony Santos. Bạn đúng rồi. – Geo