Hola,
Si han cambiado bastante y por lo mismo a veces he tenido problemas con muchas funciones y he tenido que crear una especie de framework en un bas para compatibilizar funciones con xp y 7 como por ejemplo:
Public Function Is_Dir(Ruta As String) As Boolean
On Error GoTo error
' El atributo en Windows XP es
' 16: Archivo normal
' 22: Unidad de almacenamiento
' El atributo en Windows 7 es
' 17: Archivo normal
' 65558: Unidad de almacenamiento
If _
GetAttr(Ruta) = 16 Or _
GetAttr(Ruta) = 17 Or _
GetAttr(Ruta) = 22 Or _
GetAttr(Ruta) = 65558 _
Then
Is_Dir = True
Else
Is_Dir = False
End If
Exit Function
error:
Is_Dir = False
End Function
Ahora anda a saber que valores tendrán en windows 8.
OSO OSO MENTIROSO
lo que te retorna GetAttr() y GetFileAttributes function() es lo mismo, un LONG donde albergan los atributos y para consultar dichos atributos debes hacer mascaras de bits...
UN LONG PUEDE ALBERGAR 32 ESTADOS O FLAGS y COMO ES LOGICO CONBINARLOS ENTRE SI PARA OBTENER NUEVOS ESTADOS ( hablo de un long de 32 bits... en uno de 64 puede meter 64 estados/flags y es la misma marrana solo que en otro cochinero ).
17 = FILE_ATTRIBUTE_DIRECTORY or FILE_ATTRIBUTE_READONLY
17 = 16 or 1
es decir un directorio sera FILE_ATTRIBUTE_DIRECTORY... y como es logico un directorio solo se lee... no se escribe... es por ello que es 17 ( FILE_ATTRIBUTE_DIRECTORY or FILE_ATTRIBUTE_READONLY ) un gran acierto para W$ 7...
En si lo que debes hacer CORRECTAMENTE es esto para verificar si es una carpeta (Ignorando cualquier otro atributo):
Public Function exitsPath(ByRef sRuta As String) As Boolean
On Error Resume Next
exitsPath = GetAttr(sRuta)
Err.Clear
End Function
Public Function isDir(ByRef sRuta As String) As Boolean '// Funciona en cualquier W$
If (exitsPath(sRuta)) Then
isDir = ((GetAttr(sRuta) And vbDirectory) = vbDirectory)
End If
End Function
Revisa ATENTAMENTE cada valor de las CONSTANTES y veras que CADA VALOR es un bit de un long DISTINTO... en la MSDN lo dice claramente...
Es por ello que con SetAttr() puedes pasarle combinaciones de attributos a un archivo y ademas de que ya tiene por deault el atributo de FILE_ATTRIBUTE_ARCHIVE le puedo setear tambien FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_READONLY y FILE_ATTRIBUTE_HIDDEN
de esta manera:
SetAttr sRuta, FILE_ATTRIBUTE_ARCHIVE or FILE_ATTRIBUTE_SYSTEM or FILE_ATTRIBUTE_READONLY or FILE_ATTRIBUTE_HIDDEN
y GetAttr() me RETORNARA ESAS CONSTENTES EN UN SOLO valor tipo LONG y PARA COLSULTARLAS SOLO TENGO QUE APLICAR MASCARAS como ya lo he dicho anterior mente...
un ejemplo (Puedes cambiar la ruta por una carpeta o lo que quieras funciona de la misma manera):
Private Sub Form_Load()
Dim sRuta As String
sRuta = "c:\file.txt"
MsgBox IIf(((GetAttr(sRuta) And FILE_ATTRIBUTE_HIDDEN) = FILE_ATTRIBUTE_HIDDEN), "Es un archivo visible", "Es una rchivo Oculto")
SetAttr sRuta, (GetAttr(sRuta) Or FILE_ATTRIBUTE_HIDDEN) ' // Le dejamos los atributos que ya tenia pero le agregamos el atributo oculto.
MsgBox IIf(((GetAttr(sRuta) And FILE_ATTRIBUTE_HIDDEN) = FILE_ATTRIBUTE_HIDDEN), "Es un archivo visible", "Es una rchivo Oculto")
SetAttr sRuta, (GetAttr(sRuta) Xor FILE_ATTRIBUTE_HIDDEN) ' // Le dejamos los atributos que ya tenia pero le quitamos el atributo oculto.
End Sub
y es los mismo que
Private Sub Form_Load()
Dim sRuta As String
sRuta = "c:\file.txt"
MsgBox IIf(((GetFileAttributes(sRuta) And vbHidden) = FILE_ATTRIBUTE_HIDDEN), "Es un archivo visible", "Es una rchivo Oculto")
SetFileAttributes functionsRuta, (GetFileAttributes(sRuta) Or FILE_ATTRIBUTE_HIDDEN) ' // Le dejamos los atributos que ya tenia pero le agregamos el atributo oculto.
MsgBox IIf(((GetFileAttributes(sRuta) And vbHidden) = FILE_ATTRIBUTE_HIDDEN), "Es un archivo visible", "Es una rchivo Oculto")
SetFileAttributes sRuta, (GetFileAttributes(sRuta) Xor FILE_ATTRIBUTE_HIDDEN) ' // Le dejamos los atributos que ya tenia pero le quitamos el atributo oculto.
End Sub
y como es de esperarse FUnCIONA EN WIN XP, VISTA; 7 y FUNCIONARA EN W$ 8 (y si no me cotro un webo).
Un dato Or de VB6 no maneja un Or de sentencia... es un OR de Operacion BINARIA... es decir el resultado que retorne uno se le hace una operacion binaria a nivel bit por ende TODA la premisa es evaluada aun que solo ya haya salido alguna verdadera... en pocas palabras NO es el or normal (como en C)... es un or de operaciones binarias...
Mirate esto...
http://foro.elhacker.net/programacion_visual_basic/vb6_es_tonto-t340559.0.html;msg1669513#msg1669513Como dije solo se HAN AGREGADO no he visto ninguna constante DOCUMENTADA que se haya cambiado... aun asi No importa ya te di una solucion a un problema que ignorabas!¡.
---------------------------
Lo de la Escalabilidad esta a discucion y nunca llegaremos a un acuerdo o tu que crees?, sea VB6, C/C++, Cobol (No hay muchos programadores de este lenguaje... y aun asi es usado), Foltran, etc... cada uno tiene PROS y CONTRAS.
Dulces Lunas!¡.