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 dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.116
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

No me refería yo tanto a la función "GetDriveType" con esto último que he dicho, sino a obtener la lista de unidades disponibles, por ejemplo, con un código similar a este. De este modo, antes de comprobar que un archivo o directorio exista (con lo que nos exponemos al error que comentas), digo, podremos comprobar que existe realmente la unidad en cuestión. Es decir, tú obtienes una lista como:

Código:
C:\
D:\
E:\
Entonces, si tú esperas la unidad en "I:\", ya con la anterior lista puedes comprobar que dicha unidad no se encuentra entre las disponibles. En todo caso, podrías intentar también entrarle por evitar el error que obtienes, bien con alguna directiva de compilación de Delphi, bien utilizando alguna función del API de Windows... pero lamento no poder darte ahora mismo más información sobre esto último.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #2  
Antiguo 09-12-2012
beginner01 beginner01 is offline
Miembro
NULL
 
Registrado: mar 2011
Ubicación: República Dominicana
Posts: 181
Poder: 14
beginner01 Va por buen camino
Hola.

Prueba con este código.

Código Delphi [-]
var
   Letra: Char;
   OldErrorMode: word;
begin

  OldErrorMode:= SetErrorMode(SEM_FAILCRITICALERRORS);
  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;

  finally
    SetErrorMode(OldErrorMode);
  end;

end;

SetErrorMode MSDN
Responder Con Cita
  #3  
Antiguo 09-12-2012
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
champy,

Revisa este código:
Código Delphi [-]
Procedure GetDrive(FileName : String);
var
  Driver: Pchar;
  i, Length: Integer;
  SearchFile : Boolean;

begin

   SearchFile := False;
   GetMem(Driver, 100);
   Length := GetLogicalDriveStrings(100, Driver);

   for i := 0 to Length-1 do
   begin
      if GetDriveType(Pchar(Driver[i] + ':\')) = DRIVE_REMOVABLE then
      begin
         try
            If FileExists(Driver[i] + ':\' + FileName) then
            begin
               MessageDlg('Archivo Sincronizado en Medio Removible', mtinformation, [mbok], 0);
               FreeMem(Driver);
               SearchFile := True;
               break;
            end;
         except
            MessageDlg('Error de I/O', mtinformation, [mbok], 0);
            FreeMem(Driver);
            exit;
         end;
      end;
   end;

   if not Searchfile then
      MessageDlg('Archivo No Sincronizado en Medio Removible', mtinformation, [mbok], 0)

end;
El código anterior busca en todos los medios activos y de tipo removible un archivo determinado hasta hallar la primera ocurrencia o finalizar los drivers activos, fue probado con medios USB y Tarjetas MicroSD vía USB y funciona correctamente.

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 09-12-2012 a las 21:19:59.
Responder Con Cita
  #4  
Antiguo 09-12-2012
Avatar de champy
champy champy is offline
Miembro
 
Registrado: sep 2003
Ubicación: Alicante, España
Posts: 75
Poder: 22
champy Va por buen camino
Acabo de aterrizar en casa y voy a probarlo ahora mismo. En un ratito cuento algo. Gracias por el aporte
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: 22
champy Va por buen camino
No hay forma.

Con la comprobación de DEC, la unidad "E:\" en mi caso, aparece como disponible aunque el medio no esté presente.

y con los ejemplos de Beginner y nlsgarcia sigo obteniendo la maldita excepcion.

He encontrado una forma de averiguar si la unidad está o no montada sin obtener el mensaje de error, aunque me parece bastante cutre y no se muy bien como aplicarla.

Código Delphi [-]
WinExec( Pchar('COMMAND.COM C\ DIR '+Letra+':\ '), SW_SHOWNORMAL);

Si la unidad está montada, el dir hace lo debido.
Pero si no está presente o montada la tarjeta retorna el mensaje : El dispositivo no está listo

Si pudiese recuperar ese mensaje de salida del DIR para comprobarlo, aunque sea una solución cutre.... al menos tendría una solución temporal hasta encontrar algo mejor. ¿Alguna sujerencia?

He intentado hacer un "Dir e:\ >> rutadeunfichero.txt" para guardar la salida en texto y luego poder cargarla desde la aplicación pero por lo visto en el msdos de Vista-7 está opción no sirve, se me están acabando las ideas.
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: 22
champy Va por buen camino
Cita:
Empezado por nlsgarcia Ver Mensaje
champy,
fue probado con medios USB y Tarjetas MicroSD vía USB y funciona correctamente.
Lo estoy probando con un teléfono android, que a los efectos debería hacer el papel de un lector multitarjetas por USB pero en el momento de conectarlo la tarjeta está capturada por el teléfono (Solo cargar) y por tanto el medio lo da como que no está presente aunque ya le asigna una letra, E: en mi caso.

Una vez pongo el teléfono en modo "unidad de disco" la tarjeta se monta y todo va bien, pero para ese momento ya ha saltado la excepcion como 1 millon de veces.

De todos modos se agradece el aporte
Responder Con Cita
  #7  
Antiguo 09-12-2012
beginner01 beginner01 is offline
Miembro
NULL
 
Registrado: mar 2011
Ubicación: República Dominicana
Posts: 181
Poder: 14
beginner01 Va por buen camino
Hola.

Revisaste el enlace que te dejé? hay varios "flags" que se le pueden pasar a la función según el tipo de error que tengas. En mi caso funciono con SEM_FAILCRITICALERRORS pero en tu caso puedes probar con las demás o leer la explicación que dan a ver si te sirve.
Responder Con Cita
  #8  
Antiguo 10-12-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola champy.

Proba de este modo:
Código Delphi [-]
function MicroSDPresent: Boolean;
var
  i    : char;
  FName: string;
  Error: LongWord;
begin
  Error := SetErrorMode(SEM_FAILCRITICALERRORS);
  Result:= False;
  for i := 'D' to 'Z' do
  begin
    if GetDriveType(PChar(i+':\')) = DRIVE_REMOVABLE then
      Result:=  CreateFile(PChar(Format('\\.\%s:\%s',[i,'prueba.txt'])),
      GENERIC_READ, 0, nil, CREATE_ALWAYS,
      FILE_ATTRIBUTE_NORMAL, 0) <> INVALID_HANDLE_VALUE;
  end;
  SetErrorMode(Error);
end;

// llamada:
...
begin
  if MicroSDPresent then
    ShowMessage('MicroSD presente')
  else
    ShowMessage('MicroSD ausente');
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 10-12-2012
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
champy,

Revisa este código:
Código Delphi [-]
Procedure GetDrive(FileName : String);
var
   Driver: Pchar;
   i, Length: Integer;
   SearchFile : Boolean;
   OldErrorMode: word;

begin

   OldErrorMode:= SetErrorMode(SEM_NOOPENFILEERRORBOX);

   SearchFile := False;
   GetMem(Driver, 100);
   Length := GetLogicalDriveStrings(100, Driver);

   try
      for i := 0 to Length-1 do
      begin
         if GetDriveType(Pchar(Driver[i] + ':\')) = DRIVE_REMOVABLE then
         begin
            If FileExists(Driver[i] + ':\' + FileName) then
            begin
               MessageDlg('Archivo Sincronizado en Medio Removible', mtinformation, [mbok], 0);
               SearchFile := True;
               break;
            end;
         end;
      end;
   finally
      SetErrorMode(OldErrorMode);
      FreeMem(Driver);
      if not Searchfile then
         MessageDlg('Archivo No Sincronizado en Medio Removible', mtinformation, [mbok], 0)
   end;

end;
Esta variante incluye las recomendaciones de beginner01 con el flag SEM_NOOPENFILEERRORBOX.

Revisa esta información:
Cita:
SEM_NOOPENFILEERRORBOX:
If this flag is set, the operating system does not display a message box when it fails to find a a file. Instead, the error is returned to the calling process.
Espero sea útil

Nelson.
Responder Con Cita
  #10  
Antiguo 10-12-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola champy.

Mira... voy a retocar un poco la función que hice a las apuradas ya que deja el archivo temporal en la tarjeta de memoria.
Y creo que a otros, tanto como a mí, podría no gustarles ese detalle...

Así que la nueva versión es:
Código Delphi [-]
function MicroSDPresent: Boolean;
var
  i    : char;
  FName: string;
  Error: LongWord;
  Hnd  : THandle;
begin
 Error := SetErrorMode(SEM_FAILCRITICALERRORS);
  Result:= False;
  for i := 'D' to 'Z' do
    if GetDriveType(PChar(i+':\')) = DRIVE_REMOVABLE then
    begin
      FName:= Format('\\.\%s:\%s',[i,'@@@prueba@@@.txt']);
      Hnd:= CreateFile(PChar(FName),
              GENERIC_READ, 0, nil, CREATE_ALWAYS,
              FILE_ATTRIBUTE_NORMAL, 0);
      if Hnd <> INVALID_HANDLE_VALUE then
      begin
        Result := True;
        CloseHandle(Hnd);
        DeleteFile(PChar(FName));
      end;
    end;
  SetErrorMode(Error);
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 10-12-2012 a las 03:36:37. Razón: ortografía
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:56:29.


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