122 votes

"Le format du chemin donné n'est pas pris en charge."

J'ai le code suivant dans 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 posé par ce message d'erreur de la ligne 2 du code.

Le format du chemin donné n'est pas pris en charge.

La permission sur le dossier est définie comme un accès complet pour tous et il s'agit du chemin d'accès réel au dossier.

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

Qu'est-ce qui ne va pas avec cette corde ?

0 votes

Quelle est la valeur de fileName ?

0 votes

On dirait que fileName est vide.

0 votes

Justin, tu avais raison. La valeur du nom de fichier avait C:/ dans le nom. C'est ce qui m'a tué. Merci.

140voto

Desolator Points 3765

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

Path.Combine(str_uploadpath, fileName);

qui renvoie une chaîne de caractères.

0 votes

Une erreur s'est produite : Error 4 A using namespace directive can only be applied to namespaces ; 'System.IO.Path' is a type not a namespace.

2 votes

Tous les blonds ont mis using System.IO; ci-dessus, puis effacer str_uploadpath + fileName et écrire Path.Combine(str_uploadpath, fileName)

0 votes

Le code ressemble maintenant à ce qui suit, même erreur : Le format du chemin donné n'est pas pris en charge. string str_uploadpath = Server.MapPath(@"/UploadBucket/Raw/") ; str_uploadpath = Path.Combine(str_uploadpath, fileName) ; FileStream objfilestream = new FileStream(str_uploadpath, FileMode.Create, FileAccess.ReadWrite) ;

64voto

Je vois que l'auteur a découvert que l'erreur se produisait en essayant d'enregistrer le nom de fichier avec un chemin entier. 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 tampon de date dans votre nom de fichier), assurez-vous de les remplacer par autre chose. Par exemple :

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

4 votes

Cela a corrigé un problème que j'avais avec mon nom de fichier. J'ajoute la date et l'heure actuelles à mon fichier et les valeurs " :" provoquaient l'erreur référencée par OP dans mon programme.

1 votes

Cela se fait souvent en utilisant Path.GetInvalidPathChars mais pas Path.GetInvalidFileNameChars comme ce fut le cas pour moi.

6 votes

Merci ! C'est pourquoi poster des réponses multiples est toujours une bonne idée.

9voto

Michael Herman Points 1

Parmi les autres choses qui peuvent causer cette erreur :

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

Par exemple, ces caractères feront planter 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, d'insérer une date et une heure 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 est de remplacer les caractères problématiques 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 à quelqu'un des maux de tête... !

0 votes

Ah, merci ! Je sauvegardais un fichier avec une chaîne de date ISO dans le nom, mais qui contient le " :" illégal ! Merci !

2voto

JimSTAT Points 457

Essayez de changer :

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

à

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

0 votes

Les URL comportent généralement des barres obliques et MapPath est assez intelligent pour comprendre de toute façon.

0 votes

@spender Il y a un @ au début de la chaîne de caractères qui les échappe.

1voto

Kurru Points 6746

Est-ce que l'utilisation du Path.Combine aide sur la méthode ? C'est une méthode plus sûre pour joindre les chemins de fichiers. Il est possible qu'il ait des problèmes pour joindre les chemins ensemble.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X