سؤال

ما هو يعادل PathCanonicalize شركة#؟

يستخدم:أحتاج إلى تخمين جيد ما إذا كان مسارا الملف يشيران إلى نفس الملف (بدون الوصول إلى القرص).كان أسلوبي النموذجي هو تمريرها عبر عدد قليل من المرشحات مثل MakeAbsolute وPathCanonicalize، ثم إجراء مقارنة غير حساسة لحالة الأحرف.

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

المحلول

سريع و قذر:

في الماضي قمت بإنشاء معلومات الملف الكائن من سلسلة المسار ثم استخدم خاصية FullName.يؤدي هذا إلى إزالة كافة ..\'s و.\'s.

بالطبع يمكنك التفاعل:

 [DllImport("shlwapi", EntryPoint="PathCanonicalize")]
    private static extern bool PathCanonicalize(
        StringBuilder lpszDst,
        string lpszSrc
    );

نصائح أخرى

3 حلول:

أفضل سيناريو، حيث تكون متأكدًا بنسبة 100% من أن عملية الاستدعاء سيكون لها حق الوصول الكامل إلى نظام الملفات. تنبيه قضائي: قد يكون الحصول على إذن بشأن صندوق الإنتاج أمرًا صعبًا

    public static string PathCombineAndCanonicalize1(string path1, string path2)
    {
        string combined = Path.Combine(path1, path2);
        combined = Path.GetFullPath(combined);
        return combined;
    }

لكننا لسنا أحرارًا دائمًا.غالبًا ما تحتاج إلى إجراء العمليات الحسابية للسلسلة دون إذن.هناك دعوة محلية لهذا. تنبيه قضائي: يلجأ إلى المكالمة المحلية

    public static string PathCombineAndCanonicalize2(string path1, string path2)
    {
        string combined = Path.Combine(path1, path2);
        StringBuilder sb = new StringBuilder(Math.Max(260, 2 * combined.Length));
        PathCanonicalize(sb, combined);
        return sb.ToString();
    }

    [DllImport("shlwapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool PathCanonicalize([Out] StringBuilder dst, string src);

الإستراتيجية الثالثة هي خداع CLR.يعمل Path.GetFullPath() بشكل جيد على مسار وهمي، لذا تأكد فقط من إعطائه مسارًا وهميًا دائمًا.ما يمكنك فعله هو تبديل الجذر بمسار UNC زائف، واستدعاء GetFullPath()، ثم تبديل المسار الحقيقي مرة أخرى. تنبيه قضائي: قد يتطلب هذا عملية بيع صعبة في مراجعة الكود

    public static string PathCombineAndCanonicalize3(string path1, string path2)
    {
        string originalRoot = string.Empty;

        if (Path.IsPathRooted(path1))
        {
            originalRoot = Path.GetPathRoot(path1);
            path1 = path1.Substring(originalRoot.Length);
        }

        string fakeRoot = @"\\thiscantbe\real\";
        string combined = Path.Combine(fakeRoot, path1, path2);
        combined = Path.GetFullPath(combined);
        combined = combined.Substring(fakeRoot.Length);
        combined = Path.Combine(originalRoot, combined);
        return combined;
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top