Para quem não acompa Harbour-Devel, vou resumir aqui, os desenvolvedores do Harbour informaram que essas funções do xharbour foram mal implementas, e que pode usar a função direto com o aplicativo que usa ela, então é só colocar a função abaixo em algum .PRG seu que já resolve:
Código: Selecionar todos
#include "fileio.ch"
#include "common.ch"
*----------------------------------------------------------------------------
FUNCTION FileValid( cFileName, nMaxName, nMaxExt, lWithoutExt, lSpaceInName )
*----------------------------------------------------------------------------
/*
This function return by default, the MS-DOS valid file name (8x3) or an other
format defined by user in accordance with <nMaxName> and <nMaxExt> values.
nMaxName, nMaxExt, lWithoutExt and lSpaceInName are xHarbour extensions.
*/
Local lRet := .T.
Local cName := ""
Local cExt := ""
Local i := 0
Local cInvalid := ""
Local nDecimalPoint := 0
Local nFileLen := 0
default cFileName to ""
default nMaxName to 8 // max file name len.
default nMaxExt to 3 // max extension name len.
default lWithoutExt to .T. // allow file name without extension.
default lSpaceInName to .F. // allow space char in file name.
if !IsCharacter(cFileName) .or. Empty(cFileName)
Return .F.
endif
if !IsNumber(nMaxName)
nMaxName := 8
endif
if !IsNumber(nMaxExt)
nMaxExt := 3
endif
if !IsLogical(lWithoutExt)
lWithoutExt := .T.
endif
if !IsLogical(lSpaceInName)
lSpaceInName := .F.
endif
if nMaxName <= 0
Return .F.
endif
if nMaxExt <= 0
nMaxExt := 0
lWithoutExt := .T.
endif
for i := 0 to 255
if (i>=0 .and. i<=32) .or.;
i=34 .or.;
(i>=42 .and. i<=44) .or.;
(i>=46 .and. i<=47) .or.;
(i>=58 .and. i<=63) .or.;
(i>=91 .and. i<=93) .or.;
i=124 .or. i=127
cInvalid += chr(i)
endif
next
if lSpaceInName
cInvalid := StrTran(cInvalid," ","")
endif
cFileName := Rtrim(cFileName)
nDecimalPoint := At(".",cFileName)
nFileLen := Len( cFileName )
if nFileLen=0 .or. nFileLen > (nMaxName+nMaxExt+1)
lRet := .F.
elseif nDecimalPoint > (nMaxName+1)
lRet := .F.
elseif nDecimalPoint > 0 .and. nMaxExt = 0
lRet := .F.
elseif nDecimalPoint > 0 .and. nDecimalPoint <= (nMaxName+1)
cName := SubStr(cFileName,1, nDecimalPoint-1 )
cExt := SubStr(cFileName,nDecimalPoint+1 )
if empty(cName) .or. ( !lWithoutExt .and. empty(cExt) )
lRet := .F.
endif
elseif nDecimalPoint=0 .and. !lWithoutExt
lRet := .F.
elseif nDecimalPoint=0 .and. nFileLen > nMaxName
lRet := .F.
elseif nDecimalPoint=0 .and. nFileLen <= nMaxName
cName := cFileName
endif
if lRet
if !empty(cName)
if Len(cName) > nMaxName
lRet := .F.
endif
else
lRet := .F.
endif
if lRet .and. ( empty(cExt) .and. !lWithoutExt )
lRet := .F.
endif
if lRet .and. !empty(cExt)
if Len(cExt) > nMaxExt
lRet := .F.
endif
endif
endif
if lRet
for i := 1 to Len(cName)
if SubStr(cName,i,1) $ cInvalid
lRet := .F.
exit
endif
next
if lRet .and. !empty(cExt)
for i := 1 to Len(cExt)
if SubStr(cExt,i,1) $ cInvalid
lRet := .F.
exit
endif
next
endif
endif
Return (lRet)



