web-dev-qa-db-fra.com

"Le format du chemin donné n'est pas supporté."

J'ai le code suivant sur mon service web:

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

Quelqu'un peut-il m'aider à résoudre le problème avec ce message d'erreur de la ligne 2 du code.

Le format du chemin donné n'est pas supporté.

L'autorisation sur le dossier est définie sur un accès complet à tout le monde et constitue le chemin d'accès réel au dossier.

Le point d'arrêt m'a donné la valeur de str_uploadpath en tant que C:\\webprojects\\webservices\\UploadBucket\\Raw\\.

Quel est le problème avec cette chaîne?

85
All Blond

Plutôt que d'utiliser str_uploadpath + fileName, essayez d'utiliser System.IO.Path.Combine à la place:

Path.Combine(str_uploadpath, fileName);

qui retourne une chaîne.

104
user586399

Je vois que l'initiateur a découvert que l'erreur s'était produite lors de la tentative d'enregistrement du nom de fichier avec un chemin d'accès complet. En fait, il suffit d'avoir un ":" dans le nom du fichier pour obtenir cette erreur. S'il peut y avoir ":" dans votre nom de fichier (par exemple si vous avez un horodatage dans votre nom de fichier), assurez-vous de les remplacer par autre chose. C'est à dire: 

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

Si vous essayez d’enregistrer un fichier dans le système de fichiers. Path.Combine n'est pas à l'épreuve des balles car il ne vous aidera pas si le nom du fichier contient des caractères non valides. Voici une méthode d'extension qui supprime les caractères non valides des noms de fichiers:

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

Et l'utilisation peut être:

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

Parmi d'autres choses qui peuvent causer cette erreur:

Vous ne pouvez pas avoir certains caractères dans la chaîne complète PathFile.

Par exemple, ces caractères planteront la fonction StreamWriter:

"/"  
":"

il peut y avoir d'autres caractères spéciaux qui le font planter aussi ..__J'ai constaté que cela se produit lorsque vous essayez, par exemple, de mettre un tampon DateTime dans un nom de fichier:

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

Une façon d'éviter ce problème consiste à remplacer les caractères posant problème dans NewFileOutS par des caractères bénins:

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

J'espère que cela évitera des maux de tête à quelqu'un ...!

7
Michael Herman

Pour moi, le problème était invisible pour l’œil humain. "‪"Enrobage de gauche à droite caractère.
Il est bloqué au début de la chaîne (juste avant le «D»), après avoir copié-collé le chemin, dans l'onglet Sécurité des propriétés du fichier Windows.

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

Donc, ces lignes, identiques au premier abord, sont en réalité différentes.

3
Oleg Grishko

Essayez de changer:

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

à

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

2
JimSTAT

Si vous obtenez cette erreur dans PowerShell, c'est probablement parce que vous utilisez Resolve-Path pour résoudre un chemin distant, par exemple.

 Resolve-Path \\server\share\path

Dans ce cas, Resolve-Path renvoie un objet qui, une fois converti en chaîne, ne renvoie pas un chemin d'accès valide. Il retourne le chemin interne de PowerShell:

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

La solution consiste à utiliser la propriété ProviderPath sur l'objet renvoyé par Resolve-Path:

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

C'était mon problème, ce qui peut aider quelqu'un d'autre - bien que ce ne soit pas le problème du PO:

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

J'ai déterminé le problème en indiquant mon chemin d'accès dans un fichier journal et en constatant qu'il ne formatait pas correctement. Correct pour moi était tout simplement:

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

Est-ce que l’utilisation de la méthode Path.Combine vous aide? C'est un moyen plus sûr de joindre des chemins de fichiers. Il se peut que ça ait du mal à joindre les chemins ensemble

1
Kurru

J'utilise le générateur d'expression (limité) pour une variable à utiliser dans une tâche de système de fichiers simple afin de créer une archive d'un fichier dans SSIS.

Ceci est mon hack rapide et sale pour supprimer les deux points pour arrêter l'erreur: @ [User :: LocalFile] + "-" + REPLACE ((DT_STR, 30, 1252) GETDATE (), ":", "- ") +" .xml "

0
Adam Noël