FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Reconocer puerta USB
Posts: 41
Joined: Tue May 13, 2008 01:53 AM
Reconocer puerta USB
Posted: Mon Oct 01, 2012 12:11 AM
Hola amigos, estoy haciendo un programa y necesito realizar una copia de seguridad en un PenDrive, mi cliente entiende poco y nada de computadores. La idea es abrir una Listbox com aDrives() y seleccionar la unidad del pendrive.
Code (fw): Select all Collapse
聽@ 1, 1 LISTBOX cDrive ITEMS aDrives(2) SIZE 100, 100 OF oDlg ;
聽 聽 聽 ON DBLCLICK (msginfo(cDrive), oDlg:End())

Solo que en la listBox no se como agregar al lado de la unidad el texto Drice C o USB etc.
Existe algun comando como IsCdroom() que sea IsUSB ?, o alguna ayuda sobre el tema?

Desde ya muchas gracias, Daniel
Buenos Aires - Argentina - Viviendo en Porto Alegre - RS - Brasil
daniel_halon@portobakers.com.br
FW 2.7- xHarbour 0.99.71 - PellesC
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Reconocer puerta USB
Posted: Mon Oct 01, 2012 02:57 PM
Code (fw): Select all Collapse
/* *************************** */
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
/* *************************** */

/* ************************************
聽 聽Torna una array dels USB connectats.
聽 聽--------------------------------- */

#define DRIVE_REMOVABLE 聽2

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
/* *************************** */
/* *************************** */
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
/* *************************** */#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

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 41
Joined: Tue May 13, 2008 01:53 AM
Re: Reconocer puerta USB
Posted: Mon Oct 01, 2012 03:06 PM

Desde ya Muchas gracias, voy a testar todo esto.

Buenos Aires - Argentina - Viviendo en Porto Alegre - RS - Brasil
daniel_halon@portobakers.com.br
FW 2.7- xHarbour 0.99.71 - PellesC
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM
Re: Reconocer puerta USB
Posted: Mon Oct 01, 2012 09:43 PM
Lo hago asi:

Code (fw): Select all Collapse
Local   aUnidades:=aDrives()  
      FOR xI=1 TO LEN( aUnidades )
            IF GetDriveType( aUnidades[xI] )=2
              ?"USB"
           ELSEIF GetDriveType( aUnidades[xI] )=3
              ?"HDISK"
           ELSEIF GetDriveType( aUnidades[xI] )=5
              ?"CDROOM"
           ENDif
       NEXT


Saludos,

Adhemar
Saludos,



Adhemar C.
Posts: 41
Joined: Tue May 13, 2008 01:53 AM
Re: Reconocer puerta USB
Posted: Mon Oct 01, 2012 10:37 PM

Gracias Adhemar, parece tan simple :oops: y yo buscando por el lado dif铆cil, voy a testar y retorno.

Abrazos, Daniel

Buenos Aires - Argentina - Viviendo en Porto Alegre - RS - Brasil
daniel_halon@portobakers.com.br
FW 2.7- xHarbour 0.99.71 - PellesC
Posts: 41
Joined: Tue May 13, 2008 01:53 AM
Re: Reconocer puerta USB
Posted: Mon Oct 01, 2012 11:55 PM

Adhemar, funcion贸 perfecto, solo me falta saber que letra es la unidad usb, como podria implementarlo en este ejemplo?
Gracias, Daniel

Buenos Aires - Argentina - Viviendo en Porto Alegre - RS - Brasil
daniel_halon@portobakers.com.br
FW 2.7- xHarbour 0.99.71 - PellesC
Posts: 41
Joined: Tue May 13, 2008 01:53 AM
Re: Reconocer puerta USB (Resuelto)
Posted: Tue Oct 02, 2012 01:47 AM
Gracias Ahemar, quedo asi:

Code (fw): Select all Collapse
Function Integrar()
Local   aUnidades:=aDrives(), Pendrive := '', uni := 0  
      FOR xI=1 TO LEN( aUnidades )
            IF GetDriveType( aUnidades[xI] )=2
              Uni :=  GetDriveType( aUnidades[xI])
              Pendrive := aUnidades[xI,1] + ':\'
            ENDif
             
          * ELSEIF GetDriveType( aUnidades[xI] )=3
          *    ?"HDISK"
          * ELSEIF GetDriveType( aUnidades[xI] )=5
          *    ?"CDROOM"
          
       NEXT
       
       IF uni == 2
         IF File(PenDrive + 'Evs.txt')
            COPYFILE('Bak.rar', PenDrive + 'Bak.rar', .F. )
         ELSE
           IF MsgInfo(OemToAnsi('Este n脝o e o PenDrive de Backup'), + CRLF +;
              'Deseja copiar mesmo assim?',OemToAnsi('Aten鈥∶唎'))
              COPYFILE('Bak.rar', PenDrive + 'Bak.rar', .F. )
           ENDIF
         ENDIF
       ELSE
         MsgStop('Insira o PenDrive na entrada USB e tente novamente')
       ENDIF
Return Pendrive
Buenos Aires - Argentina - Viviendo en Porto Alegre - RS - Brasil
daniel_halon@portobakers.com.br
FW 2.7- xHarbour 0.99.71 - PellesC
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: Reconocer puerta USB
Posted: Tue Oct 02, 2012 07:26 AM

Si el ordenador tiene un lector de tarjetas ( de camara de fotos me refiero ) la funcion aDrives devuelve error y no funciona .
Saludos.

Posts: 41
Joined: Tue May 13, 2008 01:53 AM
Re: Reconocer puerta USB
Posted: Tue Oct 02, 2012 01:50 PM

No habia pensado en eso, tienes alguna otra idea de como hacerlo? Mastintin

Buenos Aires - Argentina - Viviendo en Porto Alegre - RS - Brasil
daniel_halon@portobakers.com.br
FW 2.7- xHarbour 0.99.71 - PellesC
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: Reconocer puerta USB
Posted: Tue Oct 02, 2012 07:12 PM

Pues no , la idea me parece perfecta , pero se tendria que revisar la funcion aDrive() para que el error no estropease todo.
Tendremos que pensar como arreglarlo .
Saludos.

Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Reconocer puerta USB
Posted: Tue Oct 02, 2012 09:50 PM
mastintin wrote:Pues no , la idea me parece perfecta , pero se tendria que revisar la funcion aDrive() para que el error no estropease todo.
Tendremos que pensar como arreglarlo .
Saludos.


Hola a todos,

Creo que con las funciones que os he dejado os funcionar谩 para un lector de targetas.
Lo acabo de probar con un lector de 4 targetas y solo muestra la unidad en la que est谩 insertada la targeta.

:-)

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: Reconocer puerta USB
Posted: Wed Oct 03, 2012 07:34 AM
FiveWiDi wrote:
Creo que con las funciones que os he dejado os funcionar谩 para un lector de targetas.
Lo acabo de probar con un lector de 4 targetas y solo muestra la unidad en la que est谩 insertada la targeta.

:-)


FiveWidi , pues me devuelve que la funcion SETERRORMODE no la encuentra , por otro lado si la anulo tambien falta la funcion GetDiskFreeSpace() que ha sido sustituida por GetDiskFreeSpaceEx() .
Usando esta ultima funcion ( que devuelve el espacio libre ) ,genera el mismo error que aDrives() y ademas devuelve que tiene espacio libre en unidades ( lectoras de tarjeta) que no tienen tarjeta insertada.

Tendremos que seguir buscando la soluci贸n. Gracias por el apunte.
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: Reconocer puerta USB
Posted: Wed Oct 03, 2012 10:14 AM
mastintin wrote:
FiveWiDi wrote:
Creo que con las funciones que os he dejado os funcionar谩 para un lector de targetas.
Lo acabo de probar con un lector de 4 targetas y solo muestra la unidad en la que est谩 insertada la targeta.

:-)


FiveWidi , pues me devuelve que la funcion SETERRORMODE no la encuentra , por otro lado si la anulo tambien falta la funcion GetDiskFreeSpace() que ha sido sustituida por GetDiskFreeSpaceEx() .
Usando esta ultima funcion ( que devuelve el espacio libre ) ,genera el mismo error que aDrives() y ademas devuelve que tiene espacio libre en unidades ( lectoras de tarjeta) que no tienen tarjeta insertada.

Tendremos que seguir buscando la soluci贸n. Gracias por el apunte.


Lo he encontrado aqui ... :-) viewtopic.php?f=3&t=10541&start=30
la funcion GETDISKFREESPACE da un Warning W8075 varih.prg 2354: Suspicious pointer conversion in function HB_FUN_GETDISKFREESPACE. pero funciona perfecto.
Para solucionar el Warning asi:
Code (fw): Select all Collapse
聽hb_retl( GetDiskFreeSpace( ( char * ) hb_parc( 1), &SectorsPerCluster,
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 &BytesPerSector, &NumberOfFreeClusters,
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 &TotalNumberOfClusters ) );



Saludos y gracias.
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: Reconocer puerta USB
Posted: Wed Oct 03, 2012 10:53 AM
Amplio:
He modificado la funcion de fivewin para que devuelva un nuevo parametro que es el resultado de la ejecucion de la funci贸n , ya no necesitamos GetdiskFreespace :

Code (fw): Select all Collapse
HB_FUNC( GETDISKFREESPACEEX )
{
   LONGLONG FreeBytesAvailable, TotalNumberOfBytes, TotalNumberOfFreeBytes;

   hb_reta( 4 );

   hb_storvnll( GetDiskFreeSpaceEx( ( char * ) hb_parc( 1 ), ( PULARGE_INTEGER ) &FreeBytesAvailable,
                       ( PULARGE_INTEGER ) &TotalNumberOfBytes, ( PULARGE_INTEGER ) &TotalNumberOfFreeBytes ) , -1, 4 );

   hb_storvnll( FreeBytesAvailable, -1, 1 );
   hb_storvnll( TotalNumberOfBytes, -1, 2 );
   hb_storvnll( TotalNumberOfFreeBytes, -1, 3 );
}


Por otra parte , esto funciona perfectamante al anular los mensajes de error :
Code (fw): Select all Collapse
 LOCAL nSetErrorMode := SETERRORMODE( 1 )
 Local   aUnidades:=aDrives()
 nSetErrorMode := SETERRORMODE( nSetErrorMode )
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Reconocer puerta USB
Posted: Wed Oct 03, 2012 03:26 PM
mastintin wrote:
FiveWiDi wrote:
Creo que con las funciones que os he dejado os funcionar谩 para un lector de targetas.
Lo acabo de probar con un lector de 4 targetas y solo muestra la unidad en la que est谩 insertada la targeta.

:-)


FiveWidi , pues me devuelve que la funcion SETERRORMODE no la encuentra , por otro lado si la anulo tambien falta la funcion GetDiskFreeSpace() que ha sido sustituida por GetDiskFreeSpaceEx() .
Usando esta ultima funcion ( que devuelve el espacio libre ) ,genera el mismo error que aDrives() y ademas devuelve que tiene espacio libre en unidades ( lectoras de tarjeta) que no tienen tarjeta insertada.

Tendremos que seguir buscando la soluci贸n. Gracias por el apunte.


He a帽adido estas funciones en el post de m谩s arriba que contienen las funciones que menciono.

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Continue the discussion