Função DiskReady() em Harbour

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Função DiskReady() em Harbour

Mensagem por Jairo Maia »

Olá Pessoal,

Em xHarbour, na lib HBCT:
A Função IsDisk() retorna se o Drive existe.
A Função DriveType() retorna o tipo do Drive
A Função DiskReady() retorna se o Drive está pronto

O que não estou achando é qual função substitui a DiskReady() no Harbour. Porque ela foi excluída da HBCT do Harbour?
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Função DiskReady() em Harbour

Mensagem por janio »

Nao tem como pegar os fontes em .c dessa função? ae vc poderia colocar em qq prg seu

Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Função DiskReady() em Harbour

Mensagem por Kapiaba »

Veja se ajuda:

Código: Selecionar todos

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

#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..
Com 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

nSetErrorMode := SETERRORMODE( 1 )
lExist := GetDiskFreeSpace( Left( cDisk, 1) + ":\" )
SETERRORMODE( nSetErrorMode )

Return lExist
/* *************************** */
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Função DiskReady() em Harbour

Mensagem por Jairo Maia »

Olá Jânio,
janio escreveu:Nao tem como pegar os fontes em .c dessa função? ae vc poderia colocar em qq prg seu
Jânio, desculpe ai meu lapso... rs... Deu certo. Valeu a dica!

Minha função de backup verifica todas as unidades disponíveis e apresenta um menu para o usuário escolher onde será efetuado o Backup, e avisa se a unidade é Fixa, Removível ou da Rede (desde que mapeada).

Acontece que quando verifica a unidade de DVD, emite a mensagem do Windows solicitando para o usuário inserir um disco, e precisa clicar em cancelar. Isto acontece também com a unidade do Certificado. Eu queria a função DiskReady(), porque com ela tenho como neutralizar essa mensagem:
lMode:
True = Windows/DOS mode. If a disk is not ready, open a dialog.
False = Bios mode. If a disk is not ready don´t open a dialog.
Mas para minha surpresa, essa função é em puro código xBase. Vejam:

Código: Selecionar todos

*-----------------------------------
FUNCTION DiskReady( cDrive , lMode )
*-----------------------------------
   LOCAL lReturn, cCurrent := TrueName(".")

   //default( @lMode , .F. )
   lMode := If( Empty( lMode ), .F., lMode )
   
   // lMode -> True = Windows/DOS mode. If a disk is not ready, open a dialog.
   //          False = Bios mode. If a disk is not ready don´t open a dialog.

   IF empty(cDrive) .OR. !isalpha(cDrive)
      cDrive := cCurrent
   ENDIF

   IF valtype(lMode) != "L"
      lMode := .F.
   ENDIF

   IF !lMode
      // Windows/DOS access mode. xHarbour RTL. Source is in "dirdrive.c".
      lReturn := DiskChange( cDrive )
      IF lReturn
         DiskChange( cCurrent )
      ENDIF
   ELSE
      // Bios access mode. xHarbour RTL. Source is in "dirdrive.c".
      lReturn := IsDisk( cDrive )
   ENDIF

RETURN ( lReturn )
Mensagem Editada em: 06/11/2014 - 07h59m.
Para que essa função funcione corretamente em Harbour, a linha 4 que estava assim:

Código: Selecionar todos

LOCAL lReturn, cCurrent := DiskName()
Foi substituída por:

Código: Selecionar todos

LOCAL lReturn, cCurrent := TrueName(".")
Olá Kapiaba,
Obrigado pela atenção, mas os códigos que você postou não têm esse efeito. Obrigado.

Nota: O pulo do gato esta na DiskChange().

Tag: DiskReady

[Problema Resolvido]
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Responder