c# ajax - "Das Format des angegebenen Pfades wird nicht unterstützt."




file upload (8)

Funktioniert die Verwendung der Path.Combine Methode? Es ist ein sicherer Weg, um Dateipfade zusammenzufügen. Es könnte sein, dass es Probleme hat, die Pfade zusammen zu verbinden

Ich habe den folgenden Code in meinem Web-Service:

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

Kann jemand mir 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 den vollen Zugriff für alle Personen festgelegt und der tatsächliche Pfad zum Ordner.

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

Was ist falsch an dieser Zeichenfolge?


Das 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 in eine Protokolldatei ausgegeben und festgestellt habe, dass er nicht korrekt formatiert ist. Richtig für mich war ganz einfach:

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

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

Versuche es zu ändern:

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

zu

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


Wenn Sie diesen Fehler in PowerShell erhalten, liegt das wahrscheinlich daran, dass Sie Resolve-Path , um einen Remote Resolve-Path aufzulösen, z

 Resolve-Path \\server\share\path

In diesem Fall gibt Resolve-Path ein Objekt zurück, das bei der Umwandlung in eine Zeichenfolge keinen gültigen Resolve-Path 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 ProviderPath Eigenschaft für das von Resolve-Path Objekt zu verwenden:

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

Unter anderem kann dieser Fehler verursacht werden:

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

Diese Zeichen führen zum Beispiel zum Absturz der StreamWriter-Funktion:

"/"  
":"

Es kann auch andere Sonderzeichen geben, die es abstürzen lassen. 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, fehlerhafte Zeichen 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 Kopfschmerzen ...!


Ich sehe, dass der Absender herausgefunden hat, dass der Fehler beim Speichern des Dateinamens mit einem vollständigen Pfad aufgetreten ist. Eigentlich ist es genug, ein ":" im Dateinamen zu haben, um diesen Fehler zu bekommen. Wenn Ihr Dateiname ":" enthält (wenn Sie beispielsweise einen Datumsstempel in Ihrem Dateinamen haben), ersetzen Sie diese durch etwas anderes. Dh:

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

Ich kenne die Details nicht, aber es klingt, als ob Sie versuchen würden, Integrationstests statt Einheitstests durchzuführen . Wenn Sie die Abhängigkeit von ServiceHost isolieren könnten, würde dies Ihre Tests wahrscheinlich einfacher (und schneller) machen. So können Sie zum Beispiel Folgendes unabhängig testen:

  • Konfigurationsleseklasse
  • ServiceHost Factory (ggf. als Integrationstest)
  • Engine-Klasse, die eine IServiceHostFactory und eine IConfiguration

Zu den Tools, die hilfreich sein könnten, gehören Isolations-Frameworks (optional) und (optional) IoC-Container-Frameworks. Sehen:





c# .net webforms upload stream