Página 1 de 1

Información sobre una unidad de disco

Publicado: Mié Sep 06, 2006 12:17 pm
por Bingen Ugaldebere
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"

Información sobre una unidad de disco

Publicado: Mié Sep 06, 2006 7:19 pm
por jrcpoli
Saludos:
Creo que algo te puedo ayudar aunque en todo no, pero en lo del espacio
y capacidad del medio si.
Primero en un PRG pones esto:
#pragma BEGINDUMP
#include <windows.h>
#include <xailer.h>
XA_FUNC( GETDISKFREESPACE )
{
DWORD lpSectorsPerCluster; // address of sectors per cluster
DWORD lpBytesPerSector; // address of bytes per sector
DWORD lpNumberOfFreeClusters; // address of number of free clusters
DWORD lpTotalNumberOfClusters; // address of total number of clusters
hb_retl( GetDiskFreeSpace( hb_parc( 1 ),
&lpSectorsPerCluster,
&lpBytesPerSector,
&lpNumberOfFreeClusters,
&lpTotalNumberOfClusters ) );
hb_stornl( lpSectorsPerCluster, 2 );
hb_stornl( lpBytesPerSector, 3 );
hb_stornl( lpNumberOfFreeClusters, 4 );
hb_stornl( lpTotalNumberOfClusters, 5 );
}
#pragma ENDDUMP
Estas funciones las acoplas a tu gusto, la conversión en KB, MB la
tienes que hacer tú para su presentación según desees, también con los
datos que aporta puedes calcular más cosas.
FUNCTION EspacioLibreEn(cDisco)
// Calcula los Bytes libres en el disco según la variable cDisco
LOCAL nSectoresPorCluster, nBytesPorSector, nClustersLibres,
nClustersTotal
IF GetDiskFreeSpace( cDisco, @nSectoresPorCluster,
@nBytesPorSector, @nClustersLibres, @nClustersTotal )
RETURN nSectoresPorCluster * nBytesPorSector * nClustersLibres
ENDIF
RETURN 0
FUNCTION CapacidadTotalEn(cDisco)
// Calcula la capacidad total del disco según cDisco
LOCAL nSectoresPorCluster, nBytesPorSector, nClustersLibres,
nClustersTotal
IF GetDiskFreeSpace( cDisco, @nSectoresPorCluster,
@nBytesPorSector, @nClustersLibres, @nClustersTotal )
RETURN nSectoresPorCluster * nBytesPorSector * nClustersTotal
ENDIF
RETURN 0
Espero te sirva.
José Ramón Castro.
Bingen Ugaldebere escribió:
> 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"

Información sobre una unidad de disco

Publicado: Jue Sep 07, 2006 9:31 am
por Bingen Ugaldebere
Muchas gracias Ramón este Inline C es lo que vi en el foro alguna vez y
ahora no era capaz de encontrar.
Para lo otro se que hay otra función del API llamada GetDriveType e
incluso hay ejemplos en C pero no acabo de ver muy claro como montarme
el Inline C cada vez que lo intento es un fiasco.
Alguien que domine este sistema/técnica podrí­a explicar para un profano
en C como se hace un Inline C partiendo de una función C o mejor me voy
apuntando a un curso de C y luego pregunto de nuevo?
Gracias.

Información sobre una unidad de disco

Publicado: Jue Sep 07, 2006 10:44 am
por jfgimenez
Bingen,
> Muchas gracias Ramón este Inline C es lo que vi en el foro alguna vez y
> ahora no era capaz de encontrar.
>
> Para lo otro se que hay otra función del API llamada GetDriveType e
> incluso hay ejemplos en C pero no acabo de ver muy claro como montarme el
> Inline C cada vez que lo intento es un fiasco.
>
> Alguien que domine este sistema/técnica podría explicar para un profano en
> C como se hace un Inline C partiendo de una función C o mejor me voy
> apuntando a un curso de C y luego pregunto de nuevo?
En general, el esqueleto para hacer funciones C dentro de un .prg es el
siguiente:
//---------------------------------------------------------- --------
#pragma BEGINDUMP
#include "windows.h"
#include "xailer.h"
XA_FUNC( <nombre_de_la_funcion_en_mayusculas> )
{
}
#pragma ENDDUMP
//---------------------------------------------------------- --------
Y dentro de la función tendrás que usar el sistema extendido para recibir
parámetros (hb_parXX()) y para retornar valores (hb_retXX()).
--
Un saludo,
José F. Giménez
http://www.xailer.com

Información sobre una unidad de disco

Publicado: Jue Sep 07, 2006 1:31 pm
por jlalin

Bingen, José Ramón,
también se puede usar la función nativa de Harbour HB_DiskSpace().
Adjunto un ejemplo que está en el CVS.
Saludos,
José Lalí­n
--

Información sobre una unidad de disco

Publicado: Jue Sep 07, 2006 1:38 pm
por jlalin

Bingen,
he hecho un par de cambios a un componente que hice meses atrás.
Pruébalo y dime si te sirve.
Saludos,
José Lalí­n
--

Información sobre una unidad de disco

Publicado: Jue Sep 07, 2006 2:09 pm
por Bingen Ugaldebere
Después de leer un rato el manual de xHb y las API de Windows he
conseguido esto y funciona, jeje.
Function DriveType(cDrive)
Local aType:={"No definido","No existe","Medio Removible","Disco
Rigido","Unidad de Red","CD-ROM","RAM Drive"}
Default cDrive To "C:"
Return aType[GetDriveType(Left(cDrive,1)+":")+1]
#pragma BEGINDUMP
#include <windows.h>
#include <xailer.h>
XA_FUNC( GETDRIVETYPE )
{
int nType ; // address of sectors per cluster
hb_retnl( GetDriveType( hb_parc( 1 ) ) );
}
#pragma ENDDUMP

Información sobre una unidad de disco

Publicado: Jue Sep 07, 2006 2:26 pm
por Manu
Bingen, muchas gracias por el aporte...
Esta lí­nea te deberí­a dar al menos una warning, ya que declaras una
variable que luego no usas...
int nType ; // address of sectors per cluster
Saludos
Bingen Ugaldebere escribió:
> Después de leer un rato el manual de xHb y las API de Windows he
> conseguido esto y funciona, jeje.
>
> Function DriveType(cDrive)
> Local aType:={"No definido","No existe","Medio Removible","Disco
> Rigido","Unidad de Red","CD-ROM","RAM Drive"}
>
> Default cDrive To "C:"
>
> Return aType[GetDriveType(Left(cDrive,1)+":")+1]
>
>
> #pragma BEGINDUMP
> #include <windows.h>
> #include <xailer.h>
>
> XA_FUNC( GETDRIVETYPE )
> {
> int nType ; // address of sectors per cluster
>
> hb_retnl( GetDriveType( hb_parc( 1 ) ) );
>
> }
>
> #pragma ENDDUMP

Información sobre una unidad de disco

Publicado: Jue Sep 07, 2006 5:48 pm
por Bingen Ugaldebere
Cierto es quedo de pruebas anteriores.

Información sobre una unidad de disco

Publicado: Jue Sep 07, 2006 6:01 pm
por Bingen Ugaldebere
Como siempre muy agradecido pero debo de cometer alguna torpeza ya que
he añadido el OBJ al proyecto, incluido la clase en mi PRG y al compilar
me da:
Compilando Initial.prg...
C:XailerxHarbourBinharbour.exe Initial.prg /n /w1
/iC:XailerProgramasInitialInclude;C:XailerInclude;C:X ailerxHarbourInclude
/oC:XailerProgramasInitialObjInitial.c
xHarbour Compiler build 0.99.61 (SimpLex)
Copyright 1999-2006, http://www.xharbour.org http://www.harbour-project.org/
Compiling 'Initial.prg'...
Lines 2319, Functions/Procedures 39
Generating C source output to 'C:XailerProgramasInitialObjInitial.c'...
Done.
C:XailerBCC55Binbcc32 -tWM -c -v- -O2 -X -DHB_API_MACROS
-DHB_STACK_MACROS -D__XHARBOUR__
-IC:XailerProgramasInitialInclude;C:XailerInclude;C:X ailerxHarbourInclude;C:XailerBCC55Include
-oC:XailerProgramasInitialObjInitial.obj Initial.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Initial.c:
Compilando Messages.prg...
C:XailerxHarbourBinharbour.exe Messages.prg /n /w1
/iC:XailerProgramasInitialInclude;C:XailerInclude;C:X ailerxHarbourInclude
/oC:XailerProgramasInitialObjMessages.c
xHarbour Compiler build 0.99.61 (SimpLex)
Copyright 1999-2006, http://www.xharbour.org http://www.harbour-project.org/
Compiling 'Messages.prg'...
Lines 975, Functions/Procedures 20
Generating C source output to
'C:XailerProgramasInitialObjMessages.c'...
Done.
C:XailerBCC55Binbcc32 -tWM -c -v- -O2 -X -DHB_API_MACROS
-DHB_STACK_MACROS -D__XHARBOUR__
-IC:XailerProgramasInitialInclude;C:XailerInclude;C:X ailerxHarbourInclude;C:XailerBCC55Include
-oC:XailerProgramasInitialObjMessages.obj Messages.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Messages.c:
Compilando Initial.rc...
C:XailerBCC55Binbrc32 -r
-foC:XailerProgramasInitialObjInitial.res Initial.rc
Borland Resource Compiler Version 5.40
Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved.
Enlazando Initial.exe...
C:XailerBCC55Binilink32 -Gn -Tpe -x -aa @make.tmp
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: Unresolved external '_HB_FUN_TDRIVEINFO_CREATE' referenced from
C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Error: Unresolved external '_HB_FUN_TDRIVEINFO_HASNAMEDSTREAMS'
referenced from C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Error: Unresolved external '_HB_FUN_TDRIVEINFO_ISREADONLY' referenced
from C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Error: Unresolved external '_HB_FUN_TDRIVEINFO_HASOBJECTSID' referenced
from C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Error: Unresolved external '_HB_FUN_TDRIVEINFO_HASREPARSEPOINTS'
referenced from C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Error: Unresolved external '_HB_FUN_TDRIVEINFO_HASSPARSEFILES'
referenced from C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Error: Unresolved external '_HB_FUN_TDRIVEINFO_HASDISKQUOTAS' referenced
from C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Error: Unresolved external '_HB_FUN_TDRIVEINFO_ISCASEPRESERVED'
referenced from C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Error: Unresolved external '_HB_FUN_TDRIVEINFO_ISCASESENSITIVE'
referenced from C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Error: Unresolved external '_HB_FUN_TDRIVEINFO_HASCOMPRESSION'
referenced from C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Error: Unresolved external '_HB_FUN_TDRIVEINFO_HASENCRYPTION' referenced
from C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Error: Unresolved external '_HB_FUN_TDRIVEINFO_HASUNICODEONDISK'
referenced from C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Error: Unresolved external '_HB_FUN_TDRIVEINFO_ISCOMPRESSED' referenced
from C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Error: Unresolved external '_HB_FUN_TDRIVEINFO_ISUNKNOWN' referenced
from C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Error: Unresolved external '_HB_FUN_TDRIVEINFO_ISNOTVALID' referenced
from C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Error: Unresolved external '_HB_FUN_TDRIVEINFO_ISREMOVABLE' referenced
from C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Error: Unresolved external '_HB_FUN_TDRIVEINFO_ISFIXED' referenced from
C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Error: Unresolved external '_HB_FUN_TDRIVEINFO_ISREMOTE' referenced from
C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Error: Unresolved external '_HB_FUN_TDRIVEINFO_ISCDROM' referenced from
C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Error: Unresolved external '_HB_FUN_TDRIVEINFO_ISRAMDISK' referenced
from C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ
Warning: Public symbol '_HB_FUN_TDRIVEINFO' defined in both module
C:XAILERPROGRAMASINITIALOBJINITIAL.OBJ and
C:XAILERPROGRAMASINITIALOBJDRIVEINFO.OBJ
1 Warnings, 20 Errors

Información sobre una unidad de disco

Publicado: Vie Sep 08, 2006 2:02 am
por jlalin
Bingen,
> Como siempre muy agradecido pero debo de cometer alguna torpeza ya que
> he añadido el OBJ al proyecto, incluido la clase en mi PRG y al compilar
> me da:
la clase la puse sólo para que vieras las propiedades y métodos que
puedes utilizar, nada más.
Quí­tala del proyecto y deja sólo el OBJ.
Saludos,
José Lalí­n

Información sobre una unidad de disco

Publicado: Vie Sep 08, 2006 2:03 am
por jlalin
Bingen,
> Después de leer un rato el manual de xHb y las API de Windows he
> conseguido esto y funciona, jeje.
Si quieres usar tu función en la clase que he puesto antes:
CLASS TDriveInfo FROM XDriveInfo
PUBLIC:
METHOD DriveType( cDrive )
ENDCLASS
METHOD DriveType( cDrive ) CLASS TDriveInfo
Local aType:={"No definido","No existe","Medio Removible","Disco
Rigido","Unidad de Red","CD-ROM","RAM Drive"}
Default cDrive To "C:"
Return aType[GetDriveType(Left(cDrive,1)+":")+1]
Y ya tienes la misma funcionalidad que cuando usabas la vieja función.
Saludos,
José Lalí­n

Información sobre una unidad de disco

Publicado: Vie Sep 08, 2006 8:27 am
por Bingen Ugaldebere
Muy bien muchas gracias, me di cuenta anoche cuando ya lo habí­a dejado.
José Lalí­n escribió:
>
> Bingen,
>
>> Como siempre muy agradecido pero debo de cometer alguna torpeza ya que
>> he añadido el OBJ al proyecto, incluido la clase en mi PRG y al
>> compilar me da:
>
> la clase la puse sólo para que vieras las propiedades y métodos que
> puedes utilizar, nada más.
>
> Quí­tala del proyecto y deja sólo el OBJ.
>
> Saludos,
> José Lalí­n