Cómo utilizar VB para cifrar una carpeta con contraseña
'Este método es adecuado para sistemas WinXP y no ha sido probado en sistemas Win98. Nota: No se puede utilizar para archivos o carpetas del sistema; de lo contrario, provocará la parálisis del sistema.
'Cifrado: Utilice funciones API para agregar los caracteres "..." al final del nombre del archivo o carpeta. \Agregar caracteres "..." al final del nombre del archivo o carpeta. Por ejemplo, cambie el nombre de la carpeta "MiRuta" a "MiRuta...\En "Mi PC", el nombre aparecerá como "MiRuta". El sistema no lo reconocerá y el archivo o carpeta no podrá abrirse, modificarse o eliminarse. El famoso virus de ejecución automática realiza este truco
"Descifrado: elimina los caracteres "..." al final del nombre del archivo o carpeta.
'Copia el siguiente código en la ventana de código del formulario VB
'Controles de ejemplo: Comando1, Comando2, Texto1, todos usan la configuración de propiedades predeterminada
Private Const MAX_PATH = 260
Tipo privado FileTime ' 8 Bytes
LTime As Long
HTime As Long
Tipo final
Tipo privado Win32_Find_Data
dwFileAttributes siempre que
ftCreationTime como FileTime
ftLastAccessTime como FileTime
ftLastWriteTime como hora del archivo
nFileSizeHigh mientras
nFileSizeLow mientras
dwReserved0 mientras
dwReserved1 mientras
cNameFile como cadena * MAX_PATH p >
cAlternate As String * 14
Tipo de finalización
Función de declaración privada MoveFileEx Lib "kernel32" Alias "MoveFileExA" (ByVal lpExistingFileName como cadena, ByVal lpNewFileName como cadena, ByVal dwFlags As Long) As Long
Función de declaración privada GetShortPathName Lib " kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Función de declaración privada FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpNameFile como cadena, lpFindFileData como Win32_Find_Data) siempre que
Función de declaración privada FindFirstFile como cadena, ByVal lpszShortPath como cadena, ByVal cchBuffer Siempre
Privado p>Función de declaración privada FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile Mientras, lpFindFileData Como Win32_Find_Data) Mientras /p>
Funciones de declaración privada
en FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
Private Sub Form_Load()
Text1.Text = "C:\MyPath"
Command1.Caption = "Decrypt": Command2.Caption = "Encrypt"
Me.Caption = "Cifrado y descifrado de directorios o archivos"
End Sub
Subcomando privado1_Click ()
Llamar a SetPathName(False) 'Descifrar
End Sub
Subcomando privado2_Click()
Llamar a SetPathName (Verdadero) 'Cifrado
End Sub
End Sub
Private Sub SetPathName(SetMi As Boolean)
Dim nName As String, NewName como cadena, nSort como cadena, nCap como cadena, dl como largo
nName = Trim (Text1.
If Right(nName, 3) = "... ("Entonces nNombre = Izquierda(nNombre, Len(nNombre) - 3)
Si Derecha(nNombre, 1) = "\" Entonces nNombre = Izquierda(nNombre, Len(nNombre) - 1)
Si SetMi Entonces
NuevoNombre = nNombre amp ".
De lo contrario
NuevoNombre = nNombre
nNombre = nNombre amp; " .
End If
If SetMi Then nCap = "Encrypt" Else nCap = "Decrypt"
nSort = GetShortName(nName) 'Transforma cuál . p>
p>
Si nSort = "" Entonces
MsgBox "Archivo no encontrado:" amp vbCrLf amp; nName, vbCritical, nCap
Salir Sub
Fin si
Si MoveFileEx(nSort, NewName, 0) = 0 Then Exit Sub 'Cambio de nombre de archivo: distinto de cero indica éxito, admite archivos de solo lectura
MsgBox nCap amp; " Éxito: " amp; vbCrLf amp; nName, vbInformation, nCap
End Sub
End Sub p>
Función pública GetShortName( F como cadena, opcional ShortAll como Bo
olean) As String
'Convertir a un nombre de archivo corto, o nulo si el directorio o archivo no existe. Se puede utilizar para determinar si existe un directorio o archivo.
'La función API GetShortPathName no se puede utilizar directamente porque no es compatible con .NET Framework.
'ShortAll=T significa convertir todos los nombres a nombres cortos; de lo contrario, solo se convertirán las líneas de puntos ".\"
Dim FondID As Long, ID1 As Long, S As Long, nPath como cadena
Dim nF como cadena, InfoF como Win32_Find_Data, qF como cadena, hF como cadena
Dim nName como cadena, nName1 como cadena
nF = F
Do
S = InStr(nF, "..\")
Si S = 0 Entonces Salir Do
qF = Izquierda (nF, S 2): hF = Medio(nF, S 3) 'Dividir en adelante y atrás
CutPathName qF, nPath, nName
nName = LCase(nName) p>
qF = nPath amp; "\" amp; "*."
Fondo = FF
FondID = FindFirstFile(qF, InfoF) '-1. significa fracaso.
Buscar todos los archivos (carpetas)
ID1 = FondID
Hacer
Si FondID = Find_Err o ID1 = 0 Entonces vaya a Salir1 'No se encontró ninguna entrada coincidente
p>nName1 = LCase(CutChr0(InfoF. cNameFile)) 'Nombre del archivo (carpeta)
Si nName1 amp ".\" = nName Entonces
nName1 = CutChr0 (InfoF.cAlternate) 'Reemplazar el nombre del archivo con un nombre de archivo corto
Si hF = "" Entonces nF = nPath amp "\" nName1 De lo contrario nF = "\" amp.nName1; amp "\" & hF
Salir Do
Finalizar si
ID1 = FindNextFile(FondID, InfoF) 'Buscar el siguiente, 0 significa error
p>Bucle
FindClose FondID
Bucle
Salir1:
FindClose FondID
S = MAX_PATH: nName = String(S, vbNullChar)
ID1 = GetShortPathName(nF, nName, S) 'Devuelve el número real de bytes, 0 indica error
Si ID1 = 0 Entonces Salir de la función
Si ShortAll Entonces
Si ID1 gt S Entonces
S = ID1: nName = String(S, vbNullChar)
ID1 = GetShortPathName(nF, nName, S) 'Devuelve el número real de bytes
End If
GetShortName = CutChr0(nName)
Else p>
GetShortName = nF
Fin si
Función final
Public Sub CutPathName(ByVal F como cadena, nPath como cadena, nName como cadena)
p>Atenuar I Mientras, Lente Mientras
LenS = Len(F)
Para I = LenS - 1 a 2 Paso -1 p>
Si Medio(F, I, 1) = "\" Entonces
nPath = Izquierda(F, I - 1): nNombre = Medio(F, I 1)
Ir a Salir1
Finalizar si
Siguiente
nPath = F: nName = ""
Salir1:
Si es correcto (nPath,
2) = "..."Entonces
nPath = nPath amp "\"
De lo contrario
If Right(nPath, 1) = "\" Entonces nPath = Left(nPath, Len(nPath) - 1)
End If
If Right( nName, 1) = "\" And Right(nName, 3) lt; gt; "...\"Entonces nName = Left(nName, Len(nName) - 1)
End Sub
Función privada CutChr0(xx As String) As String p>
Dim S As Long
S = InStr(xx, vbNullChar)
Si S gt 0 Entonces CutChr0 = Left(xx, S - 1) De lo contrario CutChr0 = xx
Función final
'Consulte las referencias a continuación.