"Das Format des angegebenen Pfads wird nicht unterstützt."

103

Ich habe den folgenden Code in meinem Webdienst:

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

Kann mir jemand helfen, das Problem mit dieser Fehlermeldung aus Zeile 2 des Codes zu beheben.

Das Format des angegebenen Pfads wird nicht unterstützt.

Die Berechtigung für den Ordner ist auf vollen Zugriff für alle festgelegt und ist der tatsächliche Pfad zum Ordner.

Der Haltepunkt gab mir den Wert von str_uploadpathas C:\\webprojects\\webservices\\UploadBucket\\Raw\\.

Was ist los mit dieser Saite?

Alles blond
quelle
Was ist der Wert von fileName?
Justin
Klingt wie fileNameist leer.
Jeremy McGee
Justin, du hattest recht. Der Wert aus dem Dateinamen hatte C: / im Namen. Das hat mich umgebracht. Vielen Dank.
Alle blond

Antworten:

125

Anstatt mit str_uploadpath + fileName, versuchen Sie es mit System.IO.Path.Combinestatt:

Path.Combine(str_uploadpath, fileName);

Dies gibt eine Zeichenfolge zurück.

Justin
quelle
Jetzt ist ein Fehler aufgetreten: Fehler 4 Eine Namespace-Direktive kann nur auf Namespaces angewendet werden. 'System.IO.Path' ist ein Typ, kein Namespace
All Blond
2
@ All Blond using System.IO;oben setzen , dann löschen str_uploadpath + fileNameund schreibenPath.Combine(str_uploadpath, fileName)
Code sieht jetzt wie folgt aus, gleicher Fehler: Das Format des angegebenen Pfads wird nicht unterstützt. Zeichenfolge str_uploadpath = Server.MapPath (@ "/ UploadBucket / Raw /"); str_uploadpath = Path.Combine (str_uploadpath, fileName); FileStream objfilestream = neuer FileStream (str_uploadpath, FileMode.Create, FileAccess.ReadWrite);
Alle blond
1
@Alle versuchen, Ihren Code zu debuggen. Setzen Sie einen Haltepunkt genau vor der Zeile, die einen Fehler verursacht (F9 in Visual Studio). Führen Sie Ihr Programm aus. Wenn das Programm am Haltepunkt stoppt, bewegen Sie die Maus über die Variable str_uploadpath. Was ist ihr Wert?
1
Der folgende Pfad wird auf dem folgenden Pfad nicht unterstützt. Warum? "C: \ Benutzer \ Admin \ AppData \ Local \ Adobe \ Flash CS6 \ de_DE \ Konfiguration \ CodeModel \ cm-cache \ SwcCache \ basemovie3.swc1272273593 \ library.swf" Wenn ich es in den Explorer einfüge, wird es problemlos geöffnet, aber. Die System.IO.File.ReadAllBytes-Methode von NET löst diesen Fehler aus. Es ist sicherlich ein gültiger und genauer Pfad. Warum also der Fehler?
Triynko
51

Ich sehe, dass der Urheber herausgefunden hat, dass der Fehler aufgetreten ist, als er versucht hat, den Dateinamen mit einem ganzen Pfad zu speichern. Eigentlich reicht es aus, ein ":"im Dateinamen zu haben, um diesen Fehler zu erhalten. Wenn ":"Ihr Dateiname möglicherweise vorhanden ist (z. B. wenn Ihr Dateiname einen Datumsstempel enthält), stellen Sie sicher, dass Sie diese durch etwas anderes ersetzen. Dh:

string fullFileName = fileName.Split('.')[0] + "(" + DateTime.Now.ToString().Replace(':', '-') + ")." + fileName.Split('.')[1];
Daniel Hedenström
quelle
2
Dies hat ein Problem behoben, das ich mit meinem Dateinamen hatte. Ich hänge das aktuelle Datum und die aktuelle Uhrzeit an meine Datei an, und die Werte ":" haben dazu geführt, dass mein Programm den Fehler OP ausgelöst hat, auf den verwiesen wird.
Acedanger
1
Dies geschieht oft mit, Path.GetInvalidPathCharsaber nicht Path.GetInvalidFileNameChars, wie es bei mir der Fall war.
Seph
4
Danke dir! Aus diesem Grund ist es immer eine gute Idee, mehrere Antworten zu veröffentlichen.
Nick
31

Für mich war das Problem ein für das menschliche Auge unsichtbarer "‪" Left-To-Right-Embedding- Charakter.
Es blieb am Anfang der Zeichenfolge (kurz vor dem 'D') hängen, nachdem ich den Pfad von der Sicherheitsregisterkarte für Windows-Dateieigenschaften kopiert und eingefügt hatte.

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

Die auf den ersten Blick identischen zwei Zeilen sind also tatsächlich unterschiedlich.

Oleg Grishko
quelle
21

Wenn Sie versuchen, eine Datei im Dateisystem zu speichern. Path.Combine ist nicht kugelsicher, da es Ihnen nicht hilft, wenn der Dateiname ungültige Zeichen enthält. Hier ist eine Erweiterungsmethode, mit der ungültige Zeichen aus Dateinamen entfernt werden:

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

Und die Verwendung kann sein:

Path.Combine(str_uploadpath, fileName.ToSafeFileName());
ThiagoPXP
quelle
Oder noch kürzerreturn string.Concat(s.Split(Path.GetInvalidFileNameChars()));
Yousha Aleayoub
7

Unter anderem, die diesen Fehler verursachen können:

Sie können bestimmte Zeichen nicht in der vollständigen PathFile-Zeichenfolge enthalten.

Diese Zeichen stürzen beispielsweise die StreamWriter-Funktion ab:

"/"  
":"

Es kann auch andere Sonderzeichen geben, die es zum Absturz bringen. Ich habe festgestellt, dass dies passiert, wenn Sie beispielsweise versuchen, einen DateTime-Stempel in einen Dateinamen einzufügen:

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

Eine Möglichkeit, dieses Problem zu vermeiden, besteht darin, Problemzeichen in NewFileOutS durch gutartige zu ersetzen:

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

Hoffe das erspart jemandem ein paar Kopfschmerzen ...!

Michael Herman
quelle
Ah, Danke! Ich habe eine Datei mit einer ISO-Datumszeichenfolge im Namen gespeichert, aber diese enthält das unzulässige ":"! Vielen Dank!
Mason
3

Wenn Sie diesen Fehler in PowerShell erhalten, liegt dies höchstwahrscheinlich daran, dass Sie Resolve-Patheinen Remote-Pfad auflösen, z

 Resolve-Path \\server\share\path

In diesem Fall wird Resolve-Pathein Objekt zurückgegeben, das bei der Konvertierung in eine Zeichenfolge keinen gültigen Pfad zurückgibt. Es gibt den internen Pfad von PowerShell zurück:

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

Die Lösung besteht darin, die ProviderPathEigenschaft für das zurückgegebene Objekt zu verwenden 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
quelle
2

Versuchen Sie zu ändern:

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

zu

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

JimSTAT
quelle
URLs haben im Allgemeinen Schrägstriche und MapPathsind intelligent genug, um dies so oder so herauszufinden.
Justin
@spender @An der Vorderseite der Zeichenfolge befindet sich eine, die diesen entgeht.
Justin
2

Dies war mein Problem, das jemand anderem helfen könnte - obwohl es nicht das Problem des OP war:

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

Ich habe das Problem festgestellt, indem ich meinen Pfad zu einer Protokolldatei ausgegeben und festgestellt habe, dass die Formatierung nicht korrekt ist. Richtig für mich war ganz einfach:

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

Hilft die Verwendung der Path.Combine- Methode? Dies ist eine sicherere Möglichkeit, Dateipfade miteinander zu verbinden. Es könnte sein, dass es Probleme gibt, die Pfade miteinander zu verbinden

Kurru
quelle
0

Ich verwende den (eingeschränkten) Ausdrucksgenerator für eine Variable zur Verwendung in einer einfachen Dateisystemaufgabe, um ein Archiv einer Datei in SSIS zu erstellen.

Dies ist mein schneller und schmutziger Hack, um die Doppelpunkte zu entfernen und den Fehler zu stoppen: @ [User :: LocalFile] + "-" + REPLACE ((DT_STR, 30, 1252) GETDATE (), ":", "-") + ".xml"

Adam Noël
quelle
0

Ich hatte heute das gleiche Problem. Die Datei, die ich in meinen Code laden wollte, konnte in Excel bearbeitet werden. Nach dem Schließen von Excel begann der Code zu funktionieren!

Ryano
quelle
-1

Wenn der Wert eine Datei-URL wie file: // C: / Whatever ist, verwenden Sie die Uri-Klasse, um in einen regulären Dateinamen zu übersetzen:

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

Im Allgemeinen ist die Verwendung der bereitgestellten API eine bewährte Methode.

Chris Bordeman
quelle