it-swarm.com.de

"Das angegebene Pfadformat wird nicht unterstützt."

Ich habe den folgenden Code in meinem Webservice:

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 angegebene Pfadformat wird nicht unterstützt.

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

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

Was ist los mit dieser Zeichenfolge?

85
All Blond

Verwenden Sie statt str_uploadpath + fileName stattdessen System.IO.Path.Combine :

Path.Combine(str_uploadpath, fileName);

was eine Zeichenfolge zurückgibt.

104
user586399

Ich sehe, dass der Urheber herausgefunden hat, dass der Fehler aufgetreten ist, als versucht wurde, den Dateinamen mit einem gesamten Pfad zu speichern. Eigentlich reicht es aus, einen ":" im Dateinamen zu haben, um diesen Fehler zu erhalten. Wenn sich in Ihrem Dateinamen ":" befindet (wenn Sie beispielsweise einen Datumsstempel in Ihrem Dateinamen haben), stellen Sie sicher, dass Sie diese durch etwas anderes ersetzen. I.e: 

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

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, die ungültige Zeichen aus Dateinamen entfernt:

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());
18
ThiagoPXP

Dies kann unter anderem zu diesem Fehler führen:

Sie können keine bestimmten Zeichen in der vollständigen PathFile-Zeichenfolge enthalten.

Zum Beispiel stürzen diese Zeichen die StreamWriter-Funktion ab:

"/"  
":"

möglicherweise gibt es auch andere Sonderzeichen, die zum Absturz führen .. Ich habe festgestellt, dass dies passiert, wenn Sie beispielsweise versuchen, einen DateTime-Stempel in einen Dateinamen zu setzen:

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 günstige Zeichen 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.

Ich hoffe, das erspart jemandem Kopfschmerzen ...!

7
Michael Herman

Für mich war das Problem ein für das menschliche Auge unsichtbares Zeichen "‪"Left-To-Right-Embedding .
Es blieb am Anfang des Strings (kurz vor dem 'D') hängen, nachdem ich den Pfad auf der Registerkarte "Sicherheit" der Windows-Dateieigenschaften kopiert 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 Linien unterscheiden sich tatsächlich.

3
Oleg Grishko

Versuchen Sie, Folgendes zu ändern:

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

zu

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

2
JimSTAT

Wenn Sie diesen Fehler in PowerShell erhalten, liegt dies höchstwahrscheinlich daran, dass Sie Resolve-Path verwenden, um einen Remote-Pfad aufzulösen, z.

 Resolve-Path \\server\share\path

In diesem Fall gibt Resolve-Path ein Objekt zurück, das bei Umwandlung in einen String keinen gültigen Pfad zurückgibt. Es gibt den internen Pfad der PowerShell zurück:

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

Die Lösung besteht darin, die ProviderPath-Eigenschaft für das von Resolve-Path zurückgegebene Objekt zu verwenden:

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

Dies war mein Problem, das jemandem 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 er nicht richtig formatiert wurde. Richtig für mich war ganz einfach:

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

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

1
Kurru

Ich verwende den (eingeschränkten) Ausdrucks-Generator 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, um den Fehler zu stoppen: @ [User :: LocalFile] + "-" + REPLACE ((DT_STR, 30, 1252) GETDATE (), ":", "- ") +. xml

0
Adam Noël

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.

0
Chris Bordeman