Opa,
clrod escreveu:Se conseguir dar algum pitaco em inglês mesmo que precise usar um tradutor, eu aconselho você escrever na lista dos desenvolvedores do Harbour sobre essa questão dos diretórios no Linux, o pessoal é bem aberto.
Acredito que a grande vantagem de ser opensource é eu poder alterar e não ter que esperar pela turma de desenvolvedores, que também devem ter suas ocupações e pode levar tempo. Mas posso mandar como sugestão, apesar de não ser um bug!
De qualquer forma, não sei se vale a pena escrever lá, porque me parece uma particularidade minha. A questão é que no linux arquivos que começam com ponto não são retornados pela máscara ( * ), e nem pela máscara ( *.* ). O harbour define HB_OS_ALLFILE_MASK para Linux como ( * ), o que está CORRETO. E como oculto também não é atributo, a inclusão deles pelo parâmentro "H" (hidden) não é possível.
Para corrigir, ou melhor dizendo, adpatar as máscaras, eu alterei de modo que ao passar "H" no segundo parâmentro, ele inclua os ocultos, memso que isso não seja um atributo.
O arquivo em questão é
/usr/src/harbour-2.0.0/src/rtl/direct.c.
As alterações estão entre a linha 97 e 120, mas precisa de uns retoques, porque fiz na pressa meio que só pra funcionar pro que eu precisava na hora. Coisa simples, que mais tarde eu faço e se for o caso mando lá pro pessoal.
Código: Selecionar todos
HB_FUNC( DIRECTORY )
{
const char * szDirSpec = hb_parc( 1 );
const char * szAttributes = hb_parc( 2 );
char * pszFree = NULL;
ULONG ulMask;
PHB_ITEM pDir = hb_itemArrayNew( 0 );
PHB_FFIND ffind;
/* Get the passed attributes and convert them to Harbour Flags */
ulMask = HB_FA_ARCHIVE
| HB_FA_READONLY
| HB_FA_DEVICE
| HB_FA_TEMPORARY
| HB_FA_SPARSE
| HB_FA_REPARSE
| HB_FA_COMPRESSED
| HB_FA_OFFLINE
| HB_FA_NOTINDEXED
| HB_FA_ENCRYPTED
| HB_FA_VOLCOMP;
if( szAttributes && *szAttributes )
{
if( ( ulMask |= hb_fsAttrEncode( szAttributes ) ) & HB_FA_LABEL )
{
/* NOTE: This is Clipper Doc compatible. (not operationally) */
ulMask = HB_FA_LABEL;
}
}
if( szDirSpec && *szDirSpec )
{
szDirSpec = hb_fsNameConv( szDirSpec, &pszFree );
if( ulMask != HB_FA_LABEL )
{
if( *szDirSpec )
{
/* CA-Cl*pper compatible behavior - add all file mask when
* last character is directory or drive separator
*/
int iLen = strlen( szDirSpec ) - 1;
#ifdef HB_OS_HAS_DRIVE_LETTER
if( szDirSpec[ iLen ] == HB_OS_PATH_DELIM_CHR ||
szDirSpec[ iLen ] == HB_OS_DRIVE_DELIM_CHR )
#else
if( szDirSpec[ iLen ] == HB_OS_PATH_DELIM_CHR )
#endif
{
if( pszFree )
{
char * pszTemp = hb_xstrcpy( NULL, szDirSpec, HB_OS_ALLFILE_MASK, NULL );
hb_xfree( pszFree );
szDirSpec = pszFree = pszTemp;
}
else
{
szDirSpec = pszFree = hb_xstrcpy( NULL, szDirSpec, HB_OS_ALLFILE_MASK, NULL );
}
}
}
else
szDirSpec = HB_OS_ALLFILE_MASK;
}
}
else
szDirSpec = HB_OS_ALLFILE_MASK;
/* Get the file list */
if( ( ffind = hb_fsFindFirst( szDirSpec, ulMask ) ) != NULL )
{
PHB_ITEM pSubarray = hb_itemNew( NULL );
do
{
char buffer[ 32 ];
hb_arrayNew( pSubarray, F_LEN );
hb_arraySetC ( pSubarray, F_NAME, ffind->szName );
hb_arraySetNInt( pSubarray, F_SIZE, ffind->size );
hb_arraySetDL ( pSubarray, F_DATE, ffind->lDate );
hb_arraySetC ( pSubarray, F_TIME, ffind->szTime );
hb_arraySetC ( pSubarray, F_ATTR, hb_fsAttrDecode( ffind->attr, buffer ) );
/* Don't exit when array limit is reached */
hb_arrayAddForward( pDir, pSubarray );
}
while( hb_fsFindNext( ffind ) );
hb_itemRelease( pSubarray );
hb_fsFindClose( ffind );
}
#ifdef HB_OS_UNIX
if( strstr(szAttributes,"H") != 0 )
{
szDirSpec = hb_xstrcpy( NULL,".*", szDirSpec, NULL );
if( ( ffind = hb_fsFindFirst(szDirSpec, ulMask ) ) != NULL )
{
PHB_ITEM pSubarray = hb_itemNew( NULL );
do
{
char buffer[ 32 ];
hb_arrayNew( pSubarray, F_LEN );
hb_arraySetC ( pSubarray, F_NAME, ffind->szName );
hb_arraySetNInt( pSubarray, F_SIZE, ffind->size );
hb_arraySetDL ( pSubarray, F_DATE, ffind->lDate );
hb_arraySetC ( pSubarray, F_TIME, ffind->szTime );
hb_arraySetC ( pSubarray, F_ATTR, hb_fsAttrDecode( ffind->attr, buffer ) );
hb_arrayAddForward( pDir, pSubarray );
}
while( hb_fsFindNext( ffind ) );
hb_itemRelease( pSubarray );
hb_fsFindClose( ffind );
}
}
#endif
if( pszFree )
hb_xfree( pszFree );
hb_itemReturnRelease( pDir );
}
Bom, de repente pode ser útil pra mais alguém...
Abraços!