"El formato de la ruta dada no es compatible".

103

Tengo el siguiente código en mi servicio web:

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

¿Alguien puede ayudarme a resolver el problema con este mensaje de error de la línea 2 del código?

El formato de la ruta dada no es compatible.

El permiso en la carpeta está configurado para acceso completo para todos y es la ruta real a la carpeta.

El punto de interrupción me dio el valor de str_uploadpathas C:\\webprojects\\webservices\\UploadBucket\\Raw\\.

¿Qué le pasa a esta cadena?

Todo rubio
fuente
¿Cuál es el valor de fileName?
Justin
Suena como si estuviera fileNamevacío.
Jeremy McGee
Justin, tenías razón. El valor del nombre de archivo tenía C: / en el nombre. Eso es lo que me estaba matando. Gracias.
All Blond

Respuestas:

125

En lugar de usar str_uploadpath + fileName, intente usar en su System.IO.Path.Combinelugar:

Path.Combine(str_uploadpath, fileName);

que devuelve una cadena.

Justin
fuente
Recibí un error ahora: Error 4 Una directiva de uso de espacio de nombres solo se puede aplicar a espacios de nombres; 'System.IO.Path' es un tipo, no un espacio de nombres
All Blond
2
@All Blond poner using System.IO;arriba, luego borrar str_uploadpath + fileNamey escribirPath.Combine(str_uploadpath, fileName)
el código se ve como el siguiente ahora, el mismo error: el formato de la ruta dada no es compatible. string str_uploadpath = Server.MapPath (@ "/ UploadBucket / Raw /"); str_uploadpath = Path.Combine (str_uploadpath, fileName); FileStream objfilestream = nuevo FileStream (str_uploadpath, FileMode.Create, FileAccess.ReadWrite);
All Blond
1
@Todos intentan depurar su código. Coloque un punto de interrupción en la línea exactamente antes de la línea que causa el error (F9 en Visual Studio). Ejecute su programa. Cuando el programa se detenga en el punto de interrupción, coloque el mouse sobre la variable str_uploadpath. Cual es su valor?
1
Obtengo una ruta no admitida en la siguiente ruta, ¿por qué? "C: \ Users \ Admin \ AppData \ Local \ Adobe \ Flash CS6 \ en_US \ Configuration \ CodeModel \ cm-cache \ SwcCache \ basemovie3.swc1272273593 \ library.swf" Si lo pego en el explorador, se abre bien, pero. El método System.IO.File.ReadAllBytes de NET arroja ese error. Ciertamente es una ruta válida y precisa, entonces, ¿por qué el error?
Triynko
51

Veo que el creador descubrió que el error ocurrió al intentar guardar el nombre del archivo con una ruta completa. En realidad, es suficiente tener un ":"nombre de archivo para obtener este error. Si puede haber ":"en el nombre de su archivo (por ejemplo, si tiene un sello de fecha en el nombre de su archivo), asegúrese de reemplazarlo por otro. Es decir:

string fullFileName = fileName.Split('.')[0] + "(" + DateTime.Now.ToString().Replace(':', '-') + ")." + fileName.Split('.')[1];
Daniel Hedenström
fuente
2
Esto solucionó un problema que tenía con mi nombre de archivo. Estoy agregando la fecha y hora actuales a mi archivo y los valores ":" estaban causando que mi programa arrojara el error OP al que se hace referencia.
acedanger
1
Esto sucede a menudo al usar Path.GetInvalidPathCharspero no Path.GetInvalidFileNameChars, como fue mi caso.
Seph
4
¡Gracias! Por eso, publicar varias respuestas siempre es una buena idea.
Nick
31

Para mí, el problema era un personaje "‪" incrustado de izquierda a derecha invisible para el ojo humano .
Se atascó al principio de la cadena (justo antes de la 'D'), después de copiar y pegar la ruta, desde la pestaña de seguridad de las propiedades del archivo de Windows.

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

Entonces esas, idénticas a primera vista, dos líneas son en realidad diferentes.

Oleg Grishko
fuente
21

Si está intentando guardar un archivo en el sistema de archivos. Path.Combine no es a prueba de balas, ya que no le ayudará si el nombre del archivo contiene caracteres no válidos. Aquí hay un método de extensión que elimina los caracteres no válidos de los nombres de archivo:

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

Y el uso puede ser:

Path.Combine(str_uploadpath, fileName.ToSafeFileName());
ThiagoPXP
fuente
O incluso más cortoreturn string.Concat(s.Split(Path.GetInvalidFileNameChars()));
Yousha Aleayoub
7

Entre otras cosas que pueden provocar este error:

No puede tener ciertos caracteres en la cadena PathFile completa.

Por ejemplo, estos caracteres bloquearán la función StreamWriter:

"/"  
":"

puede haber otros caracteres especiales que también lo bloqueen. Descubrí que esto sucede cuando intenta, por ejemplo, poner un sello de fecha y hora en un nombre de archivo:

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

Una forma de evitar este problema es reemplazar los caracteres problemáticos en NewFileOutS por otros benignos:

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

¡Espero que esto le ahorre a alguien algunos dolores de cabeza ...!

Michael Herman
fuente
¡Ah gracias! Estaba guardando un archivo con una cadena de fecha ISO en el nombre, ¡pero que contiene el ":" ilegal! ¡Gracias!
Mason
3

Si recibe este error en PowerShell, lo más probable es que esté utilizando Resolve-Pathpara resolver una ruta remota, por ejemplo

 Resolve-Path \\server\share\path

En este caso, Resolve-Pathdevuelve un objeto que, cuando se convierte en una cadena, no devuelve una ruta válida. Devuelve la ruta interna de PowerShell:

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

La solución es usar la ProviderPathpropiedad en el objeto devuelto por 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
fuente
2

Intente cambiar:

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

a

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

JimSTAT
fuente
Las URL generalmente tienen barras diagonales y MapPathson lo suficientemente inteligentes como para averiguarlo de cualquier manera.
Justin
@spender Hay un @en la parte delantera de la cadena que escapa a esos.
Justin
2

Este fue mi problema, que puede ayudar a otra persona, aunque no fue el problema del OP:

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

Determiné el problema generando mi ruta a un archivo de registro y descubrí que no se formatea correctamente. Lo correcto para mí fue bastante simple:

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

¿ Ayuda el uso del método Path.Combine ? Es una forma más segura de unir rutas de archivos. Podría ser que tenga problemas para unir los caminos

Kurru
fuente
0

Estoy usando el generador de expresiones (limitado) para una variable para usar en una tarea simple del sistema de archivos para hacer un archivo de un archivo en SSIS.

Este es mi truco rápido y sucio para eliminar los dos puntos y detener el error: @ [User :: LocalFile] + "-" + REPLACE ((DT_STR, 30, 1252) GETDATE (), ":", "-") + ".xml"

Adam Noël
fuente
0

Tuve el mismo problema hoy. El archivo que intentaba cargar en mi código estaba abierto para editarlo en Excel. Después de cerrar Excel, ¡el código comenzó a funcionar!

Ryano
fuente
-1

Si el valor es una URL de archivo como file: // C: / lo que sea, use la clase Uri para traducir a un nombre de archivo normal:

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

En general, el uso de la API proporcionada es la mejor práctica.

Chris Bordeman
fuente