“El formato de la ruta dada no es compatible”.

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 tener acceso completo a todos y es la ruta real a la carpeta.

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

¿Qué está mal con esta cadena?

En lugar de utilizar str_uploadpath + fileName , intente utilizar System.IO.Path.Combine lugar:

 Path.Combine(str_uploadpath, fileName); 

que devuelve una cadena.

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

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

Si está intentando guardar un archivo en el sistema de archivos. Path.Combine no es a prueba de balas ya que no lo 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()); 

Entre otras cosas que pueden causar este error:

No puede tener ciertos caracteres en la cadena completa PathFile.

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

 "/" ":" 

puede haber otros personajes especiales que también lo bloqueen. Descubrí que esto sucede cuando intentas, por ejemplo, poner un sello DateTime 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 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 …!

Intenta cambiar:

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

a

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

Si obtiene este error en PowerShell, lo más probable es que esté utilizando Resolve-Path para resolver una ruta remota, por ej.

  Resolve-Path \\server\share\path 

En este caso, Resolve-Path devuelve 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 propiedad ProviderPath 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 

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

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

Decidí el problema al enviar mi ruta a un archivo de registro y al encontrar que no formateaba correctamente. Correcto para mí fue simplemente:

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

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