ما وحدة (الوحدات) التي يمكنني استخدامها للحصول على مسار مطلق (بما في ذلك اسم الملف) من واحد نسبيا على ويندوز؟

StackOverflow https://stackoverflow.com/questions/1527638

سؤال

أستطيع أن أتخيل فقط أنني لا أبحث بشكل صحيح؛ هذا يبدو وكأنه سؤال واضح يجب طرحه هنا. اعتذاري إذا كانت هذه مكررة.

أنا أكتب برنامج بيرل الذي سيأخذ اسم ملف كوسيطة سطر الأوامر. أحتاج إلى تحويل اسم الملف (أو اسم الملف باستخدام مسار نسبي متصل) إلى مسار مطلق (خصيصا للعمل مع Win32 :: OLE).

حاولت استخدام CWD."ABS_PATH"، وهذا يعمل تقريبا ما أريد، لكنه يعيده باستخدام مسار نمط UNIX بدلا من Win32 One.

هل هناك وحدة نمطية تقوم بتحويل المسار، أو ربما وحدة أفضل لاستخدامها في المقام الأول؟

هل كانت مفيدة؟

المحلول

أنا أستعمل rel2abs من عند ملف :: المواصفات. وبعد يجب أن تكون حذرا رغم ذلك: قد يتصل getdcwd من عند Cwd, ، سوف يفترض أنك تريد دليل العمل الحالي لمحرك الأقراص الحالي. إذا كان الملف موجودا على محرك أقراص آخر، فسيطلب منك إصلاح ذلك بنفسك أو توفير الوسيطة الثانية لتعيين المسار الأساسي.

نصائح أخرى

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

print "FOO: $foo\n";

يمكنني استخدام ABS_PATHER's CWD ثم استخدم Regex لتحويل القطابق عندما أكون هل حقا بحاجة إليها القيام به. لكنني وجدت أنه بالنسبة لمعظم الاستخدامات، فإن خطط نمط UNIX تعمل على ما يرام. إنه لأمر فقط "نقل اسم ملف إلى هذا البرنامج المحدود بشكل مزعج"، في نهاية المطاف في حاجة إلى تحويل الخطوط.

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

ولكن بعد ذلك .. أستخدم الكثير من مسارات الشبكة، مع أو بدون مرجع محرك أقراص معين. قد تختلف الأميال الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top