No hay disco en la unidad (USB) (Resuelto)

No hay disco en la unidad (USB) (Resuelto)

Postby RodolfoRBG » Wed Oct 28, 2009 3:54 am

Al utilizar la rutina para detectar las unidades USB que estan conectadas al computador, busco un archivo (IF FILE...) para ver si es el USB Pendrive que se requiere, pero al hacerlo en cada unidad en la que no tiene algun USB conectado, me aparece el siguiente aviso:

"No hay disco en la unidad. Inserte un disco en la unidad \Device\Harddisk1\DR1"

existe alguna otra forma en que busque el USB pendrive que se requiere sin que tenga que aparecer este error?

Salu2
Last edited by RodolfoRBG on Fri Aug 24, 2012 9:47 pm, edited 1 time in total.
RodolfoRBG
FWH 1307, xHarbour123 BCC582
rodolfoerbg@gmail.com
User avatar
RodolfoRBG
 
Posts: 257
Joined: Tue May 16, 2006 4:46 pm
Location: San Luis Potosi, SLP, Mexico

Re: No hay disco en la unidad (USB)

Postby Manuel Valdenebro » Wed Oct 28, 2009 4:01 am

¿Y que rutina estás utilizando?
Un saludo

Manuel
User avatar
Manuel Valdenebro
 
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Re: No hay disco en la unidad (USB)

Postby RodolfoRBG » Wed Oct 28, 2009 4:05 am

La funcion GetUsbDrives() que viene dentro del archivo de ejemplos llamado Protect.PRG
RodolfoRBG
FWH 1307, xHarbour123 BCC582
rodolfoerbg@gmail.com
User avatar
RodolfoRBG
 
Posts: 257
Joined: Tue May 16, 2006 4:46 pm
Location: San Luis Potosi, SLP, Mexico

Re: No hay disco en la unidad (USB)

Postby mmercado » Wed Oct 28, 2009 1:00 pm

Hola Rodolfo:
RodolfoRBG wrote:Al utilizar la rutina para detectar las unidades USB que estan conectadas al computador, busco un archivo (IF FILE...) para ver si es el USB Pendrive que se requiere, pero al hacerlo en cada unidad en la que no tiene algun USB conectado, me aparece el siguiente aviso:

"No hay disco en la unidad. Inserte un disco en la unidad \Device\Harddisk1\DR1"

En la rutina que mencionas solo se consideran las unidades que tienen instalada una memoria flash.

Si la memoria flash que estás usando no está dañada, es muy probable la presencia de un virus en tu pc, revisa los procesos activos para tratar de identificarlo.

Un abrazo.
manuelmercado at prodigy dot net dot mx
User avatar
mmercado
 
Posts: 782
Joined: Wed Dec 19, 2007 7:50 am
Location: Salamanca, Gto., México

Re: No hay disco en la unidad (USB)

Postby RodolfoRBG » Wed Oct 28, 2009 2:41 pm

Esta es la rutina:

nBitDrives:=GetLogicalDrives()
FOR N:=1 TO 32
IF lAnd(nBitDrives,2^(N-1))
cDrive:=CHR(ASC("A")-1+N)+":" //Letra asignada al dispositivo
IF N<>1 .AND. GetDriveType(cDrive)==2 //(2=USBDrive/3=HD/5=DVD)
IF FILE(cDrive+"\TorosDat.DBF") <--Aqui marca el error cuando no hay un USB conectado
AADD(aUSBs,{cDrive})
ENDIF
ENDIF
ENDIF
NEXT

en las unidades en que SI existe un USB conectado, no aparece el error.
RodolfoRBG
FWH 1307, xHarbour123 BCC582
rodolfoerbg@gmail.com
User avatar
RodolfoRBG
 
Posts: 257
Joined: Tue May 16, 2006 4:46 pm
Location: San Luis Potosi, SLP, Mexico

Re: No hay disco en la unidad (USB)

Postby JoseGS » Wed Oct 28, 2009 3:37 pm

No empieces buscando la unidad A ni B, el bios piensa que son unidades de disket...

Prueba asi:
FOR N=68 TO 90
cFILE:=CHR(N)+':\TorosDat.DBF'
IF FILE((cFILE))
AADD(aUSBs,SUBSTR(cFILE,1,2) )
ENDIF
NEXT
MSGLIST(aUSBs)
JoseGS
 
Posts: 205
Joined: Wed Sep 02, 2009 3:11 am

Re: No hay disco en la unidad (USB)

Postby RodolfoRBG » Wed Oct 28, 2009 3:51 pm

Con la instruccion

IF N<>1 .AND. GetDriveType(cDrive)==2 //(2=USBDrive/3=HD/5=DVD)

se descartan las unidades A y B asi que aun iniciando con la unidad "C" aparece el error solo cuando un USB PenDrive esta conectado.
RodolfoRBG
FWH 1307, xHarbour123 BCC582
rodolfoerbg@gmail.com
User avatar
RodolfoRBG
 
Posts: 257
Joined: Tue May 16, 2006 4:46 pm
Location: San Luis Potosi, SLP, Mexico

Re: No hay disco en la unidad (USB)

Postby JoseGS » Wed Oct 28, 2009 4:21 pm

La idea es obtener un listado de las unidades disponibles o simplemente detectar en cual de las posibles unidades se encuentra en archivo ToroDat.dbf ?
JoseGS
 
Posts: 205
Joined: Wed Sep 02, 2009 3:11 am

Re: No hay disco en la unidad (USB)

Postby acuellar » Wed Oct 28, 2009 4:23 pm

Rodolfo

Hazlo asi:
Code: Select all  Expand view

  Local aUnidades:= aDrives() //carga las unidades
    FOR xI=1 TO LEN( aUnidades )
            IF GetDriveType( aUnidades[xI] )=2
                ?"Es USB"
           ELSEIF GetDriveType( aUnidades[xI] )=4
                ?"Unidad Mapeada"
           ELSEIF GetDriveType( aUnidades[xI] )=5
               ?"CD/DVD"
            ENDif
      NEXT xI
 

Espero te sirva

Saludos

Adhemar
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1643
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: No hay disco en la unidad (USB)

Postby RodolfoRBG » Wed Oct 28, 2009 4:38 pm

La idea inicial es localizar si esta conectado un USB Pendrive, una vez localizado, buscar si en ese (esos) existe el archivoTorosDat.DBF y ya posteriormente procesarlo.

El problema radica en que cuando intento localizar dicho archivo, si lo hace en un puerto USB en que no tiene ningun USB Pendrive conectado, me avisa que no hay disco en esa unidad.
RodolfoRBG
FWH 1307, xHarbour123 BCC582
rodolfoerbg@gmail.com
User avatar
RodolfoRBG
 
Posts: 257
Joined: Tue May 16, 2006 4:46 pm
Location: San Luis Potosi, SLP, Mexico

Re: No hay disco en la unidad (USB)

Postby acuellar » Wed Oct 28, 2009 4:48 pm

Code: Select all  Expand view

Local aUnidades:= aDrives() //carga las unidades
    FOR xI=1 TO LEN( aUnidades )
            IF GetDriveType( aUnidades[xI] )=2
                ?"Es USB"
                If File(Left(aUnidades[xI],2)+"\TorosDat.DBF')
                       ?"
Existe"
                Else
                      ?"
No existe"
               Endif
           ELSEIF GetDriveType( aUnidades[xI] )=4
                ?"
Unidad Mapeada"
           ELSEIF GetDriveType( aUnidades[xI] )=5
               ?"
CD/DVD"
            ENDif
      NEXT xI
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1643
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: No hay disco en la unidad (USB)

Postby RodolfoRBG » Wed Oct 28, 2009 6:17 pm

Gracias acuellar por tu aportacion, pero con el ejemplo que me envias, me marca como usb las unidades F,G,H,I,K siendo en la K en donde esta localizado el Pendrive. Con esto, me marca el aviso de que no hay disco al ejecutar el IF FILE.... en todas las unidades excepto en la unidad K, donde me avisa que si existe el archivo.

Con esto supongo que reconoce los 5 puertos como USBs aunque no exista un Pendrive conectado y al intentar verificar si existe ahi el archivo, me avisa que no hay disco.
RodolfoRBG
FWH 1307, xHarbour123 BCC582
rodolfoerbg@gmail.com
User avatar
RodolfoRBG
 
Posts: 257
Joined: Tue May 16, 2006 4:46 pm
Location: San Luis Potosi, SLP, Mexico

Re: No hay disco en la unidad (USB)

Postby FiveWiDi » Wed Oct 28, 2009 7:23 pm

Hola,

Busca sus números de serie, si lo hay es que hay un pendcrive pinchado.

Aquí te dejo rutinas que a mi me sirven de protección contra usuarios no autorizados.

Creo que más en concreto la función aUSBDrive().

Saludos
Carlos G.
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.

 -En W2000 no es operativa para usuarios no Administradores.

 -La variable STATIC aUSB contiene el indicador lógico de 'DEMO' en el
  primer elemento, y los números de serie i descriptivo (en una array de
  2 elementos) de los Pendrive (USB) autorizados para usar la aplicación
  sin límites.

 -INICIALMENTE el primer elemento de aUSB debe ser siempre .T.

 -La función WarningDemo() es la que se puede insertar en CUALQUIER PUNTO
  o PUNTOS de la aplicación para verificar/avisar si se trata de una DEMO.
  Lo habitual es usarla con el parámetro .T. ( WarningDemo( .T. ) )
  Es esta función la que se debe modificar según las necesidades; en mi
  caso avisa si quedan menos de 2 minutos de demostración y pasados 5
  minutos cierra la aplicación.
  Otra opción es modificar esta función para que en base al valor de
  retorno (.T. o .F.), realizar lo que queramos en cualquier lugar de
  nuestra aplicación.

 -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

/* ************************ ATENCIÓ ***********************
   Números de sèrie d'USB admesos.
   El 1er. element indica si la verificació ha tingut èxit.
   Los elementos posteriores son arrays de 2 elemntos con
   los números de serie y descriptivos de los USB
   autorizados.
   Inicialmente el 1er. elemento SIEMPRE debe de ser .T.
   ----------------------------------------------------- */

STATIC aUSB := { .T., ;
                 {"077522058501D5A6", "Sense descriptiu" }, ;
                 {"0775030772C2BFF2", "Sense descriptiu" }, ;
                 {"07871044024E", "EMTEC 8 Gb (marrón)" }, ;
                 {"000AEB91EBF75A891D010114", "Kingston 16 Gb extensible (Plàstic negre)" }, ;
                 {"0799120338141B2D", "Imation Mini de 4 Gb (metall plata, Plàstic negre)" }, ;
                 {"W6YFEDS7NDAQCNKK", "Susana"} ;
               }

/* *************************** */
/* *************************** */
FUNCTION QuitApl()
CLOSE ALL
PostQuitMessage( 0 )
sysrefresh()
__quit()
Return NIl
/* *************************** */
/* *************************** */

/* Mostra missatge per indicar que s'està en modus DEMO.
   -------------------------------------------------- */

FUNCTION WarningDemo( lVerifica )
// Dia i hora inicial.
STATIC aTimeInfo := { 0, 0 }

// 3 minuts (en segons)
Local Limita := 180

// 5 minuts (en segons)
Local Limitb := 300

Local SecFromStart := 0


If lVerifica .and. !lIsDemo( )
    aUSB[1] := lIsOkUSB()
EndIf

If lIsDemo()

    // Si no s'havia capturat el moment inicial, es captura ara.
    If aTimeInfo[2] = 0
        aTimeInfo[1] := Date()
        aTimeInfo[2] := Seconds()

        MsgAlert( "Aplicació en modus DEMOSTRACIÓ." + CRLF + CRLF + ;
                  "TOTES les opcions són COMPLETAMENT operatives." + CRLF + ;
                  "La limitació és de " + Str( Limitb/60, 2, 0) + " minuts per poder operar.", ;
                  " A T E N C I Ó !" )
    EndIf

    SecFromStart := SecsFromStart( aTimeInfo[1], aTimeInfo[2] )

    If SecFromStart > Limitb
        MsgAlert( "Ha esgotat el temps de DEMOSTRACIÓ", " A T E N C I Ó !" )
        //QUIT
        // Es tanca l'aplicació.
        QuitApl()

    ElseIf SecFromStart > Limita
        MsgAlert( "Queden " + Str( (Limitb - SecFromStart) / 60, 1, 0 )  + " minuts de DEMOSTRACIÓ", " A T E N C I Ó !" )
    EndIf
EndIf

Return aUSB[1]
/* *************************** */
/* *************************** */
STATIC function SecsFromStart( dInitDate, nInitSecs ) // by hDC

local nSeconds:= Seconds()
local nDays := Date() - dInitDate

if ValType( nDays ) == "D"  // C3 temporary workaround
    nDays = Day( Date() ) - Day( dInitDate )
endif
if nDays < 0  // Surely you change the date after the beginning of the system
    return 0
endif

if nDays > 0
  nDays--
  return ( 86399 - nInitSecs ) + ( nDays * 86399 ) + nSeconds
endif

return nSeconds - nInitSecs
/* *************************** */
/* *************************** */

/* ************************************************
   Nos indica si se trata de una versión DEMO o no.
   --------------------------------------------- */

FUNCTION lIsDemo( )
/* La obtención del número de serie del USB no funciona bajo W2000 si no se
   es administrador del sistema, de ahí que si se está bajo W2000 se de por
   válido aún sin tener el USB conectado.
*/

Return !( aUSB[1] .or. IsWin2000() )
/* *************************** */
/* *************************** */

/* *********************************************************************************
   Chequea si se encuentra instalado el USB correspondiente a uno de los números de
   serie recibidos.
   ATENCIÓN: de la array aUSB el primer elemento no es tenido en
   cuenta ya que se trata del indicador de DEMO (.T. o .F.).
   ------------------------------------------------------------------------------ */

STATIC FUNCTION lIsOkUSB()
Local nContador := 0

/* El 1er. element és l'indicador de DEMO.
   ----------------------------------- */

For nContador := 2 to Len( aUSB )
    If cNumUSB2LetUSB( aUSB[ nContador ][1] ) <> ""
        Exit
    EndIf
EndFor

Return !( nContador > Len( aUSB ) )
/* *************************** */
/* *************************** */

/* *****************************************************************
   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     := ""

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 GetUSBSerial( cDrive ) == cNumUSB
                cLetter := cDrive
                Exit
            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
    Endif
Next

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

/* *****************************************************************************
   Torna el número de sèrie de l'USB escollit per ser la 'motxila' del programa.
   -------------------------------------------------------------------------- */
FUNCTION cGetSerialProtect()
Local cDriveUSB    := "
"
Local oClp         := Nil

If ( cDriveUSB := cSelectUSB( .T. ) ) <> "
"

/*
    MsgInfo( "
Identificadors autoritzats: " + cNumUSB() + CRLF + CRLF + ;
              "
L'identificador de " + cDriveUSB  + " és: " + GetUSBSerial( cDriveUSB ) + CRLF + CRLF + ;
              If( AT( GetUSBSerial( cDriveUSB ), cNumUSB() ) > 0,  "SI",  "NO") + " està autoritzat.", ;
              "A T E N C I Ó !" )
*/

    If MsgYesNo( "Identificadors autoritzats: " + cNumUSB() + CRLF + CRLF + ;
                 "L'
identificador de " + cDriveUSB  + " és: " + GetUSBSerial( cDriveUSB ) + CRLF + ;
                 "
El vol copiar al ClipBoard?" + CRLF + CRLF + ;
                 If( AT( GetUSBSerial( cDriveUSB ), cNumUSB() ) > 0,  "
SI",  "NO") + " està autoritzat.", ;
                 "
ATENCIÓ !" )

        DEFINE CLIPBOARD oClp FORMAT TEXT
        //cClp = oClp:GetText()
        oclp:Open()
        Oclp:Empty()
        SetClipboardData( 1, GetUSBSerial( cDriveUSB ) )
        oClp:End()

    EndIf

//If( AT( GetUSBSerial( cDriveUSB ), cNumUSB() ) > 0,  aUSB[1] := .T., Nil )

EndIf

Return Nil
/* *************************** */
/* *************************** */
FUNCTION cSelectUSB( lMensaje )

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

aDriveUSB := aUSBDrive()

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

    //AEval( aDriveUSB, { |DriveUSB| DriveUSB := "
&" + DriveUSB } )

    For nContador := 1 To Len( aDriveUSB )
        aDriveUSB[ nContador ] := "
&" + aDriveUSB[ nContador ]
    EndFor

    nDriveUSB := Alert( "
Unitats USB disponibles:", aDriveUSB, "Esculleixi una unitat USB" )

    If nDriveUSB > 0
        cDriveUSB := SubStr( aDriveUSB[ nDriveUSB ], 2 )
    EndIf
EndIf

//Traza(1, "
cDriveUSB=", cDriveUSB)
//Traza(1, "
aDriveUSB[ nDriveUSB ]=", aDriveUSB[ nDriveUSB ])

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

/* ******************************************
   Devuelve un CADENA de los USB autorizados.
   --------------------------------------- */
STATIC FUNCTION cNumUSB()
Local nContador := 0
Local cUSB      := "
"

/* El 1er. element és l'indicador de DEMO.
   ----------------------------------- */
For nContador := 2 to Len( aUSB )
    cUSB = cUSB + "
," + aUSB[ nContador ][1]
EndFor

Return SubStr( cUSB, 2)
/* *************************** */
/* *************************** */

/* ************************************
   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
            AAdd( aDrives, cDrive )
        Endif
    Endif
Next

Return aDrives
/* *************************** */
Un Saludo
Carlos G.

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

Re: No hay disco en la unidad (USB)

Postby JoseGS » Wed Oct 28, 2009 8:22 pm

Porque no usas el ejemplo que te he mandado. Realmente es algo muy simple.

Yo tengo una aplicacion que cada cierto tiempo con un timer comprueba la presencia de algun pendrive con un archivo especifico.

En el momento que el sistema detecta la presencia del pendrive que yo he preparado (no otro), se activan una serie de procesos sin que el usuario tenga que presionar ninguna tecla...

Incluso lo he probado estando el programa en ejecucion por medio de terminal server...

Si utilizando mi ejemplo tienes problemas, entonces ve pensando en que se trata del Windows o de tu equipo. Prueba en otra computadora y nos informas....

Chao...
JoseGS
 
Posts: 205
Joined: Wed Sep 02, 2009 3:11 am

Re: No hay disco en la unidad (USB)

Postby RodolfoRBG » Wed Oct 28, 2009 9:32 pm

Don Carlos G (FiveWiDi), utilizando el extraer el No. de serie para verificar la presencia de un USB-Drive sin que me avise que no hay disco en la unidad, funciono perfectamente. Mil gracias.

Jose GS, si use tu ejemplo pero el problema no radicaba en las unidades A y B sino en los puertos USB disponibles, que no encontraba como verificar si habia un USB-Drive conectado en ese momento sin que me avisara que en efecto en esas unidades (F,G,H,I,K) no habia nada conectado. Gracias por tu interes.

ACuellar, con tu ejemplo tambien me pasaba lo mismo, al ejecutar IF FILE.... en una unidad USB que no tenia ningun USB-Drive conectado, me avisaba que no habia disco en la unidad. Gracias tambien por tu interes.

Salu2 a To2
RodolfoRBG
FWH 1307, xHarbour123 BCC582
rodolfoerbg@gmail.com
User avatar
RodolfoRBG
 
Posts: 257
Joined: Tue May 16, 2006 4:46 pm
Location: San Luis Potosi, SLP, Mexico

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 76 guests