como saber si un directorio puede se modificado.

Iniciado por LeandroA, 5 Agosto 2010, 00:15 AM

0 Miembros y 3 Visitantes están viendo este tema.

LeandroA

Hola una pregunta como se si una carpeta o unidad puede ser escrita, por ejemplo si quisiera crear una carpeta en la unidad de cd no podría o por ejemplo si fuera una cuenta de usuario y quisiera crear una carpeta en un directorio donde no tengo privilegios tampoco podría.

se que puedo usar on error pero cual es la forma correcta?, GetAttr sirve en estos casos?

Saludos

Dznp

Sistema operativo?
Con PHP se puede, si necesitas ayuda avisame.


Ahora que veo CREO que respondí cualquier cosa..  ;D Crei que estaba en la sección de PHP, de igual manera se puede con visual basic, pero no es mi fuerte

Perdon  :silbar:

fary

Segun la msdn se supone qeu si ( http://msdn.microsoft.com/es-es/library/hds568h4%28VS.80%29.aspx ) pero lo que creo qeu no puedes saber es lo de los discos.. las carpetas si.

un salu2!
Un byte a la izquierda.

Angeldj27

Los discos si se pueden solo hay que chekar el tipo de unidad logica que es


"Que vamos a hacer Mañana?..... Lo mismo que hacemos todos los dias Pinky tratar de Conquistar el Mundoooo!!!!!

xkiz ™

Leandro , estuve buscando un poko, y encontre esto:
Citar
GetFileSecurity Function

Descripion: The GetFileSecurity function obtains specified information about the security of a file or directory. The information obtained is constrained by the caller's access rights and privileges.


LeandroA

bueno la verdad no se bien todavía como, pero dejo esto que puede ser interesante para alguien mas,

es parecido al GetAttr pero con más detalles.


Option Explicit

Private Declare Function SHGetFileInfo Lib "shell32.dll" Alias "SHGetFileInfoA" (ByVal pszPath As String, ByVal dwFileAttributes As Long, psfi As SHFILEINFO, ByVal cbFileInfo As Long, ByVal uFlags As Long) As Long

Private Const MAX_PATH As Long = 260

Private Const SHGFI_ATTRIBUTES      As Long = &H800

Private Const DROPEFFECT_COPY As Long = 1
Private Const DROPEFFECT_LINK As Long = 4
Private Const DROPEFFECT_MOVE As Long = 2

'http://msdn.microsoft.com/en-us/library/bb762589%28VS.85%29.aspx
Private Const SFGAO_LINK As Long = &H10000
Private Const SFGAO_BROWSABLE As Long = &H8000000
Private Const SFGAO_CANCOPY As Long = DROPEFFECT_COPY
Private Const SFGAO_CANDELETE As Long = &H20&
Private Const SFGAO_CANLINK As Long = DROPEFFECT_LINK
Private Const SFGAO_CANMONIKER As Long = &H400000
Private Const SFGAO_CANMOVE As Long = DROPEFFECT_MOVE
Private Const SFGAO_CANRENAME As Long = &H10&
Private Const SFGAO_CAPABILITYMASK As Long = &H177&
Private Const SFGAO_COMPRESSED As Long = &H4000000
Private Const SFGAO_CONTENTSMASK As Long = &H80000000
Private Const SFGAO_DISPLAYATTRMASK As Long = &HF0000
Private Const SFGAO_DROPTARGET As Long = &H100&
Private Const SFGAO_FILESYSANCESTOR As Long = &H10000000
Private Const SFGAO_FILESYSTEM As Long = &H40000000
Private Const SFGAO_FOLDER As Long = &H20000000
Private Const SFGAO_GHOSTED As Long = &H80000
Private Const SFGAO_HASPROPSHEET As Long = &H40&
Private Const SFGAO_HASSTORAGE As Long = &H400000
Private Const SFGAO_HASSUBFOLDER As Long = &H80000000
Private Const SFGAO_HIDDEN As Long = &H80000
Private Const SFGAO_ISSLOW As Long = &H4000&
Private Const SFGAO_NEWCONTENT As Long = &H200000
Private Const SFGAO_NONENUMERATED As Long = &H100000
Private Const SFGAO_READONLY As Long = &H40000
Private Const SFGAO_REMOVABLE As Long = &H2000000
Private Const SFGAO_SHARE As Long = &H20000
Private Const SFGAO_STORAGEANCESTOR As Long = &H10000000
Private Const SFGAO_VALIDATE As Long = &H1000000

Private Type SHFILEINFO
    hIcon               As Long
    iIcon               As Long
    dwAttributes        As Long
    szDisplayName       As String * MAX_PATH
    szTypeName          As String * 80
End Type

Public Function GetAttributes(ByVal sPath As String) As Long
    Dim tSHFI As SHFILEINFO
    Call SHGetFileInfo(ByVal sPath, 0, tSHFI, Len(tSHFI), SHGFI_ATTRIBUTES)
    GetAttributes = tSHFI.dwAttributes
End Function

Private Sub Form_Load()
    Dim sPath As String
    Dim hAttr As Long
   
    sPath = "C:\Documents and Settings\All Users\Documentos"
   
    hAttr = GetAttributes(sPath)
   
    If (hAttr And SFGAO_READONLY) = SFGAO_READONLY Then MsgBox "Solo de lectura"
    If (hAttr And SFGAO_CANRENAME) = SFGAO_CANRENAME Then MsgBox "puede renombrarse"
    If (hAttr And SFGAO_HASSUBFOLDER) = SFGAO_HASSUBFOLDER Then MsgBox "tiene subcarpetas"
    If (hAttr And SFGAO_SHARE) = SFGAO_SHARE Then MsgBox "es una carpeta compartida"
End Sub


para mas info http://msdn.microsoft.com/en-us/library/bb762589%28VS.85%29.aspx

cobein

http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.

LeandroA

Hola estuve mirando GetFileSecurity, en esta pagina hay un ejemplo
http://vbcity.com/forums/p/16136/67627.aspx

pero creo que no es 100% certero o apunta a otra cosa, por ejemplo

si paso este path (Unidad de CD) "E:\Foto.jpg"  me dice READ permission is = False
Y "Write permission is " False
lo de escribir esta bien ya que no podria, pero si puedo leer el archivo

Si paso un path comun de la unidad c:\ esta todo bien, tengo permisos de Lectura y Escritura, etc.
pero supongamos que esta abierto en modo exclusivo.

Open "C:\Foto.jpg" For Binary Lock Write As #1

tambien me dice que tengo permiso de Lectura , Escritura y Eleminarlo, pero esto no es asi porque si quiziera abrirlo nuevamente o elminarlo me daria un error.

asi que bueno creo que me voy a tener que volcar a un viejo y querido "On Error GoTo"

Saludos.


BlackZeroX

#8
  La funcion se ejecuta perfectamente, de hecho lo que pasa es que esa api lo que hace realmente es verificar los permisos promiscuos del sistema NTFS(Ignoro otros sistemas de archivos), mas no verifica si actualmente se encuentra bloqueado, Bueno aqui una Captura,

Por cierto funciona al 100%, justamente era lo que andaba buscando (cuenta propia xP)!¡.

Ajusta la seguridad de tu(s) archivo(s) ( en mi caso como soy paranoico con mi seguridad de archivos tengo bloqueado la eliminacion de archivos xP)



Dulces Lunas!¡.
The Dark Shadow is my passion.

Karcrack

La forma mas sencilla de comprobarlo es intentandolo... >:D
Es decir que con CreateFile podrias intentar abrir el fichero con los FLAGS que quieras comprobar...

He hecho esta pequeña funcion, me encantan las funciones :P :
Código (vb) [Seleccionar]
'KERNEL32
Private Declare Function CloseHandle Lib "KERNEL32" (ByVal hObject As Long) As Long
Private Declare Function CreateFile Lib "KERNEL32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long

Private Const INVALID_HANDLE_VALUE As Long = (-1)
Private Const OPEN_EXISTING As Long = 3
Private Const FILE_FLAG_BACKUP_SEMANTICS As Long = &H2000000
Private Const FILE_SHARE_READ As Long = &H1
Private Const FILE_SHARE_WRITE As Long = &H2

Public Enum AccessType
   GENERIC_READ = &H80000000
   GENERIC_WRITE = &H40000000
   GENERIC_READWRITE = &HC0000000
End Enum

Public Function CheckAccess(ByVal sPath As String, ByVal dwDesiredAccess As AccessType) As Boolean
   Dim lRet        As Long
   
   lRet = CreateFile(sPath, dwDesiredAccess, FILE_SHARE_READ + FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)
   CheckAccess = (lRet <> INVALID_HANDLE_VALUE)
   Call CloseHandle(lRet)
End Function

Private Sub Form_Load()
   Debug.Print CheckAccess("C:\bit.bin", GENERIC_READWRITE), Err.LastDllError
   Debug.Print CheckAccess("F:\", GENERIC_READWRITE), Err.LastDllError
   Debug.Print CheckAccess("C:\", GENERIC_READWRITE), Err.LastDllError
   Debug.Print CheckAccess("F:\", GENERIC_WRITE), Err.LastDllError
   Debug.Print CheckAccess("F:\", GENERIC_READ), Err.LastDllError
End Sub


Funciona a la perfeccion ;D ;D ;D