2016-04-01 25 views
7

Tôi muốn viết một cái gì đó vào một tập tin.Errno :: ENOENT (Không có tập tin hoặc thư mục @ rb_sysopen

# where userid is any intger [sic] 
path = Rails.root + "public/system/users/#{user.id}/style/img.jpg" 
File.open(path, 'wb') do |file| 
    file.puts f.read 
end 

Khi mã này được thực thi, tôi nhận được lỗi này. Tôi biết thư mục này doesn' t tồn tại, nhưng File.open với chế độ w tạo ra một tập tin mới nếu nó không tồn tại.

ai

Tại sao điều này không làm việc?

Trả lời

12

File.open(..., 'w') tạo ra một tập tin nếu nó không tồn tại. hứa nó sẽ tạo ra một thư mục cây cho nó.

Một điều khác, bạn nên sử dụng File#join để tạo đường dẫn thư mục, thay vì nối chuỗi câm.

path = File.join Rails.root, 'public', 'system', 'users', user.id.to_s, 'style' 

FileUtils.mkdir_p(path) unless File.exist?(path) 
File.open(File.join(path, 'img.jpg'), 'wb') do |file| 
    file.puts f.read 
end 
+0

Chỉ cần tò mò: Tại sao File.join nên ở đây? Nó nối các thành phần đường dẫn luôn với bộ tách riêng của nền tảng (ví dụ, '\' trên Windows). Trong khi có ** trường hợp **, đây là những gì chúng ta muốn đạt được, chúng ta thường cố gắng gắn bó với '/' trên tất cả các nền tảng, bởi vì điều này cho phép ít đau đầu hơn về tính di động. Trong trường hợp mã được đăng ở đây, tôi không thấy lý do tại sao các tệp phân tách dành riêng cho nền tảng có thể là một lợi thế. – user1934428

+1

@ user1934428 "chúng tôi thường cố gắng gắn bó với/trên tất cả các nền tảng, vì điều này cho phép ít đau đầu hơn về tính di động" —các điều này là vô nghĩa, bằng cách sử dụng 'File.join' giúp tránh những sai lầm ngớ ngẩn như lỗi trong OP:' Rails.root' không kết thúc bằng dấu gạch chéo và sử dụng '+' cho '/ railsrootpublic /' (lưu ý dấu gạch chéo ở trên.) – mudasobwa

+0

@mudasobwa: Trong thanh điều khiển đường ray của tôi Rails.root + "bla/bla" Cung cấp chính xác đường dẫn :) – ashwintastic

14

Cố gắng sử dụng gets bên trong công việc cào? Bạn có thể thấy thông báo lỗi này:

Errno :: ENOENT: Không có tập tin hoặc thư mục @ như rb_sysopen

Bạn đã thử tìm kiếm các lỗi, và kết thúc trên trang này? Câu trả lời này không dành cho OP, mà là cho bạn.

Sử dụng STDIN.gets. Đã giải quyết được sự cố. Đó là bởi vì chỉ cần sử dụng gets giải quyết trở lại $stdin.gets và rake sẽ ghi đè biến toàn cầu để gets cố mở một trình xử lý tệp không tồn tại. Đây là lý do:

What's the difference between gets.chomp() vs. STDIN.gets.chomp()?

+0

Điều này cũng áp dụng cho việc sử dụng '' bên trong một Vagrantfile. – bschlueter

+3

Bạn đang làm công việc của thần – user3062913

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