In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Información sobre una unidad de disco

Foro público de Xailer en español
Responder
Bingen Ugaldebere
Mensajes: 1310
Registrado: Mié Sep 26, 2007 7:12 pm

Información sobre una unidad de disco

Mensaje 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"
jrcpoli
Mensajes: 240
Registrado: Mié Oct 25, 2006 8:55 pm

Información sobre una unidad de disco

Mensaje 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"
José Ramón Castro.
Bingen Ugaldebere
Mensajes: 1310
Registrado: Mié Sep 26, 2007 7:12 pm

Información sobre una unidad de disco

Mensaje 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.
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Información sobre una unidad de disco

Mensaje 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
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Información sobre una unidad de disco

Mensaje 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
--
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Información sobre una unidad de disco

Mensaje 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
--
Bingen Ugaldebere
Mensajes: 1310
Registrado: Mié Sep 26, 2007 7:12 pm

Información sobre una unidad de disco

Mensaje 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
Manu
Mensajes: 108
Registrado: Dom Sep 24, 2006 2:28 pm

Información sobre una unidad de disco

Mensaje 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
Bingen Ugaldebere
Mensajes: 1310
Registrado: Mié Sep 26, 2007 7:12 pm

Información sobre una unidad de disco

Mensaje por Bingen Ugaldebere »

Cierto es quedo de pruebas anteriores.
Bingen Ugaldebere
Mensajes: 1310
Registrado: Mié Sep 26, 2007 7:12 pm

Información sobre una unidad de disco

Mensaje 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
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Información sobre una unidad de disco

Mensaje 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
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Información sobre una unidad de disco

Mensaje 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
Bingen Ugaldebere
Mensajes: 1310
Registrado: Mié Sep 26, 2007 7:12 pm

Información sobre una unidad de disco

Mensaje 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
Responder