سؤال

لدي مسار عنوان url asp.net الذي يتم إنشاؤه في نموذج ويب، ويخرج شيئًا مثل "/foo/bar/../bar/path.aspx"، ويخرج في ملف HTML الذي تم إنشاؤه مثل هذا أيضًا .يجب اختصاره إلى "/foo/bar/path.aspx".

Path.Combine لم يصلحه.هل هناك وظيفة لتنظيف هذا المسار؟

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

المحلول

يمكنك إنشاء فئة مساعدة تغطي فئة UriBuilder في System.Net

public static class UriHelper
{       
    public static string NormalizeRelativePath(string path)
    {
        UriBuilder _builder = new UriBuilder("http://localhost");
        builder.Path = path;
        return builder.Uri.AbsolutePath;
    }
}

والتي يمكن بعد ذلك استخدامها مثل هذا:

string url = "foo/bar/../bar/path.aspx";
Console.WriteLine(UriHelper.NormalizeRelativePath(url));

إنه اختراق بعض الشيء ولكنه سيعمل مع المثال المحدد الذي قدمته.

يحرر:تم التحديث ليعكس تعليقات أندرو.

نصائح أخرى

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

إذا تم استدعاء خيطين مختلفين UriHelper.NormalizeRelativePath في نفس الوقت، فمن الممكن إرجاع القيمة المرجعة لأحدهما إلى المتصل الآخر بشكل تعسفي.

إذا كنت تريد استخدام UriBuilder للقيام بذلك، فما عليك سوى إنشاء واحدة جديدة عندما تحتاج إليها (إن إنشائها ليس مكلفًا).

إن رد Sarcastic أفضل بكثير من ردي، ولكن إذا كنت تعمل مع مسارات نظام الملفات، فإن رد Sarcastic أفضل بكثير من ردي الاختراق القبيح أدناه يمكن أن يكون مفيدًا أيضًا.(ترجمة:لقد كتبتها، وسأكون ملعونًا إذا لم أنشرها :)

يقوم Path.Combine فقط بربط سلسلتين معًا، مع الانتباه إلى الخطوط المائلة السابقة أو اللاحقة.بقدر ما أعرف، طريقة المسار الوحيدة التي تقوم بالتطبيع هي Path.GetFullPath.سيعطيك ما يلي النسخة "المنظفة".

myPath = System.IO.Path.GetFullPath(myPath);

بالطبع، هناك مشكلة صغيرة تتمثل في أنه سيتم تجذير المسار الناتج وسيتم تحويل الخطوط المائلة الأمامية إلى خطوط مائلة خلفية (مثل "C:\foo\bar\path.aspx").ولكن إذا كنت تعرف الجذر الأصلي للمسار الأصلي، فلا ينبغي أن يمثل تجريد الجذر مشكلة كبيرة.

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