2009-12-21 73 views
218

Tôi đang chạy Ruby trên Windows mặc dù tôi không biết điều đó có tạo nên sự khác biệt hay không. Tất cả những gì tôi muốn làm là lấy đường dẫn tuyệt đối của thư mục làm việc hiện tại. Điều này có thể từ irb? Rõ ràng từ một kịch bản nó có thể sử dụng File.expand_path(__FILE__)cách lấy đường dẫn tuyệt đối của thư mục làm việc hiện tại từ irb

Nhưng từ IRB Tôi đã thử các sau đây và có một "Permission denied" lỗi:

File.new(Dir.new(".").path).expand 
+6

Câu hỏi đặt ra là không thực sự rõ ràng: Bạn có muốn a) thư mục làm việc hiện hành (đó là 'Dir.pwd') hay bạn muốn thư mục chứa hiện chạy script được đặt (là 'File.dirname (__ FILE __)')? Hãy tưởng tượng gọi một kịch bản từ bất cứ nơi nào khác (như 'ruby testdirectory/testscript.rb') ở đây, cả hai sẽ khác! – amenthes

+1

@amenthes Bạn yêu cầu câu hỏi của tôi là không rõ ràng và sau đó hỏi "Bạn có muốn a) thư mục làm việc hiện tại ...." và câu hỏi của tôi nói "Tất cả những gì tôi muốn làm là nhận được * đường dẫn tuyệt đối * thư mục làm việc hiện tại ... ". Có gì không rõ ràng? –

+4

không rõ ràng vì câu "Rõ ràng từ một kịch bản có thể sử dụng' File.expand_path (__ FILE __) '" - vì vị trí '__FILE__' là một động vật khác với thư mục làm việc hiện tại (đó là' Dir.pwd'). – amenthes

Trả lời

160

File.expand_path File.dirname(__FILE__) sẽ trở lại thư mục liên quan đến các tập lệnh này được gọi là từ.

Nhưng Dir.pwd trả về thư mục làm việc (kết quả giống hệt nhau để thực hiện pwd trong thiết bị đầu cuối của bạn)

+2

'Dir.pwd' tương đương với 'pwd -P'.'exec ('pwd -L')' sẽ nhận được tương đương pwd trong terminal (pwd thường là một bash builtin, và không giải quyết các liên kết tượng trưng). –

+1

cũng hãy xem xét đến lớp Pathname thường bị lãng quên: http://www.ruby-doc.org/stdlib-2.1.1/libdoc/pathname/rdoc/Pathname.html – awenkhh

+0

Có sự cố, Dir.pwd sẽ in thư mục làm việc của nơi tập lệnh được chạy - có thể không phải là thứ bạn muốn. – Brandon

4

này sẽ cung cấp cho bạn các thư mục làm việc của tập tin hiện hành.

File.dirname(__FILE__) 

Ví dụ:

current_file: "/Users/nemrow/SITM/folder1/folder2/amazon.rb"

kết quả: "/ Users/nemrow/SITM/folder1/folder2"

+0

Xin lưu ý rằng thư mục làm việc không được giống với tệp thực tế. Vì vậy, 'Dir.pwd' và đề xuất của bạn có thể khác nhau. – Besi

42

đối với các đường dẫn tương đối để kịch bản thực hiện, kể từ của Ruby 2,0 bạn cũng có thể sử dụng

__dir__ 

Vì vậy, đây là cơ bản giống như

File.dirname(__FILE__) 
+8

Tôi tự hỏi tại sao sự không thống nhất, tại sao không '__DIR__'? – Zequez

+11

@Zequez Vì ['__FILE__' là hằng số nhưng' __dir__' là một phương thức] (http://stackoverflow.com/a/15190725/405017). – Phrogz

+0

thao tác này sẽ in thư mục làm việc của nơi tập lệnh được chạy dưới dạng @Brandon cho biết. –

1

Nếu bạn muốn nhận được đường dẫn đầy đủ của thư mục của tập tin rb hiện tại:

File.expand_path('../', __FILE__) 
1

Qua điều này, bạn có thể nhận được đường dẫn tuyệt đối của bất kỳ tập tin nằm trong bất kỳ thư mục nào.

File.join(Dir.pwd,'some-dir','some-file-name') 

này sẽ trở lại

=> "/User/abc/xyz/some-dir/some-file-name" 
Các vấn đề liên quan