Ir al contenido principal

Gestionar los permisos de directorio con vb.net

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:

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

Entradas populares de este blog

Backup MySql servidor compartido

Buenas a tod@s !!! Hoy se me a ocurrido dejaros este post sobre como hacer copias de seguridad de nuestras bases de datos de MySql en servidores en la nube como por ejemplo 1and1. Esta función estará metida en un fichero SH que ejecutaremos con una tarea CRON en nuestro servidor linux. Tener en cuenta que tenéis que tener permisos para ejecutar SSH, estos permisos solo se suelen dar en los contratos mas avanzados de los servidores compartidos. #!/bin/bash # ## ------ VARIABLES DE CONFIGURACION ----##

Maquetando con html5 y css3

Hola a tod@s, Ya hace mucho tiempo que no publicaba nada. Hoy realizando limpieza en mi maquina me he encontrado con mi primer diseño html5 responsive, os dejo el ejemplo de código tanto del archivo HTML5 como de las buenas practicas en CSS3. Archivo HTML <!DOCTYPE html> <html lang="es">   <head>     <title>Mi primera p&aacute;gina en HTML5</title>     <meta charset="utf-8" /> <!-- Establecemos la codificación -->     <meta description="Aqui va la descripcion del sitio" />     <!-- MEDIA tipo de dispositivo all para todos mobiles y PCs-->     <link rel="stylesheet" type="text/css" href="css/estilos.css">   </head>   <body>     <h1>Bienvenidos a 3etrade</h1>     < !-- CABECERA -->       <header>          &lt;header&gt;       </header>