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
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:
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!
Los discos si se pueden solo hay que chekar el tipo de unidad logica que es
Leandro , estuve buscando un poko, y encontre esto:
Citar
GetFileSecurity Function (http://msdn.microsoft.com/en-us/library/aa379561%28v=VS.85%29.aspx)
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.
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 (http://msdn.microsoft.com/en-us/library/bb762589%28VS.85%29.aspx)
Leandro, me parece que esto es lo que buscas [http://msdn.microsoft.com/en-us/library/aa446639(VS.85).aspx]
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.
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)
(http://r.i.elhacker.net/cache?url=http://a.imageshack.us/img641/6625/imgpic01.jpg)
Dulces Lunas!¡.
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 :
'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
Excelente Karcrack eso es lo que quería, y es bien cortita. muchas gracias
Saludos.