Replace Scripting.FileSystemObject MoveFile with Win32API equivalent

This commit is contained in:
fdbozzo
2017-02-18 16:11:01 +01:00
parent ba0c735883
commit 2aac428525
6 changed files with 51 additions and 17 deletions

View File

@@ -45,19 +45,34 @@ RETURN lcFileName
DEFINE CLASS cl_FileName_Caps AS Custom
PROCEDURE INIT
DECLARE INTEGER MoveFile IN KERNEL32.DLL STRING lpExistingFileName, STRING lpNewFileName
DECLARE INTEGER GetLastError IN KERNEL32.DLL
* DOCUMENTACI<43>N: https://msdn.microsoft.com/en-us/library/windows/desktop/ms679351(v=vs.85).aspx
DECLARE INTEGER FormatMessage IN KERNEL32.DLL INTEGER dwFlags, INTEGER lpSource, INTEGER dwMessageId ;
, INTEGER dwLanguageId, STRING @lpBuffer, INTEGER nSize, INTEGER Arguments
_SCREEN.AddProperty("ExitCodeFNC",0)
ENDPROC
PROCEDURE Capitalize
LPARAMETERS tcFileName, tcFileMask, tcFileMaskType, tcLog, tlRelanzarError, tcDontShowErrors
TRY
LOCAL loEx AS EXCEPTION, laMasks(1,4), lcDefinition, lcFileDef, lcMaskDef, laLines(1), lcMenErr ;
, I, X, lcName, lcExt, lcPath, lcFileName, laFile(1,5), lcLogFile, lcSys16, lnPosProg ;
, loFSO AS Scripting.FileSystemObject
, I, X, lcName, lcExt, lcPath, lcFileName, laFile(1,5), lcLogFile, lcSys16, lnPosProg, lnRet
lnRet = 0
loEx = NULL
loFSO = CREATEOBJECT('Scripting.FileSystemObject')
tcFileMaskType = EVL(tcFileMaskType,'M')
lcFileName = tcFileName
lcLogFile = FORCEEXT(SYS(16),'LOG')
lcSys16 = SYS(16)
IF LEFT(lcSys16,10) == 'PROCEDURE '
lnPosProg = AT(" ", lcSys16, 2) + 1
ELSE
lnPosProg = 1
ENDIF
lcLogFile = FORCEEXT( SUBSTR( lcSys16, lnPosProg ), 'LOG' )
tcLog = ''
tcDontShowErrors = EVL( tcDontShowErrors, '0' )
@@ -66,13 +81,6 @@ DEFINE CLASS cl_FileName_Caps AS Custom
tcLog = tcLog + CR_LF + '- No hay m<>scara definida ni archivo de configuraci<63>n'
EXIT && No se indic<69> nada que hacer
ELSE
lcSys16 = SYS(16)
IF LEFT(lcSys16,10) == 'PROCEDURE '
lnPosProg = AT(" ", lcSys16, 2) + 1
ELSE
lnPosProg = 1
ENDIF
tcFileMask = FORCEEXT( SUBSTR( lcSys16, lnPosProg ), 'CFG' )
tcLog = tcLog + CR_LF + '- Se usar<61> el archivo de configuraci<63>n [' + tcFileMask + ']'
IF NOT FILE(tcFileMask)
@@ -163,9 +171,19 @@ DEFINE CLASS cl_FileName_Caps AS Custom
EXIT
ENDIF
ENDFOR
*MESSAGEBOX( 'lcLogFile = ' + TRANSFORM(lcLogFile),0+4096, 'Error' )
IF ADIR( laFile, lcFileName, '', 1 ) > 0 AND laFile(1,1) <> JUSTFNAME(lcFileName)
loFSO.MoveFile( FORCEPATH( laFile(1,1), JUSTPATH(lcFileName) ), lcFileName )
lnRet = MoveFile( FORCEPATH( laFile(1,1), JUSTPATH(lcFileName) ), lcFileName )
*MESSAGEBOX('(MoveFile) lnRet = ' + TRANSFORM(lnRet),0+4096, 'Error')
IF lnRet = 0 && Failed
lnRet = GetLastError()
*MESSAGEBOX('(GetLastError) lnRet = ' + TRANSFORM(lnRet),0+4096, 'Error')
ERROR 'MoveFile'
ENDIF
tcLog = tcLog + CR_LF + ' => Se renombrar<61> a [' + lcFileName + ']'
ELSE
tcLog = tcLog + CR_LF + ' => No se renombrar<61> a [' + lcFileName + '] porque ya estaba correcto.'
@@ -173,6 +191,19 @@ DEFINE CLASS cl_FileName_Caps AS Custom
CATCH TO loEx
_SCREEN.ExitCodeFNC = loEx.ErrorNo
IF loEx.ErrorNo = 1098 && User defined error
IF LOWER(loEx.Message) == 'movefile'
* SE OBTIENE EL MENSAJE DE ERROR DEL SISTEMA CORRESPONDIENTE A GetLastError()
* FORMAT_MESSAGE_FROM_SYSTEM 0x00001000
LOCAL lnRetLen, lpBuffer
lpBuffer = REPLICATE(CHR(0),256)
lnRetLen = FormatMessage(0x00001000,0,lnRet,0,@lpBuffer,256,0)
loEx.Message = LEFT(lpBuffer, lnRetLen)
ENDIF
ENDIF
IF tlRelanzarError THEN
THROW
ELSE
@@ -190,7 +221,6 @@ DEFINE CLASS cl_FileName_Caps AS Custom
ENDIF
FINALLY
loFSO = NULL
tcFileName = lcFileName
*-- Si existe FileName_Caps.LOG, lo actualiza