„Format podanej ścieżki nie jest obsługiwany”.

103

Mam następujący kod w mojej usłudze sieciowej:

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

Czy ktoś może mi pomóc rozwiązać problem z tym komunikatem o błędzie z linii 2 kodu.

Format podanej ścieżki nie jest obsługiwany.

Uprawnienia do folderu są ustawione na pełny dostęp dla wszystkich i jest to rzeczywista ścieżka do folderu.

Punkt przerwania dał mi wartość str_uploadpathas C:\\webprojects\\webservices\\UploadBucket\\Raw\\.

Co jest nie tak z tym ciągiem?

All Blond
źródło
Jaka jest wartość fileName?
Justin
Wygląda na fileNameto, że jest pusty.
Jeremy McGee
Justin, miałeś rację. Wartość z nazwy pliku miała C: / w nazwie. To mnie zabijało. Dzięki.
All Blond

Odpowiedzi:

125

Zamiast używać str_uploadpath + fileName, spróbuj System.IO.Path.Combinezamiast tego użyć :

Path.Combine(str_uploadpath, fileName);

która zwraca ciąg.

Justin
źródło
Teraz pojawił się błąd: Błąd 4 Dyrektywa using namespace może być zastosowana tylko do przestrzeni nazw; „System.IO.Path” to typ, a nie przestrzeń nazw
All Blond
2
@All Blond umieść using System.IO;powyżej, potem wyczyść str_uploadpath + fileNamei napiszPath.Combine(str_uploadpath, fileName)
kod wygląda teraz jak poniżej, ten sam błąd: format podanej ścieżki nie jest obsługiwany. 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
@Wszystko spróbuj debugować swój kod. Umieść punkt przerwania w wierszu dokładnie przed wierszem, który powoduje błąd (F9 w programie Visual Studio). Uruchom swój program. Gdy program zatrzyma się w punkcie przerwania, najedź myszą na zmienną str_uploadpath. Jaka jest jego wartość?
1
Otrzymuję ścieżkę nieobsługiwaną na następującej ścieżce, dlaczego? „C: \ Users \ Admin \ AppData \ Local \ Adobe \ Flash CS6 \ en_US \ Configuration \ CodeModel \ cm-cache \ SwcCache \ basemovie3.swc1272273593 \ library.swf” Jeśli wkleię go w eksploratorze, otworzy się dobrze, ale. Metoda System.IO.File.ReadAllBytes sieci .NET zgłasza ten błąd. To z pewnością poprawna i dokładna ścieżka, więc po co ten błąd?
Triynko,
51

Widzę, że twórca dowiedział się, że wystąpił błąd podczas próby zapisania nazwy pliku z całą ścieżką. Właściwie wystarczy mieć ":"w nazwie pliku, aby uzyskać ten błąd. Jeśli ":"nazwa pliku może występować (na przykład, jeśli w nazwie pliku znajduje się znacznik daty), upewnij się, że zastąpiłeś je czymś innym. To znaczy:

string fullFileName = fileName.Split('.')[0] + "(" + DateTime.Now.ToString().Replace(':', '-') + ")." + fileName.Split('.')[1];
Daniel Hedenström
źródło
2
To rozwiązało problem, który miałem z moją nazwą pliku. Dołączam bieżącą datę i godzinę do mojego pliku, a wartości „:” powodowały, że mój program zgłaszał błąd OP, do którego się odwołuje.
acedanger
1
Często zdarza się to przy użyciu, Path.GetInvalidPathCharsale nie Path.GetInvalidFileNameChars, jak to miało miejsce w moim przypadku.
Seph,
4
Dziękuję Ci! Dlatego publikowanie wielu odpowiedzi jest zawsze dobrym pomysłem.
Nick
31

Dla mnie problemem był niewidoczny dla ludzkiego oka znak "‪" osadzania od lewej do prawej .
Utknął na początku ciągu (tuż przed „D”), po skopiowaniu i wklejeniu ścieżki z zakładki zabezpieczeń właściwości pliku systemu Windows.

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

Więc te, na pierwszy rzut oka identyczne, dwie linie są w rzeczywistości różne.

Oleg Grishko
źródło
21

Jeśli próbujesz zapisać plik w systemie plików. Path.Combine nie jest punktorem, ponieważ nie pomoże, jeśli nazwa pliku zawiera nieprawidłowe znaki. Oto metoda rozszerzenia, która usuwa nieprawidłowe znaki z nazw plików:

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

A użycie może być:

Path.Combine(str_uploadpath, fileName.ToSafeFileName());
ThiagoPXP
źródło
Lub jeszcze krócejreturn string.Concat(s.Split(Path.GetInvalidFileNameChars()));
Yousha Aleayoub
7

Między innymi, które mogą powodować ten błąd:

Nie możesz mieć niektórych znaków w pełnym ciągu PathFile.

Na przykład te znaki spowodują awarię funkcji StreamWriter:

"/"  
":"

mogą być też inne znaki specjalne, które go zawieszają. Zauważyłem, że dzieje się tak, gdy próbujesz, na przykład, umieścić znacznik daty i godziny w nazwie pliku:

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

Jednym ze sposobów uniknięcia tego problemu jest zastąpienie problematycznych znaków w NewFileOutS łagodnymi:

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

Mam nadzieję, że to oszczędza komuś bólu głowy ...!

Michael Herman
źródło
Ah dziękuję! Zapisałem plik z ciągiem daty ISO w nazwie, ale zawiera on niedozwolone „:”! Dzięki!
Mason
3

Jeśli pojawi się ten błąd w PowerShell, najprawdopodobniej jest to spowodowane tym, że używasz Resolve-Pathdo rozwiązywania zdalnej ścieżki, np

 Resolve-Path \\server\share\path

W tym przypadku Resolve-Pathzwraca obiekt, który po przekonwertowaniu na ciąg nie zwraca prawidłowej ścieżki. Zwraca wewnętrzną ścieżkę PowerShell:

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

Rozwiązaniem jest użycie ProviderPathwłaściwości na obiekcie zwracanym przez 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
źródło
2

Spróbuj zmienić:

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

do

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

JimSTAT
źródło
Adresy URL zazwyczaj mają ukośniki i MapPathsą wystarczająco inteligentne, aby je rozgryźć.
Justin,
@spender Na początku łańcucha znajduje się znak, @który wymyka się tym.
Justin
2

To był mój problem, który może pomóc komuś innemu - chociaż nie był to problem OP:

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

Ustaliłem problem, wyświetlając ścieżkę do pliku dziennika i stwierdzając, że nie jest poprawnie formatowany. Poprawne dla mnie było po prostu:

DirectoryInfo diTemp = new DirectoryInfo(strSomePath);
FileStream fsTemp = new FileStream(diTemp.FullName.ToString());
omJohn8372
źródło
1

Czy użycie metody Path.Combine pomaga? To bezpieczniejszy sposób łączenia ze sobą ścieżek plików. Możliwe, że ma problemy z połączeniem ścieżek razem

Kurru
źródło
0

Używam (ograniczonego) konstruktora wyrażeń dla zmiennej do użycia w prostym zadaniu systemu plików, aby utworzyć archiwum pliku w SSIS.

Oto mój szybki i brudny sposób na usunięcie dwukropków, aby zatrzymać błąd: @ [User :: LocalFile] + "-" + REPLACE ((DT_STR, 30, 1252) GETDATE (), ":", "-") + „.xml”

Adam Noël
źródło
0

Dzisiaj miałem ten sam problem. Plik, który próbowałem załadować do mojego kodu, był otwarty do edycji w programie Excel. Po zamknięciu Excela kod zaczął działać!

Ryano
źródło
-1

Jeśli wartością jest adres URL pliku, taki jak file: // C: / cokolwiek, użyj klasy Uri, aby przetłumaczyć na zwykłą nazwę pliku:

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

Ogólnie rzecz biorąc, używanie udostępnionego interfejsu API jest najlepszym rozwiązaniem.

Chris Bordeman
źródło