Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-12-2012
Avatar de champy
champy champy is offline
Miembro
 
Registrado: sep 2003
Ubicación: Alicante, España
Posts: 75
Poder: 21
champy Va por buen camino
Excepcion incontrolable al detectar medios extraibles

Buenos días ante todo. Tengo una consulta para los más manitas de por aquí.

Estoy tratando de hacer que mi aplicación detecte cuando se conecta al pc un teléfono Android para sincronizar varios datos de la tarjeta SD, para eso he utilizado algunos ejemplos que he encontré por el foro.

Código Delphi [-]
Procedure Buscar;
begin

Try
for Letra:= 'C' to 'J' do
begin
    if GetDriveType(Pchar(Letra+':\')) = DRIVE_REMOVABLE then
    begin
           //Solo es una prueba de acceder a la SD
           If FileExists(Letra+':\prueba.txt') then  ShowMessage('Tengo la SD, ahora sincronizo');
    end;
end;
Except;
End;

End;

Este ejemplo es fantástico para unidades de USB comunes, pero con las tarjetas SD o teléfonos (En solo cargar) tengo un problema, el sistema asigna la letra de la unidad aunque no este montada o no tenga medio insertado, así que cuando hago el FileExists o cualquier otro intento de acceder al contenido para ver si la tarjeta está presente, salta una excepción del sistema que no puedo controlar con Try-Except diciendo que (Inserte un disco en la unidad X: ).

La pregunta, ¿Existe alguna forma de verificar si el medio está insertado y montado antes de acceder a el para que no salte la excepción? o bien ¿Puedo controlar de alguna forma esa dichosa excepción?
Responder Con Cita
  #2  
Antiguo 09-12-2012
Avatar de champy
champy champy is offline
Miembro
 
Registrado: sep 2003
Ubicación: Alicante, España
Posts: 75
Poder: 21
champy Va por buen camino
Ya probé tambien a comprobar con un...

Código Delphi [-]
If DiskSize(N) >= 1 then   Sincronizar;

Y sí, me devuelve un -1 cuando el medio no está presente, pero esta acción tambien provoca que salte la maldita excepción.

Última edición por champy fecha: 09-12-2012 a las 08:26:02. Razón: Me confundí
Responder Con Cita
  #3  
Antiguo 09-12-2012
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Tal vez debería usarse algo distinto a "FileExists", pero, yo miraría a ver en el sentido de tratar de ser avisado cuando una nueva unidad se conecta. Encontrarás varias formas de hacerlo, por ejemplo, en el paquete TurboPower ShellShock cuentas con un componente que te avisará cuando una unidad sea añadida y/o quitada del sistema. De esta forma igual hasta el "FileExists" podría servirnos... puesto que al menos la unidad en cuestión existiría... Aunque tal vez podríamos usar un "DirectoryExists" contra la propia unidad para evitar la "excepción" que te estás encontrando.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 09-12-2012
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola de nuevo,

Estoy pensando que acaso con "DirectoryExists" pase lo mismo que con "FileExists". Existe la posibilidad de obtener todas las unidades disponibles en un momento dado, de manera que, primero de todo, veamos si la letra de la unidad que nos interesa está en la listad de unidades disponibles o no. Echa un vistazo a este hilo, por ejemplo. De todas formas sigo pensando que un "avisador" de que se añade o quita una unidad podría ser útil para el programa...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 09-12-2012
Avatar de champy
champy champy is offline
Miembro
 
Registrado: sep 2003
Ubicación: Alicante, España
Posts: 75
Poder: 21
champy Va por buen camino
La función GetDriveType me retorna DRIVE_REMOVABLE tanto si la tarjeta está montada como si no.

De hecho si miras el ejemplo que puse al iniciar el hilo verás que eso es exactamente lo que estoy comprobando para distingir la tarjeta del resto de unidades.

Código Delphi [-]
if GetDriveType(Pchar(Letra+':\')) = DRIVE_REMOVABLE then
    begin
           //Solo es una prueba de acceder a la SD
           If FileExists(Letra+':\prueba.txt') then  ShowMessage('Tengo la SD, ahora sincronizo');
    end;

Por cierto, he probado y sí, DirectoryExists tambien hace saltar la puñetera excepción de "Inserte un disco"

De todas formas se agradece la ayuda DEC.

Quizás la solución pase por el componente que posteaste hace un rato y que me notifique la inserción de la tarjeta pero me estoy debanando los sesos para tratar de compilar el Package por que me da un error de una clase no definida.
Responder Con Cita
  #6  
Antiguo 09-12-2012
Avatar de champy
champy champy is offline
Miembro
 
Registrado: sep 2003
Ubicación: Alicante, España
Posts: 75
Poder: 21
champy Va por buen camino
De todas formas, es que estoy seguro que debe haber alguna función en el API de windows que me diga si la unidad extraible tiene un medio insertado o no. Pero por más que busco no encuentro nada.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
como detecto unidades extraibles desi Internet 2 12-12-2007 15:57:41
De los reproductores de medios AzidRain La Taberna 1 02-08-2007 18:16:55
Detectar Excepcion EconvertError MasterXP Conexión con bases de datos 6 30-03-2005 06:42:55
Toshiba pela al jugador de medios de Windows roman Humor 1 28-03-2005 22:22:02
No puedo detectar la excepción "EDatabaseError" Adan Conexión con bases de datos 8 21-03-2005 20:07:24


La franja horaria es GMT +2. Ahora son las 03:12:21.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi