by Verhoven » Mon Jun 24, 2013 5:36 pm
El problema de la hora en los ficheros que se listan vía FTP es la "resolución". Según parece el protocolo FTP no tiene un estandard único al respecto y parece que según funcione el servidor la hora de actualización que te devuelve el servidor tiene una resolución u otra.
Por ejemplo, dos ficheros distintos tendrán la misma hora si la resolución es de un minuto y ambos han sufrido la última modificación dentro de ese minuto, aunque el segundo dentro de ese minuto sea distinto para cada uno de ellos.
Te dejo una función que me he tenido que fabricar para determinar el último fichero generado/modificado dentro un directorio de un servidor FTP por si te sirve para ver como determinar el último fichero generado/modificado en un directorio FTP por si te puede servir de orientación.
Mira sobre todo las funciones HB_FUNC( FTPLASTFILEINDIR ) en C y FTP_LastFileInDirectory( cMask,cIP,cUser,cPass ) en Harbour.
function FTP_LastFileInDirectory( cMask,cIP,cUser,cPass )
local hInternet, hConnect
local clastFileinDir:=space(260)
default cMask := "*.*"
hInternet = INTERNETOPEN( "Anystring", INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0 )
hConnect = INTERNETCONNECT( hInternet, cIP, INTERNET_INVALID_PORT_NUMBER, cUser, cPass, INTERNET_SERVICE_FTP, 0, 0 )
if hConnect != nil
clastFileinDir:=FTPLASTFILEINDIR(hConnect, cMask, 0, 0)
/*
if empty (clastFileinDir)
msginfo("Ningún archivo para la máscara: "+cMask)
else
msginfo("Archivo más reciente: "+lastFileinDir)
endif
*/
endif
INTERNETCLOSEHANDLE( hConnect )
INTERNETCLOSEHANDLE( hInternet )
return clastFileinDir
#pragma BEGINDUMP
#include "windows.h"
#include "wininet.h"
#include "hbapi.h"
#include "stdio.h"
HB_FUNC( INTERNETOPEN )
{
hb_retnl( ( LONG ) InternetOpen( hb_parc( 1 ), hb_parnl( 2 ), hb_parc( 3 ), hb_parc( 4 ), hb_parnl( 5 ) ) );
}
HB_FUNC( INTERNETCLOSEHANDLE )
{
hb_retl( InternetCloseHandle( ( HINTERNET ) hb_parnl( 1 ) ) );
}
HB_FUNC( INTERNETCONNECT )
{
hb_retnl( ( LONG ) InternetConnect( ( HINTERNET ) hb_parnl( 1 ), hb_parc( 2 ), ( INTERNET_PORT ) hb_parnl( 3 ), hb_parc( 4 ), hb_parc( 5 ), hb_parnl( 6 ), hb_parnl( 7 ), hb_parnl( 8 ) ) );
// Devuelve 0 si no ha conectado.
}
HB_FUNC( FTPOPENFILE )
{
hb_retnl( ( LONG ) FtpOpenFile( ( HINTERNET ) hb_parnl( 1 ), hb_parc( 2 ), hb_parnl( 3 ), hb_parnl( 4 ), hb_parnl( 5 ) ) );
}
HB_FUNC( FTPGETFILESIZE )
{
DWORD nFileSizeHigh;
hb_retnl( ( LONG ) FtpGetFileSize( ( HINTERNET ) hb_parnl( 1 ), &nFileSizeHigh ) );
}
HB_FUNC( INTERNETREADFILE )
{
DWORD nBytesRead;
BOOL lSuccess = InternetReadFile( ( HINTERNET ) hb_parnl( 1 ), ( LPVOID ) hb_parc( 2 ), hb_parclen( 2 ), &nBytesRead );
if ( !lSuccess )
hb_retnl( -1 );
else
hb_retnl( nBytesRead );
}
HB_FUNC( INTERNETWRITEFILE )
{
DWORD nBytesWritten;
BOOL lSuccess = InternetWriteFile( ( HINTERNET ) hb_parnl( 1 ), hb_parc( 2 ), hb_parnl( 3 ), &nBytesWritten );
hb_retl( lSuccess );
}
HB_FUNC( FTPFINDFIRSTFILE )
{
hb_retnl( ( LONG ) FtpFindFirstFile( ( HINTERNET ) hb_parnl( 1 ), hb_parc( 2 ), ( WIN32_FIND_DATA * ) hb_parc( 3 ), hb_parnl( 4 ), hb_parnl( 5 ) ) );
}
HB_FUNC( INTERNETFINDNEXTFILE )
{
BOOL lSuccess = InternetFindNextFile( ( HINTERNET ) hb_parnl( 1 ), ( WIN32_FIND_DATA * ) hb_parc( 2 ) ) ;
hb_retl( lSuccess );
}
//Devuelve el nombre del último fichero modificado según una máscara en un directorio FTP.
HB_FUNC( FTPLASTFILEINDIR )
{ //char nomfich[260];
FILETIME hexUltAccessOfFile;
WIN32_FIND_DATA ultdir;
WIN32_FIND_DATA dirtemp;
HINTERNET FtpHandle;
FILE *fichero;
char nombre[10] = "datos.dat";
fichero = fopen( nombre, "w" );
FtpHandle = FtpFindFirstFile( ( HINTERNET ) hb_parnl( 1 ), hb_parc( 2 ), &dirtemp, hb_parnl( 3 ), hb_parnl( 4 ) ) ;
if ( FtpHandle )
// Si encuentra un primer fichero lo carga en memoria para analizar
{ ultdir = dirtemp;
hexUltAccessOfFile = ultdir.ftLastWriteTime ;
//MessageBox( GetActiveWindow(), ultdir.cFileName, "1er Fich encontrado", 0x40 );
if( fichero )
{
fprintf( fichero, "%s\t%X\t%X\n", dirtemp.cFileName, dirtemp.ftLastWriteTime.dwHighDateTime, dirtemp.ftLastWriteTime.dwLowDateTime );
}
// Sigue buscando por el directorio FTP
while ( InternetFindNextFile( FtpHandle, &dirtemp ) )
//dir = *( WIN32_FIND_DATA * ) hb_parc( 3 ); No se usa. solo de ejemplo de copiar datos entre variables.
if( fichero )
{
fprintf( fichero, "%s\t%X\t%X\n", dirtemp.cFileName, dirtemp.ftLastWriteTime.dwHighDateTime, dirtemp.ftLastWriteTime.dwLowDateTime );
}
{
if ( dirtemp.ftLastWriteTime.dwHighDateTime > hexUltAccessOfFile.dwHighDateTime )
{ ultdir = dirtemp;
hexUltAccessOfFile = ultdir.ftLastWriteTime ;
}
else
if ( dirtemp.ftLastWriteTime.dwHighDateTime == hexUltAccessOfFile.dwHighDateTime )
if ( dirtemp.ftLastWriteTime.dwLowDateTime > hexUltAccessOfFile.dwLowDateTime )
{ ultdir = dirtemp;
hexUltAccessOfFile = ultdir.ftLastWriteTime ;
}
}
// Pasa a la variable de intercambio el resultado
//*( WIN32_FIND_DATA * ) hb_parc( 3 ) = ultdir;
/*
MessageBox( GetActiveWindow(), ultdir.cFileName, "ultdir.cFileName", 0x40 );
sprintf(nomfich,"Ultimo Fichero: %s",ultdir.cFileName );
MessageBox( GetActiveWindow(), nomfich, "elemento", 0x40 );
*/
hb_retc( ultdir.cFileName );
}
else
//MessageBox( GetActiveWindow(), "No ha encontrado ningún fichero", "Cero Ficheros", 0x40 );
hb_retc( "" );
InternetCloseHandle( FtpHandle );
if( fichero )
{
fclose(fichero);
}
}
HB_FUNC( SIZEOFFTPDIRECTORYDATA )
{
hb_retnl( sizeof(WIN32_FIND_DATA) ) ;
}
#pragma ENDDUMP