“ ไม่รองรับรูปแบบของเส้นทางที่ระบุ”


103

ฉันมีรหัสต่อไปนี้ในบริการบนเว็บของฉัน:

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\\.

สตริงนี้มีอะไรผิดปกติ


มูลค่าของfileNameอะไร?
จัสติน

ฟังดูเหมือนfileNameว่างเปล่า
Jeremy McGee

จัสตินคุณพูดถูก ค่าจากชื่อไฟล์มี C: / ในชื่อ นั่นคือสิ่งที่ฆ่าฉัน ขอบคุณ.
All Blond

คำตอบ:


126

แทนที่จะใช้str_uploadpath + fileNameให้ลองใช้System.IO.Path.Combineแทน:

Path.Combine(str_uploadpath, fileName);

ซึ่งส่งคืนสตริง


พบข้อผิดพลาดในขณะนี้: ข้อผิดพลาด 4 A โดยใช้คำสั่งเนมสเปซสามารถใช้ได้กับเนมสเปซเท่านั้น 'System.IO.Path' เป็นประเภทที่ไม่ใช่เนมสเปซ
All Blond

2
@ ออลล์บลอนด์ใส่using System.IO;ข้างบนแล้วเคลียร์แล้วstr_uploadpath + fileNameเขียนPath.Combine(str_uploadpath, fileName)

โค้ดดูเหมือนด้านล่างนี้ข้อผิดพลาดเดียวกัน: ไม่รองรับรูปแบบของเส้นทางที่ระบุ สตริง str_uploadpath = Server.MapPath (@ "/ UploadBucket / Raw /"); str_uploadpath = Path.Combine (str_uploadpath, fileName); FileStream objfilestream = FileStream ใหม่ (str_uploadpath, FileMode.Create, FileAccess.ReadWrite);
All Blond

1
@ ทุกคนพยายามที่จะดีบักรหัสของคุณ วางจุดพักบนบรรทัดก่อนบรรทัดที่ทำให้เกิดข้อผิดพลาด (F9 ใน Visual Studio) รันโปรแกรมของคุณ เมื่อ stopps str_uploadpathโปรแกรมบนจุดพักให้วางเมาส์บนตัวแปร มูลค่าของมันคืออะไร?

1
ฉันได้รับเส้นทางที่ไม่รองรับในเส้นทางต่อไปนี้เพราะเหตุใด "C: \ Users \ Admin \ AppData \ Local \ Adobe \ Flash CS6 \ en_US \ Configuration \ CodeModel \ cm-cache \ SwcCache \ basemovie3.swc1272273593 \ library.swf" ถ้าฉันวางใน explorer จะเปิดขึ้นได้ดี แต่. วิธี System.IO.File.ReadAllBytes ของ NET แสดงข้อผิดพลาดนั้น เป็นเส้นทางที่ถูกต้องและแม่นยำอย่างแน่นอนเหตุใดจึงเกิดข้อผิดพลาด
Triynko

51

ฉันเห็นว่าผู้ริเริ่มพบว่าเกิดข้อผิดพลาดเมื่อพยายามบันทึกชื่อไฟล์ด้วยเส้นทางทั้งหมด ที่จริงก็เพียงพอที่จะมี":"ในชื่อไฟล์เพื่อรับข้อผิดพลาดนี้ หากอาจมี":"อยู่ในชื่อไฟล์ของคุณ (เช่นหากคุณมีการประทับวันที่ในชื่อไฟล์ของคุณ) ให้แน่ใจว่าคุณแทนที่สิ่งเหล่านี้ด้วยสิ่งอื่น ได้แก่ :

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

2
สิ่งนี้ได้แก้ไขปัญหาที่ฉันพบกับชื่อไฟล์ของฉัน ฉันกำลังต่อท้ายวันที่และเวลาปัจจุบันในไฟล์ของฉันและและค่า ":" ทำให้โปรแกรมของฉันแสดงข้อผิดพลาด OP ที่อ้างถึง
acedanger

1
สิ่งนี้มักเกิดขึ้นโดยใช้Path.GetInvalidPathCharsแต่ไม่ใช่Path.GetInvalidFileNameCharsเช่นเดียวกับในกรณีของฉัน
SEPH

4
ขอบคุณ! นี่คือเหตุผลว่าทำไมการโพสต์คำตอบหลาย ๆ คำจึงเป็นความคิดที่ดี
นิค

32

สำหรับฉันปัญหาคือตัวละคร"‪" การฝังจากซ้ายไปขวาที่ตามนุษย์มองไม่เห็น
มันติดอยู่ที่จุดเริ่มต้นของสตริง (ก่อน 'D') หลังจากที่ฉันคัดลอกเส้นทางจากแท็บความปลอดภัยคุณสมบัติไฟล์ windows

var yourJson = System.IO.File.ReadAllText(@"D:\test\json.txt"); // Works
var yourJson = System.IO.File.ReadAllText(@"‪D:\test\json.txt"); // Error

ดังนั้นสิ่งที่เหมือนกันในตอนแรกสองบรรทัดจึงแตกต่างกัน


ในกรณีของฉันฉันได้$@"D:\test\json{dateTimeValue}.txt"แปลเป็นภาษาที่แน่นอน09/04/2020
John Zabroski

21

หากคุณกำลังพยายามบันทึกไฟล์ลงในระบบไฟล์ 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());

หรือสั้นกว่านั้นreturn string.Concat(s.Split(Path.GetInvalidFileNameChars()));
Yousha Aleayoub

7

เหนือสิ่งอื่นใดที่อาจทำให้เกิดข้อผิดพลาดนี้:

คุณไม่สามารถมีอักขระบางตัวในสตริง 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.

หวังว่าจะช่วยให้ใครบางคนปวดหัว ... !


อ๊ะขอบคุณ! ฉันกำลังบันทึกไฟล์ที่มีสตริงวันที่ ISO ในชื่อ แต่มี ":" ที่ไม่ถูกต้อง! ขอบคุณ!
Mason

3

หากคุณได้รับข้อผิดพลาดนี้ใน 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

2

ลองเปลี่ยน:

Server.MapPath("/UploadBucket/Raw/")

ถึง

Server.MapPath(@"\UploadBucket\Raw\")


โดยทั่วไป URL จะมีเครื่องหมายทับและMapPathฉลาดพอที่จะคิดออกไม่ว่าจะด้วยวิธีใดก็ตาม
Justin

@spender มี@ที่ด้านหน้าของสตริงที่หลีกหนีสิ่งเหล่านั้น
Justin

2

นี่เป็นปัญหาของฉันซึ่งอาจช่วยคนอื่นได้แม้ว่าจะไม่ใช่ปัญหาของ OP:

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

ฉันพิจารณาปัญหาโดยการส่งออกพา ธ ของฉันไปยังล็อกไฟล์และพบว่าไม่ได้จัดรูปแบบอย่างถูกต้อง ถูกต้องสำหรับฉันค่อนข้างง่าย:

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

1

การใช้เมธอดPath.Combineช่วยได้หรือไม่? เป็นวิธีที่ปลอดภัยกว่าในการรวมพา ธ ไฟล์เข้าด้วยกัน อาจเป็นไปได้ว่ากำลังมีปัญหาในการเข้าร่วมเส้นทางด้วยกัน


0

ฉันใช้ตัวสร้างนิพจน์ (จำกัด ) สำหรับตัวแปรเพื่อใช้ในงานระบบไฟล์อย่างง่ายเพื่อสร้างไฟล์เก็บถาวรใน SSIS

นี่คือการแฮ็คที่รวดเร็วและสกปรกของฉันในการลบโคลอนเพื่อหยุดข้อผิดพลาด: @ [User :: LocalFile] + "-" + REPLACE ((DT_STR, 30, 1252) GETDATE (), ":", "-") + ".xml"


0

วันนี้ฉันมีปัญหาเดียวกัน ไฟล์ที่ฉันพยายามโหลดลงในโค้ดของฉันถูกเปิดให้แก้ไขใน Excel หลังจากปิด Excel โค้ดก็เริ่มทำงาน!


-1

ถ้าค่าเป็น url ของไฟล์เช่น file: // C: / อะไรก็ตามให้ใช้คลาส Uri เพื่อแปลเป็นชื่อไฟล์ปกติ:

var localPath = (new Uri(urlStylePath)).AbsolutePath

โดยทั่วไปการใช้ API ที่ให้มาถือเป็นแนวทางปฏิบัติที่ดีที่สุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.