Información sobre una unidad de disco
Publicado: Mié Sep 06, 2006 12:17 pm
Buenas compañeros, alguno sabe como obtener información acerca de una
unidad de disco como el espacio libre en la unidad, bytes de capacidad
(estas 2 cosas me suena de haberlas visto en un mensaje del foro pero no
lo encuentro), tipo de medio HD CD DVD USB, si se puede escribir, si es
Unidad de Red, etc...
Hasta ahora usaba esta función pero ahora las DLL32 no van.
Muchas gracias.
/*********************************************************** *****
DriveInfo(cUnidad)
Returns información acerca de la unidad pasada... P.E. 'C:'
Dentro de un array que contiene:
1. Nombre de la unidad, por ejemplo "C:"
2. Espacio Libre en la unidad
3. Total de bytes de capacidad
4. Tipo de Medio (Ver lista)
5. .T./.F. Si se puede escribir...
6. Si es Unidad de Red
Forma de Uso:
DRIVEINFO('C') / DRIVEINFO(3) (Donde "A:"=1)
Returns por ejemplo:
{'C:',45888998,343243244434,"Disco Rigido",.T.,.F.}
*/
Function DriveInfo(cDrive)
Local c:={SPACE(8),SPACE(8),SPACE(8)},I, nHandle:=0
Local ADEV:={'',0,0,0,.F.,.F.},NANT,cTEMP:=Space(104)
Local aTipo:={"No definido","No existe","Medio Removible","Disco
Rigido","Unidad de Red","CD-ROM","RAM Drive"}
DEFAULT cDrive:=CURDRIVE()
nNAT:=_DRIVEINF2(1)
IF VALTYPE(cDrive)='C'
cDrive=Upper(LEFT(Alltrim(cDrive),1))
ELSEIF VALTYPE(cDrive)='N'
cDrive=CHR(64+cDrive)
ELSE
cDrive=DiskName()
ENDIF
ADEV[1]:=cDrive+':'
cDrive+=':'
///ME FIJO SI EXISTE PRIMERO...segun tipo de medio...
ADEV[4]:=_DRIVEINF3(cDrive)
IF ADEV[4]>1
_DRIVEINF1(cDrive,C[1],C[2],C[3])
ADEV[2]:=IF(RIGHT(C[3],1)=CHR(255),0,BIN2N(C[3]))
ADEV[3]:=IF(RIGHT(C[2],1)=CHR(255),0,BIN2N(C[2]))
cArch:=cDrive+'X'+STR(SECONDS()*100,7)+'.í¾í½ú'
nHandle:=FCREATE(cArch,0)
nERROR:=FERROR()
IF nError=3 .OR. (NERROR=5 .AND. ADEV[2]>2000*1024*1024*1024)
adev[2]=0
adev[3]=0
ENDIF
ADEV[4]:=aTipo[ADEV[4]+1]
ADEV[5]:=(nERROR=0) .AND. FWRITE(nHandle,REPL('X',1024))>0
ADEV[6]:=If(_DRIVEINF3(cDrive)=4,.F.,.T.)
FCLOSE(nHandle)
FERASE(cArch)
ELSE
ADEV[2]:=0
ADEV[3]:=0
ADEV[4]:=aTipo[2]
ADEV[5]:=.F.
ADEV[6]:=.F.
ENDIF
_DRIVEINF2(nANT)
Return ADEV
DLL32 STATIC FUNCTION _DRIVEINF1( cDirectoryName AS LPSTR,
cFreeBytesToCaller AS LPSTR, cTotalBytes AS LPSTR, cTotalFreeBytes AS
LPSTR ) AS BOOL PASCAL ;
From "GetDiskFreeSpaceExA" Lib "kernel32.dll"
DLL32 STATIC Function _DRIVEINF2( nMode As LONG ) As LONG PASCAL ;
From "SetErrorMode" Lib "kernel32.dll"
DLL32 STATIC Function _DRIVEINF3( cDrive AS STRING ) AS LONG PASCAL ;
From "GetDriveTypeA" Lib "kernel32.dll"
unidad de disco como el espacio libre en la unidad, bytes de capacidad
(estas 2 cosas me suena de haberlas visto en un mensaje del foro pero no
lo encuentro), tipo de medio HD CD DVD USB, si se puede escribir, si es
Unidad de Red, etc...
Hasta ahora usaba esta función pero ahora las DLL32 no van.
Muchas gracias.
/*********************************************************** *****
DriveInfo(cUnidad)
Returns información acerca de la unidad pasada... P.E. 'C:'
Dentro de un array que contiene:
1. Nombre de la unidad, por ejemplo "C:"
2. Espacio Libre en la unidad
3. Total de bytes de capacidad
4. Tipo de Medio (Ver lista)
5. .T./.F. Si se puede escribir...
6. Si es Unidad de Red
Forma de Uso:
DRIVEINFO('C') / DRIVEINFO(3) (Donde "A:"=1)
Returns por ejemplo:
{'C:',45888998,343243244434,"Disco Rigido",.T.,.F.}
*/
Function DriveInfo(cDrive)
Local c:={SPACE(8),SPACE(8),SPACE(8)},I, nHandle:=0
Local ADEV:={'',0,0,0,.F.,.F.},NANT,cTEMP:=Space(104)
Local aTipo:={"No definido","No existe","Medio Removible","Disco
Rigido","Unidad de Red","CD-ROM","RAM Drive"}
DEFAULT cDrive:=CURDRIVE()
nNAT:=_DRIVEINF2(1)
IF VALTYPE(cDrive)='C'
cDrive=Upper(LEFT(Alltrim(cDrive),1))
ELSEIF VALTYPE(cDrive)='N'
cDrive=CHR(64+cDrive)
ELSE
cDrive=DiskName()
ENDIF
ADEV[1]:=cDrive+':'
cDrive+=':'
///ME FIJO SI EXISTE PRIMERO...segun tipo de medio...
ADEV[4]:=_DRIVEINF3(cDrive)
IF ADEV[4]>1
_DRIVEINF1(cDrive,C[1],C[2],C[3])
ADEV[2]:=IF(RIGHT(C[3],1)=CHR(255),0,BIN2N(C[3]))
ADEV[3]:=IF(RIGHT(C[2],1)=CHR(255),0,BIN2N(C[2]))
cArch:=cDrive+'X'+STR(SECONDS()*100,7)+'.í¾í½ú'
nHandle:=FCREATE(cArch,0)
nERROR:=FERROR()
IF nError=3 .OR. (NERROR=5 .AND. ADEV[2]>2000*1024*1024*1024)
adev[2]=0
adev[3]=0
ENDIF
ADEV[4]:=aTipo[ADEV[4]+1]
ADEV[5]:=(nERROR=0) .AND. FWRITE(nHandle,REPL('X',1024))>0
ADEV[6]:=If(_DRIVEINF3(cDrive)=4,.F.,.T.)
FCLOSE(nHandle)
FERASE(cArch)
ELSE
ADEV[2]:=0
ADEV[3]:=0
ADEV[4]:=aTipo[2]
ADEV[5]:=.F.
ADEV[6]:=.F.
ENDIF
_DRIVEINF2(nANT)
Return ADEV
DLL32 STATIC FUNCTION _DRIVEINF1( cDirectoryName AS LPSTR,
cFreeBytesToCaller AS LPSTR, cTotalBytes AS LPSTR, cTotalFreeBytes AS
LPSTR ) AS BOOL PASCAL ;
From "GetDiskFreeSpaceExA" Lib "kernel32.dll"
DLL32 STATIC Function _DRIVEINF2( nMode As LONG ) As LONG PASCAL ;
From "SetErrorMode" Lib "kernel32.dll"
DLL32 STATIC Function _DRIVEINF3( cDrive AS STRING ) AS LONG PASCAL ;
From "GetDriveTypeA" Lib "kernel32.dll"