"Verilen yolun biçimi desteklenmiyor."


103

Web hizmetimde şu kod var:

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

Birisi, kodun 2. satırındaki bu hata mesajıyla ilgili sorunu çözmeme yardımcı olabilir.

Verilen yolun biçimi desteklenmiyor.

Klasör üzerindeki izin, herkese tam erişime ayarlanmıştır ve bu, klasörün gerçek yoludur.

Kesme noktası bana str_uploadpathas değerini verdi C:\\webprojects\\webservices\\UploadBucket\\Raw\\.

Bu dizede yanlış olan ne?


Değeri nedir fileName?
Justin

fileNameBoş gibi görünüyor .
Jeremy McGee

Justin, haklıydın. Dosya adındaki değerin adında C: / vardı. Beni öldüren buydu. Teşekkürler.
All Blond

Yanıtlar:


125

str_uploadpath + fileNameKullanmak System.IO.Path.Combineyerine şunu kullanmayı deneyin :

Path.Combine(str_uploadpath, fileName);

bir dize döndürür.


Şimdi bir hata aldım: Hata 4 Ad alanı yönergesini kullanan bir yalnızca ad alanlarına uygulanabilir; 'System.IO.Path' bir ad alanı değil türdür
All Blond

2
@All Blond, using System.IO;yukarıya koy , sonra sil str_uploadpath + fileNameve yazPath.Combine(str_uploadpath, fileName)

kod şimdi aşağıdaki gibi görünüyor, aynı hata: Verilen yolun biçimi desteklenmiyor. 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
@ Hepsi kodunuzda hata ayıklamayı deneyin. Hataya, hataya neden olan satırın tam önüne bir kesme noktası koyun (Visual Studio'da F9). Programınızı çalıştırın. Program kırılma noktasında durduğunda fareyi değişkenin üzerine getirin str_uploadpath. Değeri nedir?

1
Aşağıdaki yolda desteklenmeyen yol alıyorum, neden? "C: \ Users \ Admin \ AppData \ Local \ Adobe \ Flash CS6 \ en_US \ Configuration \ CodeModel \ cm-cache \ SwcCache \ basemovie3.swc1272273593 \ library.swf" Gezgine yapıştırırsam iyi açılıyor ama. NET'in System.IO.File.ReadAllBytes yöntemi bu hatayı atar. Kesinlikle geçerli ve doğru bir yoldur, öyleyse neden hata?
Triynko

51

Oluşturanın, dosya adını tam bir yolla kaydetmeye çalışırken hatanın oluştuğunu fark ettiğini görüyorum. Aslında ":"bu hatayı almak için dosya adında bir tane olması yeterli . Olabilir Eğer ":"dosya adını (örneğin size dosya adında bir tarih damgası varsa) başka bir şey ile bu yerine emin olun. Yani:

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

2
Bu, dosya adımla yaşadığım bir sorunu çözdü. Dosyama geçerli tarih ve saati ekliyorum ve ":" değerleri programımın referans gösterilen OP hatasını atmasına neden oluyordu.
acedanger

1
Bu benim için olduğu gibi sık sık kullanarak olur Path.GetInvalidPathCharsama değil Path.GetInvalidFileNameChars.
Seph

4
Teşekkür ederim! Bu nedenle birden fazla yanıt göndermek her zaman iyi bir fikirdir.
Nick

31

Benim için sorun, "‪" Soldan Sağa Gömme karakteriyle insan gözünün görünmez olmasıydı .
Windows dosya özellikleri güvenlik sekmesinden yolu kopyalayıp yapıştırdıktan sonra dizenin başında ('D' harfinden hemen önce) kaldı.

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

Yani ilk bakışta aynı olan iki çizgi aslında farklıdır.


21

Dosya sistemine bir dosya kaydetmeye çalışıyorsanız. Path.Combine, dosya adı geçersiz karakterler içeriyorsa size yardımcı olmayacağı için kurşun geçirmez değildir. Dosya adlarından geçersiz karakterleri çıkaran bir uzantı yöntemi:

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

Ve kullanım şunlar olabilir:

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

Ya da daha kısareturn string.Concat(s.Split(Path.GetInvalidFileNameChars()));
Yousha Aleayoub

7

Bu hataya neden olabilecek diğer şeylerin yanı sıra:

Tam PathFile dizesinde belirli karakterlere sahip olamazsınız.

Örneğin, bu karakterler StreamWriter işlevini çökertecektir:

"/"  
":"

onu çökerten başka özel karakterler de olabilir. Örneğin, bir dosya adına bir DateTime damgası koymaya çalıştığınızda bunun gerçekleştiğini gördüm:

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

Bu sorunu önlemenin bir yolu, NewFileOutS'taki sorunlu karakterleri iyi huylu karakterlerle değiştirmektir:

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

Umarım bu birisinin baş ağrısından kurtulur ...!


Ah teşekkürler! İsminde ISO tarih dizesi olan bir dosyayı kaydediyordum, ancak bu yasadışı ":" içeriyor! Teşekkürler!
Mason

3

PowerShell'de bu hatayı alırsanız, bunun nedeni büyük olasılıkla Resolve-Pathuzak bir yolu, örneğin

 Resolve-Path \\server\share\path

Bu durumda, Resolve-Pathbir dizeye dönüştürüldüğünde geçerli bir yol döndürmeyen bir nesne döndürür. PowerShell'in dahili yolunu döndürür:

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

Çözüm, ProviderPathözelliği şu tarafından döndürülen nesnede kullanmaktır Resolve-Path:

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

2

Değiştirmeyi deneyin:

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

-e

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


URL'ler genellikle eğik çizgilere sahiptir ve MapPathher iki şekilde de anlayacak kadar akıllıdır.
Justin

@spender İpin @önünde bunlardan kaçan bir tane var.
Justin

2

Bu benim sorunumdu ve başka birine yardımcı olabilir - OP'nin sorunu olmasa da:

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

Bir günlük dosyasına giden yolumun çıktısını alarak ve doğru biçimlendirmediğini bularak sorunu belirledim. Benim için doğru olan oldukça basitti:

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

1

Kullanarak mı Path.Combine yöntemi yardım? Dosya yollarını birleştirmenin daha güvenli bir yoludur. Yolları birleştirirken sorun yaşıyor olabilir


0

SSIS'de bir dosyanın arşivini oluşturmak için basit bir Dosya Sistemi Görevinde kullanmak üzere Değişken için (sınırlı) İfade oluşturucuyu kullanıyorum.

Bu, hatayı durdurmak için iki nokta üst üste işaretlerini kaldırmak için hızlı ve kirli hack'im: @ [User :: LocalFile] + "-" + REPLACE ((DT_STR, 30, 1252) GETDATE (), ":", "-") + ".xml"


0

Bugün aynı sorunu yaşadım. Koduma yüklemeye çalıştığım dosya Excel'de düzenlemeye açıktı. Excel'i kapattıktan sonra kod çalışmaya başladı!


-1

Değer file: // C: / ne gibi bir dosya url'siyse, normal bir dosya adına çevirmek için Uri sınıfını kullanın:

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

Genel olarak, sağlanan API'yi kullanmak en iyi uygulamadır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.