سؤال

لقد لاحظت شيئًا غريبًا في Server.MapPath ().إذا كان لدي مجلد به مسافة في النهاية أحصل على:

استثناء المتشعب:فشل في تعيين المسار.

هذا يعمل بشكل جيد:Server.MapPath("/Folder1/Folder2/item.jpg")

هذا يعمل بشكل جيد:Server.MapPath("/Folder1/ Folder2/item.jpg")

هذا يعمل بشكل جيد:Server.MapPath("/Folder1/Fol der2/item.jpg")

هذا فاشل!:Server.MapPath("/Folder1/Folder2 /item.jpg")

هل يمكن لأحد أن يشرح لي لماذا تفشل المساحة في النهاية بينما لا تفشل المساحة في أي مكان آخر؟

ملحوظة: لا يوجد أي من المجلدات.

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

المحلول

لأنك لا ينبغي:

لا تنهي اسم الملف أو الدليل بمسافة أو نقطة.على الرغم من أن نظام الملفات الأساسي قد يدعم مثل هذه الأسماء، إلا أن غلاف Windows وواجهة المستخدم لا تدعم ذلك.ومع ذلك، فمن المقبول تحديد فترة كالحرف الأول من الاسم.على سبيل المثال، ".temp".

المشكلة تأتي من الطريقة FileUtil.IsSuspiciousPhysicalPath(string physicalPath, out bool pathTooLong), ، الذي يقوم بمقارنة:

string.Compare(physicalPath, Path.GetFullPath(physicalPath), StringComparison.OrdinalIgnoreCase) != 0;

Path.GetFullPath() سوف يقوم بقص المسافات الزائدة من أسماء الدليل والملفات (لأنه يستدعي Path.NormalizePath() الذي يفعل ذلك)، والذي يمكن اكتشافه وهو يدعو Path.GetFullPath(@"C:\Foo \Bar.txt") على سبيل المثال.نظرًا لأن ذلك لن يطابق المسار الأصلي الذي يحتوي على المسافات، فستعود الطريقة true وبالتالي تحديد المسار على أنه مشبوه، وبعد ذلك Server.MapPath سوف يرمي الاستثناء.

نصائح أخرى

طريقة MapPath خرائط المسار النسبي أو الظاهري المحدد إلى الدليل الفعلي المقابل على الخادم.لا تحقق الأسلوب ما إذا كان المسار الذي يتعلق به صالحة أو موجودة على الخادم.يجب عليك استخدام Directory.exist () أو File.exist () طريقة للتحقق من وجود دليل أو ملف موجود بالفعل. giveacodicetagpre.

علاوة على ذلك، تعرف أيضا فيما يلي أحرف Invlid للطريقة:

النجمة (*)
علامة استفهام (؟)
أقواس الزاوية (<أو>)
فاصلة (،)
القولون أو شبه القولون (: أو؛)
اقتباس واحد أو اقتباس مزدوج ('أو ")
قوس مربع الأيمن (])
خطوط مائلة مزدوجة (// أو \)

نأمل أن يساعد.

يحرر

إعداد Visual Studio 2010 للدخول إلى Microsoft .NET Source Code

باستخدام منشور الأشياء، حاولت اكتشاف ما يحدث بالفعل في إطار عمل .net عندما نستخدم الطريقة server.MapPath بعد تصحيح أخطاء كود إطار عمل .net، اكتشفت مكالمات للحصول على المسار المطلق من المسار الظاهري الذي يتم طرحه بعد الملفات وطرق إطار العمل

ملف - System Web httpserverutilitily.cs 1477467 httpserverutility.csطريقة- مسار الخريطة

ملف - \ النظام \ الويب \ VirtualPath .cs \ 1477467 \ VirtualPath .cs *طريقة*-يخلق

ملف -System\Web\HttpRequest.cs\1599819\HttpRequest.csطريقة- مسار الخريطة

لكنني وجدت أنه مع سلوك المرحلة فإنه يعيدني فارغًا عندما يكون المسار /folder1/folder2 /file.cs ولكن لا يتم إعادة كائن فارغ عند إدخال /folder1/ Folder2/file.cs

أتمنى أن تكونوا قد أحببتم الدخول في إطار العمل ومعرفة ما سيحدث

سؤال جيد بأي حال من الأحوال.. ولكن لا يزال الجواب على هذا السؤال قد يتم تقديمه من قبل أشخاص Microsoft فقط الذين صمموا تلك الملفات في إطار العمل


تكمن المشكلة في عدم القدرة على تحديد موقع المجلد بمساحة أي "Folder2". غير صالح وغير قادر على تحديد موقع هذا المجلد على نظام الملفات.

في الأساس، لا تجد أي مجلد في نظام ملفات Windows يحتوي على مساحة بعد namei.e في النهاية أو البداية.

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