2009-10-06 20 views
6

Tôi chỉ có thể tưởng tượng mình không tìm kiếm chính xác; điều này có vẻ như một câu hỏi rõ ràng để được hỏi ở đây. Lời xin lỗi của tôi nếu điều này là một bản sao.Tôi cần sử dụng (các) mô-đun Perl nào để có được đường dẫn tuyệt đối (bao gồm tên tệp) từ một mô-đun tương đối trên Windows?

Tôi đang viết một chương trình Perl sẽ lấy tên tệp làm đối số dòng lệnh. Tôi cần phải chuyển đổi tên tập tin (hoặc tên tập tin với một đường dẫn tương đối đính kèm) vào một đường dẫn tuyệt đối (đặc biệt để làm việc với Win32 :: OLE).

Tôi đã thử sử dụng Cwd 's' abs_path ', và điều đó gần như làm những gì tôi muốn, nhưng nó trả về nó bằng cách sử dụng đường dẫn kiểu Unix thay vì một đường dẫn Win32.

Có mô-đun nào sẽ chuyển đổi đường dẫn hoặc có lẽ mô-đun tốt hơn để sử dụng ngay từ đầu không?

+3

Ý của bạn là gì theo đường dẫn kiểu Unix? Bạn có thể hiển thị các ví dụ không? Nó không sử dụng ký tự ổ đĩa? Nếu nó chỉ là dấu gạch chéo, Windows không quan tâm họ định hướng gì. Bạn đang đi qua con đường này đến cái gì đó là phàn nàn? –

+0

Nó sử dụng ký tự ổ đĩa, nhưng có, tôi có nghĩa là dấu gạch chéo về phía trước. Tôi đã học được kể từ khi hỏi câu hỏi này rằng Windows sẽ chấp nhận các dấu gạch chéo về phía trước (mặc dù tôi chưa thử sử dụng cấu trúc Win32 :: OLE + Word VBA mà tôi đang xây dựng - bây giờ tôi đang ở nhà). Nhưng .. bất kể bạn có thể lấy đi bằng cách làm điều gì đó .. không có ý nghĩa gì khi cho máy tính những gì nó mong đợi, như trái ngược với việc mơ hồ? Và trong trường hợp của Windows, tôi chỉ thấy nó cung cấp các đường dẫn bị gạch chéo. Điều đó có hợp lý không, nếu có một chút cảm giác? Tôi hỏi thật sự .. Tôi tò mò muốn trả lời. – romandas

Trả lời

13

tôi sử dụng rel2abs từ File::Spec. Tuy nhiên, bạn phải cẩn thận: có thể gọi getdcwd từ Cwd và bạn sẽ cho rằng bạn muốn thư mục làm việc hiện tại cho ổ đĩa hiện tại. Nếu tệp nằm trên một số ổ đĩa khác, bạn sẽ phải tự sửa lỗi đó hoặc cung cấp đối số thứ hai để đặt đường dẫn cơ bản.

+0

+1 và được chấp nhận. Tôi sẽ giả sử nếu tập tin trên ổ đĩa khác, người dùng sẽ đưa ra một đường dẫn tuyệt đối cho nó. Thành thật mà nói, tôi không chắc làm thế nào có thể chỉ định một tập tin (thông qua dòng lệnh) trên một ổ đĩa khác nhau nhưng không sử dụng một ký tự ổ đĩa ... Bạn có kinh nghiệm với điều đó xảy ra không? – romandas

+2

Windows không phải là NT. "D: foo.txt" là foo.txt trong thư mục hiện tại trên ổ D. Nó không phải là * root * của ổ đĩa D vì thành phần đường dẫn không bắt đầu bằng dấu gạch chéo [back]. Mỗi quá trình duy trì một thư mục hiện tại * cho mỗi ổ đĩa *. Đó là một điều di sản DOS, và theo một bài viết Microsoft KB không còn áp dụng cho các cửa sổ dựa trên NT. – hobbs

+0

Tôi đã gặp sự cố này với Lưu trữ :: Trích xuất trên Windows 2003. Sửa lỗi của tôi là bỏ qua dự đoán từ getdwcd và cung cấp bản thân cwd. Đó là lỗi được giải quyết trong mô-đun đó, vì vậy bạn có thể kiểm tra rt.cpan.org để xem bản vá. –

4
use File::Spec::Functions qw(rel2abs); 
print rel2abs($ARGV[0]), "\n"; 
-1
my($foo) = abs_path($some_file); 
$foo =~ s{/}{\\}g; 

print "FOO: $foo\n"; 
-1

Tôi sử dụng abs_path của Cwd và sau đó sử dụng regex để chuyển đổi dấu gạch chéo khi tôi thực sự cần. Nhưng tôi đã thấy rằng đối với hầu hết các công dụng, các dấu gạch chéo kiểu Unix hoạt động tốt. Nó chỉ thỉnh thoảng "chuyển một tên tập tin vào chương trình có giới hạn khó chịu" mà tôi cần phải chuyển đổi các dấu gạch chéo.

use Cwd 'abs_path'; 
my $path = abs_path($rel_path); 

# and only if necessary... 
$path =~ s'[/\\]+'\\'g; # use Windows-style slashes 
$path =~ s'^\\'\\\\'; # handle network path 

Nhưng sau đó .. Tôi sử dụng nhiều đường dẫn mạng, có hoặc không có tham chiếu biến tần được ánh xạ. Số dặm của bạn có thể thay đổi.

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