Tftp - Directory no retorna la hora - Funciona a Medias
Posted:
Sat Jun 22, 2013 12:01 am
by rolando
Buenas noches,
Tengo un pequeño inconveniente con la clase Tftp. Estoy intentando usarla para actualizaciones automáticas desde mi propio servidor que corre bajo win server 2003.
En el servidor instalé el servidor FTP Filezilla que funciona de maravillas usando un cliente FTP (sigue foto usando un cliente FTP).
Pero no puedo tomar las fechas de los archivos usando la clase TFTP.
Estoy dudando si no seré un problemas del Filezilla (servidor FTP), ya que si me conecto desde DOS, tampoco puedo ver las fechas de los archivos como puede verse en imagen que sigue.Por esto consulto si a Alguien le pasó y como lo solucionó. Hace ya cuatro horas que estoy con esto intentando "tocar" un poco la clase pero no logro hacer que muestre las fechas.
Gracias.
Rolando
Re: Tftp - Directory no retorna la hora
Posted:
Sat Jun 22, 2013 1:27 am
by rolando
Sigo con el mismo problema.
Instalé otro servidor FTP (el Cerberus).
Ahora desde DOS si se puede visualizar la hora de los los archivos pero NO se puede visualizar usando la clase TFTP.
¿Alguna ayuda?.
Gracias.
Rolando
Re: Tftp - Directory no retorna la hora
Posted:
Sat Jun 22, 2013 12:15 pm
by rolando
Sigo con esto,
He subido archivos a un servidor FTP gratuito para hacer pruebas y, desde ahí SI RECUPERO LA HORA.
Entonces la clase FTP funciona como corresponde, pero la pregunta es ¿porque no lo hace desde mi servidor?
Probé con tres aplicaciones de servidor FTP instaladas en el server pero con todas hace lo mismo.
Saludos.
Rolando
Re: Tftp - Directory no retorna la hora - Funciona a Medias
Posted:
Mon Jun 24, 2013 5:36 pm
by Verhoven
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
Re: Tftp - Directory no retorna la hora - Funciona a Medias
Posted:
Mon Jun 24, 2013 5:40 pm
by Verhoven
Te lo pongo un poco más en limpio. En el mensaje anterior se ve de pena:
- Code: Select all Expand view
#include "Fivewin.ch"
#include "fileio.ch"
#include "Struct.ch"
//
// File attributes
//
#define FILE_ATTRIBUTE_READONLY 1
#define FILE_ATTRIBUTE_HIDDEN 2
#define FILE_ATTRIBUTE_SYSTEM 4
#define FILE_ATTRIBUTE_DIRECTORY 16
#define FILE_ATTRIBUTE_ARCHIVE 32
#define FILE_ATTRIBUTE_NORMAL 128
#define FILE_ATTRIBUTE_TEMPORARY 256
//
// access types for InternetOpen()
//
#define INTERNET_OPEN_TYPE_PRECONFIG 0 // use registry configuration
#define INTERNET_OPEN_TYPE_DIRECT 1 // direct to net
#define INTERNET_OPEN_TYPE_PROXY 3 // via named proxy
#define INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY 4 // prevent using java/script/INS
//
// manifests
//
#define INTERNET_INVALID_PORT_NUMBER 0 // use the protocol-specific default
#define INTERNET_DEFAULT_FTP_PORT 21 // default for FTP servers
#define INTERNET_DEFAULT_GOPHER_PORT 70 // " " gopher "
#define INTERNET_DEFAULT_HTTP_PORT 80 // " " HTTP "
#define INTERNET_DEFAULT_HTTPS_PORT 443 // " " HTTPS "
#define INTERNET_DEFAULT_SOCKS_PORT 1080 // default for SOCKS firewall servers.
//
// service types for InternetConnect()
//
#define INTERNET_SERVICE_FTP 1
#define INTERNET_SERVICE_GOPHER 2
#define INTERNET_SERVICE_HTTP 3
//
// flags for FTP
//
#define INTERNET_FLAG_TRANSFER_ASCII 1
#define INTERNET_FLAG_TRANSFER_BINARY 2
//
// file access types
//
#define GENERIC_READ 2147483648
#define GENERIC_WRITE 1073741824
function FTPDirectory( cMask,cIP,cUser,cPass )
local hInternet, hConnect
local hFTPDir, aFiles := {}
local oWin32FindData //, cABuffer
local i:=0
default cMask := "*.*"
//msginfo(len(cABuffer))
STRUCT oWin32FindData
MEMBER nFileAttributes AS DWORD
MEMBER nCreationTime AS STRING LEN 8
MEMBER nLastReadAccess AS STRING LEN 8
MEMBER nLastWriteAccess AS STRING LEN 8
MEMBER nSizeHigh AS DWORD
MEMBER nSizeLow AS DWORD
MEMBER nReserved0 AS DWORD
MEMBER nReserved1 AS DWORD
MEMBER cFileName AS STRING LEN 260
MEMBER cAltName AS STRING LEN 14
ENDSTRUCT
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
//cABuffer = oWin32FindData:cBuffer
hFTPDir = FtpFindFirstFile( hConnect, cMask, @cABuffer, 0, 0 )
//EscribeEnFichTxt(cABuffer,"MATRIZ.TXT")
oWin32FindData:cBuffer := cABuffer
if ! empty( oWin32FindData:cFileName )
aadd( aFiles, { oWin32FindData:cFileName,;
oWin32FindData:nSizeHigh,;
oWin32FindData:nSizeLow,;
oWin32FindData:nCreationTime;
} )
oWin32FindData:cBuffer := ""
while InternetFindNextFile( hFTPDir, @cABuffer )
//EscribeEnFichTxt(cABuffer,"MATRIZ.TXT")
oWin32FindData:cBuffer := cABuffer
aadd( aFiles, { oWin32FindData:cFileName,;
oWin32FindData:nSizeHigh,;
oWin32FindData:nSizeLow,;
oWin32FindData:nCreationTime;
} )
oWin32FindData:cBuffer := ""
end
oWin32FindData:cBuffer := ""
endif
InternetCloseHandle( hFTPDir )
endif
INTERNETCLOSEHANDLE( hFTPDir )
INTERNETCLOSEHANDLE( hConnect )
INTERNETCLOSEHANDLE( hInternet )
oWin32FindData:=NIL
//cABuffer:=NIL // Si se ejecuta algo así en el programa da un GPF ERROR.
/*
msginfo("Bucle de pintado")
for i=1 TO len(aFiles)
msginfo(aFiles[i,1])
next i
*/
return aFiles
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
Re: Tftp - Directory no retorna la hora - Funciona a Medias
Posted:
Tue Jun 25, 2013 12:42 am
by rolando
Gracias Verhoven por responder,
Voy a verlo bien y hacer mis pruebas.
Rolando