“Định dạng của đường dẫn đã cho không được hỗ trợ.”


103

Tôi có mã sau trong dịch vụ web của mình:

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

Ai đó có thể giúp tôi giải quyết vấn đề với thông báo lỗi này từ dòng 2 của mã không.

Định dạng của đường dẫn đã cho không được hỗ trợ.

Quyền trên thư mục được đặt thành quyền truy cập đầy đủ cho tất cả mọi người và đó là đường dẫn thực tế đến thư mục.

Điểm ngắt đã cho tôi giá trị str_uploadpathnhư C:\\webprojects\\webservices\\UploadBucket\\Raw\\.

Có gì sai với chuỗi này?


Giá trị của là fileNamegì?
Justin

Nghe như fileNamelà trống rỗng.
Jeremy McGee

Justin, bạn đã đúng. Giá trị từ tên tệp có C: / trong tên. Đó là thứ đã giết chết tôi. Cảm ơn.
All Blond

Câu trả lời:


125

Thay vì sử dụng str_uploadpath + fileName, hãy thử sử dụng System.IO.Path.Combinethay thế:

Path.Combine(str_uploadpath, fileName);

trả về một chuỗi.


Đã xảy ra lỗi: Lỗi 4 Chỉ có thể áp dụng chỉ thị sử dụng không gian tên cho không gian tên; 'System.IO.Path' là một loại không phải là một không gian tên
Tất cả Blond

2
@All Blond đặt using System.IO;trên, sau đó rõ ràng str_uploadpath + fileNamevà ghiPath.Combine(str_uploadpath, fileName)

mã trông giống như bên dưới bây giờ, cùng một lỗi: Định dạng của đường dẫn đã cho không được hỗ trợ. string str_uploadpath = Server.MapPath (@ "/ UploadBucket / Raw /"); str_uploadpath = Path.Combine (str_uploadpath, fileName); FileStream objfilestream = new FileStream (str_uploadpath, FileMode.Create, FileAccess.ReadWrite);
All Blond

1
@Tất cả cố gắng gỡ lỗi mã của bạn. Đặt một điểm ngắt trên dòng chính xác trước dòng gây ra lỗi (F9 trong Visual Studio). Chạy chương trình của bạn. Khi chương trình dừng trên điểm ngắt, di chuột vào biến str_uploadpath. Giá trị của nó là gì?

1
Tôi nhận được đường dẫn không được hỗ trợ trên đường dẫn sau, tại sao? "C: \ Users \ Admin \ AppData \ Local \ Adobe \ Flash CS6 \ en_US \ Configuration \ CodeModel \ cm-cache \ SwcCache \ basemovie3.swc1272273593 \ library.swf" Nếu tôi dán nó vào explorer, nó sẽ mở ra tốt, nhưng. Phương thức System.IO.File.ReadAllBytes của NET ném lỗi đó. Đó chắc chắn là một đường dẫn hợp lệ và chính xác, vậy tại sao lại có lỗi?
Triynko

51

Tôi thấy rằng người khởi tạo phát hiện ra rằng lỗi xảy ra khi cố gắng lưu tên tệp với toàn bộ đường dẫn. Trên thực tế, nó là đủ để có một ":"trong tên tệp để nhận được lỗi này. Nếu có thể có ":"trong tên tệp của bạn (ví dụ: nếu bạn có dấu ngày tháng trong tên tệp của mình), hãy đảm bảo bạn thay thế chúng bằng tên khác. I E:

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

2
Điều này đã khắc phục sự cố mà tôi đang gặp phải với tên tệp của mình. Tôi đang thêm ngày và giờ hiện tại vào tệp của mình và các giá trị ":" đã khiến chương trình của tôi gặp lỗi mà OP đã tham chiếu.
acedanger

1
Điều này thường xảy ra bằng cách sử dụng Path.GetInvalidPathCharsnhưng không phải Path.GetInvalidFileNameChars, như trường hợp của tôi.
Seph

4
Cảm ơn bạn! Đây là lý do tại sao đăng nhiều câu trả lời luôn là một ý kiến ​​hay.
Nick

31

Đối với tôi, vấn đề là nhân vật "‪" Nhúng Trái-Phải-Phải vô hình đối với mắt người .
Nó bị kẹt ở đầu chuỗi (ngay trước 'D'), sau khi tôi sao chép-dán đường dẫn, từ tab bảo mật thuộc tính tệp windows.

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

Vì vậy, thoạt nhìn giống hệt nhau, hai dòng thực sự khác nhau.


21

Nếu bạn đang cố gắng lưu một tệp vào hệ thống tệp. Path.Combine không phải là chống đạn vì nó sẽ không giúp bạn nếu tên tệp chứa các ký tự không hợp lệ. Đây là một phương pháp mở rộng giúp loại bỏ các ký tự không hợp lệ khỏi tên tệp:

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

Và cách sử dụng có thể là:

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

Hoặc thậm chí ngắn hơnreturn string.Concat(s.Split(Path.GetInvalidFileNameChars()));
Yousha Aleayoub

7

Trong số những thứ khác có thể gây ra lỗi này:

Bạn không thể có một số ký tự nhất định trong chuỗi PathFile đầy đủ.

Ví dụ: các ký tự này sẽ làm hỏng chức năng StreamWriter:

"/"  
":"

có thể có các ký tự đặc biệt khác cũng làm hỏng nó. Tôi thấy điều này xảy ra khi bạn thử, chẳng hạn, đặt dấu DateTime vào tên tệp:

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

Một cách để ngăn chặn sự cố này là thay thế các ký tự có vấn đề trong NewFileOutS bằng các ký tự lành tính:

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

Hy vọng điều này sẽ giúp ai đó bớt đau đầu ...!


Ah cảm ơn bạn! Tôi đang lưu một tệp có chuỗi ngày ISO trong tên, nhưng có chứa ":" bất hợp pháp! Cảm ơn!
Mason

3

Nếu bạn gặp lỗi này trong PowerShell, rất có thể do bạn đang sử dụng Resolve-Pathđể giải quyết một đường dẫn từ xa, ví dụ:

 Resolve-Path \\server\share\path

Trong trường hợp này, Resolve-Pathtrả về một đối tượng, khi được chuyển đổi thành một chuỗi, không trả về một đường dẫn hợp lệ. Nó trả về đường dẫn nội bộ của PowerShell:

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

Giải pháp là sử dụng thuộc ProviderPathtính trên đối tượng được trả về bởi Resolve-Path:

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

2

Hãy thử thay đổi:

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

đến

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


Các URL thường có dấu gạch chéo về phía trước và MapPathđủ thông minh để tìm ra theo cách nào đó.
Justin

@spender Có một @ở phía trước của chuỗi thoát khỏi chúng.
Justin

2

Đây là vấn đề của tôi, có thể giúp ích cho người khác - mặc dù đó không phải là vấn đề của OP:

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

Tôi đã xác định vấn đề bằng cách xuất đường dẫn của mình tới tệp nhật ký và nhận thấy nó không định dạng đúng. Chính xác đối với tôi khá đơn giản:

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

1

Sử dụng phương pháp Path.Combine có giúp ích gì không? Đó là một cách an toàn hơn để nối các đường dẫn tệp với nhau. Có thể là nó đang gặp vấn đề khi kết nối các đường dẫn với nhau


0

Tôi đang sử dụng trình tạo Biểu thức (có giới hạn) cho một Biến để sử dụng trong Tác vụ Hệ thống Tệp đơn giản để tạo lưu trữ tệp trong SSIS.

Đây là thủ thuật nhanh chóng và bẩn thỉu của tôi để loại bỏ dấu hai chấm để ngăn lỗi: @ [User :: LocalFile] + "-" + REPLACE ((DT_STR, 30, 1252) GETDATE (), ":", "-") + ".xml"


0

Tôi đã có cùng một vấn đề ngày hôm nay. Tệp tôi đang cố tải vào mã của mình đã được mở để chỉnh sửa trong Excel. Sau khi đóng Excel, mã bắt đầu hoạt động!


-1

Nếu giá trị là url tệp như tệp: // C: / anything, hãy sử dụng lớp Uri để dịch sang tên tệp thông thường:

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

Nói chung, sử dụng API được cung cấp là phương pháp hay nhất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.