Tftp - Directory no retorna la hora - Funciona a Medias

Tftp - Directory no retorna la hora - Funciona a Medias

Postby rolando » Sat Jun 22, 2013 12:01 am

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).

Image

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.

Image

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 :D
Last edited by rolando on Sat Jun 22, 2013 12:16 pm, edited 1 time in total.
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Tftp - Directory no retorna la hora

Postby rolando » Sat Jun 22, 2013 1:27 am

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 :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Tftp - Directory no retorna la hora

Postby rolando » Sat Jun 22, 2013 12:15 pm

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 :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Tftp - Directory no retorna la hora - Funciona a Medias

Postby 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
Verhoven
 
Posts: 505
Joined: Sun Oct 09, 2005 7:23 pm

Re: Tftp - Directory no retorna la hora - Funciona a Medias

Postby Verhoven » Mon Jun 24, 2013 5:40 pm

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
 
Verhoven
 
Posts: 505
Joined: Sun Oct 09, 2005 7:23 pm

Re: Tftp - Directory no retorna la hora - Funciona a Medias

Postby rolando » Tue Jun 25, 2013 12:42 am

Gracias Verhoven por responder,

Voy a verlo bien y hacer mis pruebas.

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 91 guests