Funciones para trabajar con unidad USB

Funciones para trabajar con unidad USB

Postby jvtecheto » Fri Jul 12, 2019 5:01 pm

Hola amigos:

Que funciones hay para operar con la unidad USB, necesito saber que letra tiene. (F, G, etc).
comprobar si la unidad USB este disponible para grabar en ella. ?, etc.

Saludos.

Jose.
Fwh 19.06 32 bits + Harbour 3.2dev(r2104281802) + Borland 7.4 + FivEdit
User avatar
jvtecheto
 
Posts: 576
Joined: Mon Mar 04, 2013 4:32 pm
Location: Spain

Re: Funciones para trabajar con unidad USB

Postby Baxajaun » Fri Jul 12, 2019 5:34 pm

Buenas tardes José,

has mirado el ejemplo protect.prg del directorio samples ?

Muchas gracias.

Saludos
User avatar
Baxajaun
 
Posts: 962
Joined: Wed Oct 19, 2005 2:17 pm
Location: Gatika. Bizkaia

Re: Funciones para trabajar con unidad USB

Postby FiveWiDi » Fri Jul 19, 2019 2:38 pm

brakaman wrote:Hola amigos:

Que funciones hay para operar con la unidad USB, necesito saber que letra tiene. (F, G, etc).
comprobar si la unidad USB este disponible para grabar en ella. ?, etc.

Saludos.

Jose.


Quizás te ayude....
Code: Select all  Expand view

/* **********************************************************************
18/11/2008
Aquí dejaré las funciones genéricas que utilizaré para la gestión de la
protección con USB.


 -La función cGetSerialProtect() es la que nos dirá el número de serie
  de el USB que escojamos de la lista que nos enseñe.
  Se puede usar en un menú de configuración de la aplicación para que el
  usuario nos facilite el número de serie del USB que utilizará.

********************************************************************** */


#include "FiveWin.ch"

#define DRIVE_REMOVABLE  2

/* *************************** */

/* *****************************************************************
   A partir de un número de serie obtiene la letra del Pendrive USB.
   -------------------------------------------------------------- */

STATIC FUNCTION cNumUSB2LetUSB( cNumUSB )
Local cLetter    := ""
Local nBitDrives := GetLogicalDrives()
Local nContador  := 0
Local cDrive     := ""
Local USBSerial  := ""

For nContador := 1 to 32
    If lAnd( nBitDrives, 2 ^ ( nContador - 1 ) )
        cDrive = Chr( Asc( "A" ) - 1 + nContador ) + ":\"
        If nContador != 1 .and. GetDriveType( cDrive ) == DRIVE_REMOVABLE
            USBSerial := GetUSBSerial( cDrive )
            If valType( USBSerial ) = "
C"
                If USBSerial == cNumUSB
                    cLetter := cDrive
                    Exit
                EndIf
              Else
                Traza( 1, "
USBSerial=", USBSerial )
                cLetter := "
Error: Obtenido ValType( USBSerial) <> 'C'"
                Traza( 1, "
cLetter:", cLetter )
            EndIf
        Endif
    Endif
Next

Return cLetter
/* *************************** */
/* *************************** */

/* ***********************************************************************
   A partir d'una lletra d'un USB inicia la cerca del seu número de sèrie.
   -------------------------------------------------------------------- */
STATIC FUNCTION GetUSBSerial( cDrive )
Local oLoc := CreateObject( "
wbemScripting.SwbemLocator" )
Local oSrv := oLoc:ConnectServer()
Local oJobs := oSrv:ExecQuery( "
SELECT * FROM Win32_LogicalDiskToPartition" )
Local oJob
Local cDriveNumber

cDrive = Upper( cDrive )
If Len( cDrive ) == 1
    cDrive += "
:"
Endif
If Len( cDrive ) > 2
    cDrive = SubStr( cDrive, 1, 2 )
Endif

For each oJob in oJobs

    If cDrive == StrToken( oJob:Dependent, 2, '"
' )
        cDriveNumber = SubStr( StrToken( StrToken( oJob:Antecedent, 2, '
"' ), 1, "," ), 7 )

        return GetSerial( oSrv, cDriveNumber )
    Endif
Next

Return "
."
/* *************************** */
/* *************************** */

/* *********************************************************
   Cerca a partir d'una lletra d'USB el seu número de sèrie.
   ------------------------------------------------------ */
STATIC FUNCTION GetSerial( oSrv, cDriveNumber )
Local aDrives := oSrv:ExecQuery( "
SELECT * FROM Win32_DiskDrive" )
Local oDrive, cSerial := "
"

For each oDrive in aDrives
    If oDrive:Name == "
\\.\PHYSICALDRIVE" + cDriveNumber .and. ;
       oDrive:InterfaceType == "
USB"

        cSerial = oDrive:PNPDeviceID

        cSerial = SubStr( cSerial, 1, RAt( "
&", cSerial ) - 1 )
        cSerial = SubStr( cSerial, RAt( "
&", cSerial ) + 1 )
        If At( "
\", cSerial ) != 0
            cSerial = SubStr( cSerial, At( "
\", cSerial ) + 1 )
        Endif

        Return cSerial
        //Exit
    Endif
Next

Return cSerial
/* *************************** */
/* *************************** */

/* *************************** */
FUNCTION cSelectUSB( lMensaje )

Local aDriveUSB := {}
Local nDriveUSB := 0
Local cDriveUSB := "
"
Local nContador := 0

aDriveUSB := aUSBDrive()

If Len( aDriveUSB ) = 0
    If lMensaje
        MsgAlert( GetTrad("
No hi han unitats USB disponibles, insereixi una unitat USB."), GetTrad("A T E N C I Ó !" ) )
    EndIf
  Else

    nDriveUSB := MsgList( aDriveUSB, GetTrad("
Unitats USB disponibles:"), Nil, Nil, Nil, 15, "Seleccionar", nDriveUSB, .T., Nil )

    //Traza( 1, nDriveUSB := MsgList( aDriveUSB, GetTrad("
Unitats USB disponibles:"), Nil, Nil, Nil, 15, "Seleccionar", nDriveUSB, .T., Nil ) )

    If nDriveUSB > 0
        cDriveUSB := SubStr( aDriveUSB[ nDriveUSB ], 1, 3 )
   
        Traza(1, "
aDriveUSB[ nDriveUSB ]=", aDriveUSB[ nDriveUSB ])

    EndIf
   
EndIf

Traza(1, "
cDriveUSB=", cDriveUSB)

Return cDriveUSB
/* *************************** */
/* *************************** */

#pragma BEGINDUMP

#include "
hbapi.h"
#include "
windows.h"

HB_FUNC( SETERRORMODE )
{
   hb_retni( SetErrorMode( hb_parni( 1 ) ) ) ;
}

HB_FUNC( GETDISKFREESPACE ) // cRootPathName, @nSectorsByCluster, @nBytesPerSector,
                            // @nNumberOfFreeClusters, @nTotalNumberOfClusters --> lResult
{
   LPSTR lpRootPathName = hb_parc( 1 );
   DWORD SectorsPerCluster;
   DWORD BytesPerSector;
   DWORD NumberOfFreeClusters;
   DWORD TotalNumberOfClusters;

   hb_retl( GetDiskFreeSpace( lpRootPathName, &SectorsPerCluster,
                              &BytesPerSector, &NumberOfFreeClusters,
                              &TotalNumberOfClusters ) );
   hb_stornl( SectorsPerCluster, 2 );
   hb_stornl( BytesPerSector, 3 );
   hb_stornl( NumberOfFreeClusters, 4 );
   hb_stornl( TotalNumberOfClusters, 5 );
}

#pragma ENDDUMP

/* *************************** */
/* *************************** */
FUNCTION lExistUSB( cDisk )
/* Se da el caso de que con un PenDrive (al menos el que yo he usado) las
funciones IsDisk() y lIsDir() dan .F..
Cuando se trata de una tarjeta de memoria (por ejemplo XD) insertada en
un lector de tarjetas externo conectado a un puerto USB, la IsDisk() sigue
dando .F. y la lIsDir() da .T..
Como lo que se pretende es poder saber que unidades USB son susceptibles de
usarse independientemente de PenDrive o tarjetas de memoria, se opta por
la función GetDiskFreeSpace() que da .T. tanto para PenDrive como para
tarjetas de memoria.
22/08/2010
*/

Local lExist        := .F.
Local nSetErrorMode := 0

//Traza( 1, "
cDisk=", cDisk )
//Traza( 1, "
1-SETERRORMODE=", SETERRORMODE() )

nSetErrorMode := SETERRORMODE( 1 )
//Traza( 1, "
1-nSetErrorMode=", nSetErrorMode )

//lExist := IsDisk( Left( cDisk, 1) + "
:" )
//Traza( 1, "
1-lExist=", lExist )
//lExist := lIsDir( Left( cDisk, 1) + "
:\" )
//Traza( 1, "
2-lExist=", lExist )

lExist := GetDiskFreeSpace( Left( cDisk, 1) + "
:\" )
//Traza( 1, "
3-lExist=", lExist )

nSetErrorMode := SETERRORMODE( nSetErrorMode )

//Traza( 1, "
2-nSetErrorMode=", nSetErrorMode )
//Traza( 1, "
2-SETERRORMODE=", SETERRORMODE() )

Return lExist
/* *************************** */

/* *************************** */

/* ************************************
   Torna una array dels USB connectats.
   --------------------------------- */
STATIC FUNCTION aUSBDrive()
Local nBitDrives := GetLogicalDrives()
Local nContador  := 0
Local cDrive     := "
"
Local aDrives    := {}

For nContador := 1 to 32
    If lAnd( nBitDrives, 2 ^ ( nContador - 1 ) )
        cDrive = Chr( Asc( "
A" ) - 1 + nContador ) + ":\"
        If nContador != 1 .and. GetDriveType( cDrive ) == DRIVE_REMOVABLE

            If lExistUSB( cDrive )
                AAdd( aDrives, cDrive )
            EndIf

        Endif
    Endif
Next

Return aDrives
/* *************************** */
/* *************************** */
/* *************************** */


/* *************************** */
/* *************************** */

Un Saludo
Carlos G.

FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
FiveWiDi
 
Posts: 1064
Joined: Mon Oct 10, 2005 2:38 pm

Re: Funciones para trabajar con unidad USB

Postby karinha » Fri Jul 19, 2019 3:32 pm

Warning W8075 USBFUNC.prg 174:Suspicious pointer conversion in function HB_FUN_GETDISKFREESPACE

Error: Unresolved external '_HB_FUN_TRAZA'

Error: Unresolved external '_HB_FUN_GETTRAD'


Saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7239
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Funciones para trabajar con unidad USB

Postby jvtecheto » Fri Jul 19, 2019 3:50 pm

Buenas tardes:

Gracias por las funciones USB , las quiero usar para hacer copias de seguridad, voy a estudiar cuales me valen, pero creo que con esto tendre suficiente.

Muchisimas gracias..

Saludos.

Jose.
Fwh 19.06 32 bits + Harbour 3.2dev(r2104281802) + Borland 7.4 + FivEdit
User avatar
jvtecheto
 
Posts: 576
Joined: Mon Mar 04, 2013 4:32 pm
Location: Spain


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 10 guests