سؤال

وإذا كان لدي السلسلة التي يقرر مسار ملف في ويندوز، وهناك وسيلة مقبولة للحصول على شكل الكنسي من اسم الملف؟

وعلى سبيل المثال، أود أن أعرف ما إذا كان

C:\stuff\things\etc\misc\whatever.txt

و

C:\stuff\things\etc\misc\other\..\whatever.txt

وتشير في الواقع إلى نفس الملف أم لا، وتخزينها على شكل الكنسي المسار في طلبي.

لاحظ أن المقارنات سلسلة بسيطة لن تعمل، ولن أي السحر باستخدام التعابير المنطقية. تذكر أن لدينا أشياء مثل NTFS إعادة التوزيع يشير للتعامل مع منذ ويندوز 2000 وهيكل مكتبات جديدة في ويندوز 7.

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

المحلول

والجواب باختصار: لا حقا

وليس هناك طريقة بسيطة للحصول على الاسم المقبول من ملف على ويندوز. يمكن أن يكون الملفات المحلية المتوفرة عبر نقاط إعادة التوزيع، عبر SUBST. هل تريد التعامل مع تقاطعات NTFS؟ اختصارات ويندوز؟ ماذا عن أسماء نجا \\?\

يمكن أن يكون

والملفات عن بعد متاحة عبر حرف محرك أقراص أو عن طريق UNC. غير أن UNC إلى ملقم الأصل؟ هل تستخدم DFS؟ هو الخادم باستخدام نقاط إعادة التوزيع، وما إلى ذلك؟ هو الخادم متاح بأكثر من اسم واحد؟ ماذا عن عنوان IP؟ هل لديك عنوان IP أكثر من واحد؟

وهكذا، إذا كنت تبحث عن شيء مثل عدد inode على نظام التشغيل Windows، فإنه ليس هناك. انظر، على سبيل المثال، هذه الصفحة .

نصائح أخرى

وروجر هو الصحيح، لا توجد وسيلة بسيطة. وإذا كان حجم يدعم ملف مؤشر ملف فريد، يمكنك فتح الملف، وندعو <لأ href = "http://msdn.microsoft.com/en-us/library/aa364952٪28VS.85٪29.aspx" يختلط = "نوفولو noreferrer"> GetFileInformationByHandle ، ولكن هذا لن يعمل على كافة وحدات التخزين.

والدعوة API ويندوز GetFullPathName قد يكون أفضل مقاربة بسيطة.

FileInfo (على سبيل المثال في C #) :

FileInfo info1 = new FileInfo(@"C:\stuff\things\etc\misc\whatever.txt");
FileInfo info2 = new FileInfo(@"C:\stuff\things\etc\misc\other\..\whatever.txt");
if (info1.FullName.Equals(info2.FullName)) {
    Console.WriteLine("yep, they're equal");
}
Console.WriteLine(info1.FullName);
Console.WriteLine(info2.FullName);

والناتج هو:

<اقتباس فقرة>   

نعم، انهم على قدم المساواة
  C: \ الاشياء \ الأشياء \ الخ \ \ whatever.txt
متفرقات   C: \ الاشياء \ الأشياء \ الخ \ منوعات \ whatever.txt

GetFinalPathNameByHandle يبدو أن تفعل ما يسأل عن ، وهو متاح بدءا من ويندوز فيستا.

وjheddings ديه إجابة لطيفة، ولكن بما انك لم تشر إلى اللغة التي تستخدم، ظننت أنني سوف يعطي وسيلة بيثون للقيام بذلك يعمل أيضا من سطر الأوامر، وذلك باستخدام <لأ href = "HTTP: //docs.python.org/library/os.path.html#os.path.abspath "يختلط =" نوفولو noreferrer "> os.path.abspath :

> python -c "import os.path; print os.path.abspath('C:\stuff\things\etc\misc\other\..\whatever.txt')"
C:\stuff\things\etc\misc\whatever.txt

وأود أن استخدام System.IO.Path.GetFullPath. فإنه يأخذ سلسلة كمدخل (C: \ الاشياء \ الأشياء \ الخ \ منوعات \ الآخر .. \ whatever.txt في قضيتك) وسيتم إخراج سلسلة (C: \ الاشياء \ الأشياء \ الخ \ منوعات \ whatever.txt ).

وأعتقد أنني في وقت متأخر قليلا، ولكن يمكنك استخدام System.IO.Path.GetFullPath ( "C: \ الاشياء \ الأشياء \ الخ \ منوعات \ الآخر .. \ whatever.txt") وسيعود " C: \ الاشياء \ الأشياء \ الخ \ منوعات \ whatever.txt "

لتحصل على مسار الكنسي يجب عليك استخدام <لأ href = "http://msdn.microsoft.com/en-us/library/windows/desktop/bb773569٪28v=vs.85٪29.aspx" يختلط = " نوفولو "> وظيفة PathCanonicalize .

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