Hola a tod@s !!!
El otro día me tope con un error a la hora de guardar un fichero en un directorio en el que en principio si debería tener acceso, ya que es el directorio de la aplicación.
Estaba intentando guardar el archivo de esta manera:
Esta instrucción crea en el directorio de la aplicación en una carpeta llamada TEMP un archivo temporal por la numeración que tiene tipo a 1248632552_1248632552.tmp, pero puede dar error por la siguientes causas:
Tras Devolver la ruta ya podemos guardar el fichero en el directorio.
Me imagino que no todo el mundo va a tener exactamente el mismo problema que yo pero si es probable que parte de la función le sirva para solucionar el problema.
Sí tenéis alguna problema para implementarlo o dudas, poneros en contacto conmigo dejando algún comentario o enviándome un mail.
Un saludo a tod@s.
El otro día me tope con un error a la hora de guardar un fichero en un directorio en el que en principio si debería tener acceso, ya que es el directorio de la aplicación.
Estaba intentando guardar el archivo de esta manera:
Dim numAleatorio As New Random(CInt(Date.Now.Ticks And Integer.MaxValue))
ficheroTemporal = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) & "\TEMP\" & _
System.Convert.ToString(numAleatorio.Next) & "_" & _
System.Convert.ToString(numAleatorio.Next) & ".tmp"
Dim fs As IO.FileStream
fs = New IO.FileStream(ficheroTemporal, IO.FileMode.Append)
Esta instrucción crea en el directorio de la aplicación en una carpeta llamada TEMP un archivo temporal por la numeración que tiene tipo a 1248632552_1248632552.tmp, pero puede dar error por la siguientes causas:
- Porque no se tenga permisos en el directorio
- Porque no exista el directorio TEMP
- O por la menos probable, que ya exista el fichero y este por ejemplo en modo "solo lectura"
La solución que se me ocurrió, fue tirando del directorio TEMP del usuario de windows que para mi lo solucionaba todo. Cree la siguiente función, que comprueba el directorio y si no pudiese tener acceso para grabar devolverá el directorio de TEMP de windows.
Private Function CompruebaYCreaDirectorio(ByVal rutaFic As String) As String
Dim fich As New System.IO.FileInfo(rutaFic)
Dim RutaAux As String = String.Empty
Dim HayError As Boolean = False
Try
'Descomponemos la ruta y vamos comprobando que existan las carpetas
For Each carpeta As String In fich.DirectoryName.Split(System.IO.Path.DirectorySeparatorChar)
RutaAux = RutaAux & carpeta & System.IO.Path.DirectorySeparatorChar
'Si no existen las partes se crean
If Not System.IO.Directory.Exists(RutaAux) Then
System.IO.Directory.CreateDirectory(RutaAux)
End If
Next
'Tras el bucle, comprobar que exista el directorio donde queremos grabar el fichero
If Not System.IO.Directory.Exists(fich.DirectoryName) Then HayError = True
'Comprobamos permisos en el Directorio
Dim ListaPermisos As System.Security.AccessControl.AuthorizationRuleCollection
ListaPermisos = System.IO.Directory.GetAccessControl(RutaAux).GetAccessRules(True, True, GetType(System.Security.Principal.NTAccount))
'Obtenemos la colección de permisos del directorio, para el usuario Actual "NTAccount"
For Each Permiso As System.Security.AccessControl.FileSystemAccessRule In ListaPermisos
If Permiso.AccessControlType = Security.AccessControl.AccessControlType.Deny Then
HayError = True
Exit For
End If
Next
Catch ex As Exception
HayError = True
End Try
If HayError Then
'Si hubo errores en la creación de los directorios, devolvemos el temporal.
Dim numAleatorio As New Random(CInt(Date.Now.Ticks And Integer.MaxValue))
rutaFic = System.IO.Path.GetDirectoryName(System.IO.Path.GetTempPath) & System.IO.Path.DirectorySeparatorChar & _
System.Convert.ToString(numAleatorio.Next) & "_" & _
System.Convert.ToString(numAleatorio.Next) & ".tmp"
Else
'Volvemos a intentar Crear el Fichero, el cual ya nos debería permitir crear
'Si no nos deja, crearemos uno en el directorio temporal de Windows.
Dim fs As IO.FileStream
Try
fs = New IO.FileStream(rutaFic, IO.FileMode.Append)
fs.Close()
fs.Dispose()
Catch ex As Exception
'si vuelve a fallar la escritura es que no tiene permisos para crear archivos
'Devolveremos el archivo temporal de windows
Dim numAleatorio As New Random(CInt(Date.Now.Ticks And Integer.MaxValue))
rutaFic = System.IO.Path.GetDirectoryName(System.IO.Path.GetTempPath) & System.IO.Path.DirectorySeparatorChar & _
System.Convert.ToString(numAleatorio.Next) & "_" & _
System.Convert.ToString(numAleatorio.Next) & ".tmp"
Finally
fs = Nothing
End Try
End If
Return rutaFic
End Function
Tras Devolver la ruta ya podemos guardar el fichero en el directorio.
Me imagino que no todo el mundo va a tener exactamente el mismo problema que yo pero si es probable que parte de la función le sirva para solucionar el problema.
Sí tenéis alguna problema para implementarlo o dudas, poneros en contacto conmigo dejando algún comentario o enviándome un mail.
Un saludo a tod@s.
Comentarios
Publicar un comentario