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

103

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 avec ce message d'erreur de la ligne 2 du code.

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

L'autorisation sur le dossier est définie pour un accès complet à tout le monde 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_uploadpathas C:\\webprojects\\webservices\\UploadBucket\\Raw\\.

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

Tout blond
la source
Quelle est la valeur de fileName?
Justin le
On dirait qu'il fileNameest vide.
Jeremy McGee
Justin, tu avais raison. La valeur du nom de fichier avait C: / dans le nom. C'est ce qui me tuait. Merci.
All Blond

Réponses:

125

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

Path.Combine(str_uploadpath, fileName);

qui renvoie une chaîne.

Justin
la source
Vous avez une erreur maintenant: Erreur 4 Une directive using namespace ne peut être appliquée qu'aux espaces de noms; 'System.IO.Path' est un type pas un espace de noms
All Blond
2
@All Blond mis using System.IO;ci-dessus, puis effacez str_uploadpath + fileNameet écrivezPath.Combine(str_uploadpath, fileName)
le code ressemble à ci-dessous maintenant, 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 = nouveau FileStream (str_uploadpath, FileMode.Create, FileAccess.ReadWrite);
All Blond
1
@Tous essayons de déboguer votre code. Placez un point d'arrêt sur la ligne juste avant la ligne qui provoque l'erreur (F9 dans Visual Studio). Exécutez votre programme. Lorsque le programme s'arrête sur le point d'arrêt, passez la souris sur la variable str_uploadpath. Quelle est sa valeur?
1
Je reçois un chemin non pris en charge sur le chemin suivant, pourquoi? "C: \ Users \ Admin \ AppData \ Local \ Adobe \ Flash CS6 \ en_US \ Configuration \ CodeModel \ cm-cache \ SwcCache \ basemovie3.swc1272273593 \ library.swf" Si je le colle dans l'explorateur, il s'ouvre bien, mais. La méthode System.IO.File.ReadAllBytes de NET lève cette erreur. C'est certainement un chemin valide et précis, alors pourquoi l'erreur?
Triynko
51

Je vois que l'expéditeur a découvert que l'erreur s'est produite lors de la tentative de sauvegarde du nom de fichier avec un chemin complet. En fait, il suffit d'avoir un ":"dans le nom du fichier pour obtenir cette erreur. S'il y en a ":"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];
Daniel Hedenström
la source
2
Cela a résolu 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 le déclenchement par mon programme de l'erreur OP référencée.
acedanger
1
Cela arrive souvent en utilisant Path.GetInvalidPathCharsmais pas Path.GetInvalidFileNameChars, comme ce fut le cas pour moi.
Seph
4
Je vous remercie! C'est pourquoi publier plusieurs réponses est toujours une bonne idée.
Nick
31

Pour moi, le problème était un personnage invisible de "‪" gauche à droite .
Il est resté au début de la chaîne (juste avant le 'D'), après avoir copié-collé le chemin, à partir de l'onglet de 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 celles-ci, identiques à première vue, deux lignes sont en fait différentes.

Oleg Grishko
la source
21

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());
ThiagoPXP
la source
Ou encore plus courtreturn string.Concat(s.Split(Path.GetInvalidFileNameChars()));
Yousha Aleayoub
7

Entre autres choses qui peuvent provoquer cette erreur:

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

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

"/"  
":"

il peut y avoir d'autres caractères spéciaux qui le plantent aussi. J'ai trouvé 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 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 ...!

Michael Herman
la source
Ah merci! J'enregistrais un fichier avec une chaîne de date ISO dans le nom, mais qui contient le ":" illégal! Merci!
Mason
3

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

 Resolve-Path \\server\share\path

Dans ce cas, Resolve-Pathrenvoie un objet qui, lorsqu'il est converti en chaîne, ne renvoie pas de chemin valide. Il renvoie le chemin interne de PowerShell:

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

La solution est d'utiliser la ProviderPathpropriété 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
Aaron Jensen
la source
2

Essayez de changer:

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

à

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

JimSTAT
la source
Les URL ont généralement des barres obliques et MapPathsont suffisamment intelligentes pour le comprendre de toute façon.
Justin le
@spender Il y a un @au début de la chaîne qui les échappe.
Justin le
2

C'était mon problème, qui peut aider quelqu'un d'autre - même si ce n'était 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 sortant mon chemin vers un fichier journal et en trouvant qu'il ne se formait pas correctement. La bonne chose pour moi était tout simplement:

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

Est-ce que l'utilisation de la méthode Path.Combine aide? C'est un moyen plus sûr de joindre des chemins de fichiers. Il se pourrait qu'il ait des problèmes pour rejoindre les chemins ensemble

Kurru
la source
0

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

C'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"

Adam Noël
la source
0

J'ai eu le même problème aujourd'hui. Le fichier que j'essayais de charger dans mon code était ouvert pour modification dans Excel. Après avoir fermé Excel, le code a commencé à fonctionner!

Ryano
la source
-1

Si la valeur est une URL de fichier comme file: // C: / peu importe, utilisez la classe Uri pour traduire en un nom de fichier normal:

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

En général, l'utilisation de l'API fournie est une bonne pratique.

Chris Bordeman
la source