“Format jalur yang diberikan tidak didukung.”

103

Saya memiliki kode berikut di layanan web saya:

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

Adakah yang bisa membantu saya menyelesaikan masalah dengan pesan kesalahan ini dari baris 2 kode.

Format jalur yang diberikan tidak didukung.

Izin pada folder diatur ke akses penuh ke semua orang dan itu adalah jalur sebenarnya ke folder tersebut.

Breakpoint memberi saya nilai str_uploadpathsebagai C:\\webprojects\\webservices\\UploadBucket\\Raw\\.

Apa yang salah dengan string ini?

Semua Blond
sumber
Apa nilainya fileName?
Justin
Kedengarannya fileNamekosong.
Jeremy McGee
Justin, kamu benar. Nilai dari nama file memiliki C: / pada namanya. Itulah yang membunuh saya. Terima kasih.
All Blond

Jawaban:

125

Daripada menggunakan str_uploadpath + fileName, coba gunakan System.IO.Path.Combinesebagai gantinya:

Path.Combine(str_uploadpath, fileName);

yang mengembalikan string.

Justin
sumber
Mendapat kesalahan sekarang: Kesalahan 4 A menggunakan direktif namespace hanya dapat diterapkan ke ruang nama; 'System.IO.Path' adalah jenis bukan namespace
Semua Blond
2
@ All Blond diletakkan di using System.IO;atas, lalu hapus str_uploadpath + fileNamedan tulisPath.Combine(str_uploadpath, fileName)
kode terlihat seperti di bawah ini sekarang, kesalahan yang sama: Format jalur yang diberikan tidak didukung. string str_uploadpath = Server.MapPath (@ "/ UploadBucket / Raw /"); str_uploadpath = Path.Combine (str_uploadpath, fileName); FileStream objfilestream = FileStream baru (str_uploadpath, FileMode.Create, FileAccess.ReadWrite);
All Blond
1
@All mencoba men-debug kode Anda. Letakkan titik henti di baris tepat sebelum baris yang menyebabkan kesalahan (F9 dalam Visual Studio). Jalankan program Anda. Saat program berhenti di break point, arahkan mouse ke variabel str_uploadpath. Apa nilainya?
1
Saya mendapatkan jalur tidak didukung di jalur berikut, mengapa? "C: \ Users \ Admin \ AppData \ Local \ Adobe \ Flash CS6 \ en_US \ Configuration \ CodeModel \ cm-cache \ SwcCache \ basemovie3.swc1272273593 \ library.swf" Jika saya menempelkannya di explorer, itu terbuka dengan baik, tapi. Metode NET System.IO.File.ReadAllBytes melempar kesalahan itu. Ini tentu jalur yang valid dan akurat, jadi mengapa terjadi kesalahan?
Triynko
51

Saya melihat bahwa pembuatnya menemukan bahwa kesalahan terjadi ketika mencoba menyimpan nama file dengan seluruh jalur. Sebenarnya cukup memiliki ":"nama file untuk mendapatkan kesalahan ini. Jika mungkin ada ":"di nama file Anda (misalnya jika Anda memiliki cap tanggal di nama file Anda) pastikan Anda menggantinya dengan yang lain. Yaitu:

string fullFileName = fileName.Split('.')[0] + "(" + DateTime.Now.ToString().Replace(':', '-') + ")." + fileName.Split('.')[1];
Daniel Hedenström
sumber
2
Ini memperbaiki masalah yang saya alami dengan nama file saya. Saya menambahkan tanggal dan waktu saat ini ke file saya dan dan nilai ":" menyebabkan program saya membuang kesalahan OP yang direferensikan.
acedanger
1
Ini sering terjadi dengan menggunakan Path.GetInvalidPathCharstetapi tidak Path.GetInvalidFileNameChars, seperti yang terjadi pada saya.
Seph
4
Terima kasih! Inilah sebabnya mengapa memposting banyak jawaban selalu merupakan ide yang bagus.
Nick
31

Bagi saya masalahnya adalah karakter "‪" Penyematan Kiri-Ke-Kanan yang tidak terlihat oleh mata manusia .
Itu macet di awal string (tepat sebelum 'D'), setelah saya salin-tempel jalan, dari tab keamanan properti file windows.

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

Jadi itu, sekilas identik, dua baris sebenarnya berbeda.

Oleg Grishko
sumber
21

Jika Anda mencoba menyimpan file ke sistem file. Path.Combine bukanlah bukti peluru karena tidak akan membantu Anda jika nama file berisi karakter yang tidak valid. Berikut adalah metode ekstensi yang menghapus karakter tidak valid dari nama file:

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

Dan penggunaannya bisa:

Path.Combine(str_uploadpath, fileName.ToSafeFileName());
ThiagoPXP
sumber
Atau bahkan lebih pendekreturn string.Concat(s.Split(Path.GetInvalidFileNameChars()));
Yousha Aleayoub
7

Di antara hal-hal lain yang dapat menyebabkan kesalahan ini:

Anda tidak boleh memiliki karakter tertentu dalam string PathFile lengkap.

Misalnya, karakter ini akan merusak fungsi StreamWriter:

"/"  
":"

mungkin ada karakter khusus lain yang juga merusaknya. Saya menemukan ini terjadi ketika Anda mencoba, misalnya, untuk meletakkan cap DateTime ke dalam nama file:

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

Salah satu cara untuk mencegah masalah ini adalah mengganti karakter masalah di NewFileOutS dengan yang jinak:

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

Semoga ini bisa menyelamatkan seseorang dari sakit kepala ...!

Michael Herman
sumber
Terima kasih! Saya sedang menyimpan file dengan string tanggal ISO di namanya, tetapi itu berisi ":" ilegal! Terima kasih!
Mason
3

Jika Anda mendapatkan kesalahan ini di PowerShell, kemungkinan besar karena Anda menggunakan Resolve-Pathuntuk menyelesaikan jalur jarak jauh, mis

 Resolve-Path \\server\share\path

Dalam kasus ini, Resolve-Pathmengembalikan objek yang, ketika diubah menjadi string, tidak mengembalikan jalur yang valid. Ini mengembalikan jalur internal PowerShell:

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

Solusinya adalah menggunakan ProviderPathproperti pada objek yang dikembalikan oleh Resolve-Path:

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

Coba ubah:

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

untuk

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

JimSTAT
sumber
URL umumnya memiliki garis miring ke depan dan MapPathcukup pintar untuk mengetahuinya dengan cara apa pun.
Justin
@spender Ada @di depan string yang lolos dari itu.
Justin
2

Ini adalah masalah saya, yang dapat membantu orang lain - meskipun itu bukan masalah OP:

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

Saya menentukan masalah dengan menampilkan jalur saya ke file log, dan ternyata tidak diformat dengan benar. Yang benar bagi saya cukup sederhana:

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

Apakah menggunakan metode Path.Combine membantu? Ini cara yang lebih aman untuk menggabungkan jalur file bersama. Bisa jadi itu mengalami masalah saat menghubungkan jalur bersama

Kurru
sumber
0

Saya menggunakan pembuat Ekspresi (terbatas) untuk Variabel untuk digunakan dalam Tugas Sistem File sederhana untuk membuat arsip file di SSIS.

Ini adalah peretasan saya yang cepat dan kotor untuk menghapus titik dua guna menghentikan kesalahan: @ [User :: LocalFile] + "-" + REPLACE ((DT_STR, 30, 1252) GETDATE (), ":", "-") + ".xml"

Adam Noël
sumber
0

Saya memiliki masalah yang sama hari ini. File yang saya coba muat ke dalam kode saya terbuka untuk diedit di Excel. Setelah menutup Excel, kodenya mulai berfungsi!

Ryano
sumber
-1

Jika nilainya adalah file url seperti file: // C: / apa saja, gunakan kelas Uri untuk menerjemahkan ke nama file biasa:

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

Secara umum, menggunakan API yang disediakan adalah praktik terbaik.

Chris Bordeman
sumber