Italian B4J Data di un file su internet

micro

Well-Known Member
Licensed User
Longtime User
Salve ragazzi
ho fatto diverse ricerche sul forum e anche se ricordo di averlo visto da qualche parte non sono riuscito a trovarlo.
Prima di scaricare un file dal web ho necessità di controllare la data di compilazione (ultima modifica) per poi procedere al download.
Sapete/Potete darmi un consiglio?
Grazie
 

udg

Expert
Licensed User
Longtime User
Utilizzi FTP per il download? Qualcosa del genere può andare bene?
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Tieni conto comunque che non potrai leggere la "data di compilazione", ma la data di quando hai fatto l'upload al server FTP
 

LucaMs

Expert
Licensed User
Longtime User
Prima domanda da fare sarebbe: ma il file da scaricare sta su un tuo server? Perché se fosse così, basterebbe salvarci anche una "tabella" con i nomi dei file e del loro ultimo aggiornamento, "scaricare questa" (se fosse un file, oppure, se puoi, scrivere su un db) e poi eventualmente il file.
 

micro

Well-Known Member
Licensed User
Longtime User
Grazie a tutti
si è il mio spazio web che utilizzo anche per archiviare files e documenti.
Non vorrei usare il protocollo FTP anche se non ci sono problemi a farlo ma non vorrei aggiungere altre librerie e quindi preferirei l'Http mode.
Pensavo ci fosse un GET apposito per questo ma probabilmente come dice il giovanotto LucaMs 😁 si potrebbe fare in quella maniera oppure
usare quello che a volte quando si parla di web è 'indispensabile, il php.
Sirjo tu dovresti avere qualche php ad hoc da interrogare per farti tirare la data del file?
Lo dico perchè ricordo che fai abbastanza uso di php e quindi ti considero un maestro in questo.
 

micro

Well-Known Member
Licensed User
Longtime User
Sto provando ad utilizzare la funzione filemtime() del php

file che ho inserito nella path di dove ci sono i vari files
PHP:
<?php
$file = '';
if (isset($_GET['file'])) $file = $_GET['file'];
switch ($file) {
    case "dtfile1":
        $lastModifiedTimestamp = filemtime('1.exe');
         break;
    case "dtfile2":
        $lastModifiedTimestamp = filemtime('2.exe');
        break;
    default:
    $lastModifiedTimestamp = '0';
}
echo $lastModifiedTimestamp;
?>

Funziona con la richiesta job.Download ma stranamente il dato che mi ritorna (il timestamp) ha 3 zero in meno alla fine e quindi risulta non corretta.
B4X:
Dim datafilerem As String = DateTime.Date(job.GetString)

Perchè mi ritorna con quei tre 0 in meno alla fine?
(potrei aggiungerli io ma non mi sembra elegante)
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Nel senso che quando fai il log di datafilerem vedi 3 zeri finali in meno?

Se è così, saranno i millisecondi che, se li vuoi vedere, devi impostare il formato Time:

DateTime.TimeFormat = "hh:mm:ss:SSS"

le ultime 3 S (maiuscole) sono appunto i ms.

P.S. e viceversa (che forse è il tuo caso), ovvero non metterle nel TimeFormat.
 

micro

Well-Known Member
Licensed User
Longtime User
P.S. e viceversa (che forse è il tuo caso), ovvero non metterle nel TimeFormat.
Qui non ti seguo
La data del file è attribuita in automatico quando compilo, probabilmente è il TimeFormat nel php che devo modificare
 

LucaMs

Expert
Licensed User
Longtime User
Qui non ti seguo
La data del file è attribuita in automatico quando compilo, probabilmente è il TimeFormat nel php che devo modificare
Per forza non mi segui, non mi seguivo nemmeno io 😁 (avevo appena riaperto gli occhi da un "sonnellino" - di 120 ore, probabilmente 😁).

Non ero certissimo, ma credo che la prima risposta sia giusta. Hai la data affibbiata automaticamente, poi fai:
Dim datafilerem As String = DateTime.Date(job.GetString)
e quando vai a fare il log di datafilerem ti mostra quei 3 zeri alla fine. Dovrebbe essere questo che intendevi.

Cmq, per gestire le date con B4X (sia in lettura = log, sia in scrittura) devi sempre accertarti di come sia impostato il formato (DateTime.DateFormat e DateTime.TimeFormat).

Penso che a te serva solo impostare il TimeFormat senza ":SSS" finale ed ottenere così il log di datafilerem senza i ms.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
se aggiungi i tre zeri e poi converti in data e ora, risulta corretto ??

Tieni conto però che potresti fare un altra cosa:
sul server metterci un file versioni.txt dove questo file potrebbe avere la seguente struttura:
B4X:
miofile.exe 3.4.0
altrofile.dll 1.0.0
cheneso.ext 12.0.5
Praticamente nome del file, uno spazio (o un altro carattere a tua scelta), versione del file presente sul server
Quando aggiorni un file ovviamente devi anche aggiornare questo file TXT.

Quando il programma parte, tramite un comando HTTP si legge questo file versioni.txt, e confronta le versioni dei file presenti sul server con la versione dei file presenti nel PC, e nel caso scarica e aggiorna il file richiesto.
 
Last edited:

micro

Well-Known Member
Licensed User
Longtime User
se aggiungi i tre zeri e poi converti in data e ora, risulta corretto ??
si, è sempre corretto.
Per il momento mi va bene controllare solo la data, se poi mi serve anche controllare la versione (e in quel caso potrei anche non controllare più la data farò come consigli tu e LucaMs nel primo post).
Per chi volesse usarlo:
B4X:
        Dim fw As FileWatcher
        fw.Initialize("")
        'Dim datafile As String = DateTime.Date(fw.GetLastModifiedTime(File.DirApp & "\1.exe"))
        Dim ticksfile As Long = fw.GetLastModifiedTime(File.DirApp & "\1.exe")
        Dim j As HttpJob
        j.Initialize("", Me)
        Dim str As String = "dtfile1"
        j.Download("https://www.xxxxx/download/datefile.php?file=" & str)
        Wait For(j) JobDone(j As HttpJob)
        Dim b As Boolean = j.Success
        If b Then
            'Dim datafilerem As String = DateTime.Date(j.GetString & "000")
            Dim ticksfilerem As Long = j.GetString & "000"
            If ticksfilerem > ticksfile Then
                'aggiorno
                .......
            End If
        End If
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Con B4A si può leggere l'header del file, in particolare la voce LAST-MODIFIED.
Qualcosa del genere (bisogna adattare il ContentType alle proprie necessità) :
B4X:
Sub hc_ResponseSuccess (Response As OkHttpResponse, TaskId As Int)
    Dim Headers As Map=Response.GetHeaders
    Dim i             As Int
    Dim Key, Value As String
    Try
        Response.GetAsynchronously("response", File.OpenOutput(TempFolder, TaskId, False), True, TaskId)
        For i=0 To Headers.Size-1
            Key=Headers.GetKeyAt(i) :    Key=Key.ToUpperCase
            Value=Headers.GetValueAt(i)
            If Key="LAST-MODIFIED" Then
                If Response.ContentType="application/x-sqlite3" Then strDataRemota=Value.Trim
            End If
        Next
        
    Catch   
        Log ("NO hc_ResponseSuccess " & Key & "  " & Value )
    End Try 
End Sub
 
Top