c# لا - "تنسيق المسار المحدد غير معتمد."




يمكننا تنشيط (8)

لدي الشفرة التالية في خدمة الويب الخاصة بي:

string str_uploadpath = Server.MapPath("/UploadBucket/Raw/");
FileStream objfilestream = new FileStream(str_uploadpath +
                fileName, FileMode.Create, FileAccess.ReadWrite);

يمكن للشخص أن يساعدني في حل المشكلة مع رسالة الخطأ هذه من السطر 2 من التعليمات البرمجية.

تنسيق المسار المحدد غير معتمد.

يتم تعيين الإذن على المجلد إلى الوصول الكامل إلى الجميع وهو المسار الفعلي إلى المجلد.

أعطتني نقطة التوقف قيمة str_uploadpath مثل C:\\webprojects\\webservices\\UploadBucket\\Raw\\ .

ما هو الخطأ في هذه السلسلة؟


Answers

إذا حصلت على هذا الخطأ في PowerShell ، فعلى الأرجح أنك تستخدم Resolve-Path لحل مسار بعيد ، على سبيل المثال

 Resolve-Path \\server\share\path

في هذه الحالة ، يقوم Resolve-Path بإرجاع كائن ، عند تحويله إلى سلسلة ، لا يعرض مسارًا صالحًا. تقوم بإرجاع المسار الداخلي الخاص بـ PowerShell:

> [string](Resolve-Path \\server\share\path)
Microsoft.PowerShell.Core\FileSystem::\\server\share\path

الحل هو استخدام الخاصية ProviderPath على الكائن الذي تم إرجاعه بواسطة Resolve-Path :

> Resolve-Path \\server\share\path | Select-Object -ExpandProperty PRoviderPath
\\server\share\path
> (Resolve-Path \\server\share\path).ProviderPath
\\server\share\path

من بين الأشياء الأخرى التي يمكن أن تسبب هذا الخطأ:

لا يمكن أن يكون لديك أحرف معينة في سلسلة PathFile الكاملة.

على سبيل المثال ، ستؤدي هذه الأحرف إلى تعطل الدالة StreamWriter:

"/"  
":"

قد تكون هناك شخصيات خاصة أخرى تحطمها أيضًا. لقد وجدت هذا يحدث عند محاولة ، على سبيل المثال ، لوضع طابع DateTime في اسم الملف:

AppPath = Path.GetDirectoryName(giFileNames(0))  
' AppPath is a valid path from system. (This was easy in VB6, just AppPath = App.Path & "\")
' AppPath must have "\" char at the end...

DateTime = DateAndTime.Now.ToString ' fails StreamWriter... has ":" characters
FileOut = "Data_Summary_" & DateTime & ".dat"
NewFileOutS = Path.Combine(AppPath, FileOut)
Using sw As StreamWriter = New StreamWriter(NewFileOutS  , True) ' true to append
        sw.WriteLine(NewFileOutS)
        sw.Dispose()
    End Using

إحدى الطرق لمنع هذه المشكلة هي استبدال أحرف المشكلة في NewFileOutS مع تلك الحميدة:

' clean the File output file string NewFileOutS so StreamWriter will work
 NewFileOutS = NewFileOutS.Replace("/","-") ' replace / with -
 NewFileOutS = NewFileOutS.Replace(":","-") ' replace : with - 

' after cleaning the FileNamePath string NewFileOutS, StreamWriter will not throw an (Unhandled) exception.

آمل أن هذا ينقذ شخص ما بعض الصداع ...!


كانت هذه مشكلتي ، والتي قد تساعد شخصًا آخر - على الرغم من أنها لم تكن مشكلة OP:

DirectoryInfo diTemp = new DirectoryInfo(strSomePath);
FileStream fsTemp = new FileStream(diTemp.ToString());

لقد قمت بتحديد المشكلة بإخراج المسار إلى ملف السجل ، والعثور عليه ليس التنسيق بشكل صحيح. الصحيح بالنسبة لي كان بكل بساطة:

DirectoryInfo diTemp = new DirectoryInfo(strSomePath);
FileStream fsTemp = new FileStream(diTemp.FullName.ToString());

بدلاً من استخدام str_uploadpath + fileName ، حاول استخدام System.IO.Path.Combine بدلاً من ذلك:

Path.Combine(str_uploadpath, fileName);

التي ترجع سلسلة.


أرى أن المنشئ اكتشف أن الخطأ وقع عند محاولة حفظ اسم الملف بمسار بأكمله. في الواقع يكفي أن يكون ":" في اسم الملف للحصول على هذا الخطأ. إذا كان هناك ":" في اسم الملف الخاص بك (على سبيل المثال إذا كان لديك طابع تاريخ في اسم الملف الخاص بك) تأكد من استبدالها بشيء آخر. أي:

string fullFileName = fileName.Split('.')[0] + "(" + DateTime.Now.ToString().Replace(':', '-') + ")." + fileName.Split('.')[1];

إذا كنت تحاول حفظ ملف إلى نظام الملفات. Path.Combine ليس دليلاً للرصاص لأنه لن يساعدك إذا كان اسم الملف يحتوي على أحرف غير صالحة. فيما يلي طريقة ملحق تقوم بسحب أحرف غير صالحة من أسماء الملفات:

public static string ToSafeFileName(this string s)
{
        return s
            .Replace("\\", "")
            .Replace("/", "")
            .Replace("\"", "")
            .Replace("*", "")
            .Replace(":", "")
            .Replace("?", "")
            .Replace("<", "")
            .Replace(">", "")
            .Replace("|", "");
    }

ويمكن أن يكون الاستخدام:

Path.Combine(str_uploadpath, fileName.ToSafeFileName());

هل استخدام طريقة Path.Combine مساعدة؟ إنها طريقة أكثر أمانًا للانضمام إلى مسارات الملفات معًا. يمكن أن يكون هناك مشاكل في الانضمام إلى المسارات معا


يهتم برنامج Resharper في المقام الأول بمساعدتك على كود refactor ، والكلمة الرئيسية var عمومًا تجعل إعادة التوطين أسهل. على سبيل المثال ، إذا تغيرت قيم الإرجاع لأي من هذه الوظائف إلى نوع متوافق ، فلن تحتاج إلى تغيير أي من هذه التعليمات البرمجية. لذلك أصبح من الأسهل قليلاً إعادة tabCaseNotes نوع tabCaseNotes ، على سبيل المثال.

أنا شخصًا ما أميل إلى ترك أول سطرين وحدك ، لأنني أحب أن أرى اسم النوع لمتغير مدرجًا صراحةً في مكان ما على السطر حيث تم الإعلان عن المتغير. إذا كان هناك أي شيء ، فقد أبحث عن واجهة لاستخدامها بدلاً من ذلك ، حتى أحصل أيضًا على نفس "النوع العام" كما هو الحال مع الكلمة الرئيسية var دون فقد أي معلومات مهمة للقراءة. ومع ذلك ، أود بالتأكيد استخدام var ل fillBrush و textBrush و sf .





c# .net webforms upload stream