Newsgroup: it.comp.lang.visual-basic
Titolo: Aiutino per usare l'API InternetWriteFile

Completato il download di una directory con la barra di scorrimento
totale della directory e una percentuale per ogni file, adesso non mi resta
altro
che fare l'upload di una directory.
Se per fare il download dovevo:
aprirmi un file con Ftpopenfile, usare InternetReadfile e fare ad ogni
lettura di 512 byte un put filenumber;
Adesso per l'Upload cosa devo fare?
E' giusto secondo voi:
Mi apro un file locale e con ogni get faccio un
bel internetwritefile!
Devo ancora provarlo, ma andare avanti per poi tornare indietro non è bello.
Quindi se qualcuno mi desse una dritta sarebbe ben accetto!
Ciao a tutti
Oz
--
Carè Walter SIA SOFTWORK S.R.L.
Via Zanardelli, 13/A - 25062 Concesio (BS) Italy
Tel. 0039-30-2008135/0039-30-2091057  Fax. 0039-30-2004911
Web: 
http://www.siasoftwork.it
 - E.mai:- 
ca...@siasoftwork.it

L'ho già postato stamattina, scusate per il doppione, ma non ce ne vado più
fuori:


 bel internetwritefile!
La procedura è la medesima.
Ottieni l'handle del file da scrivere con FtpOpenFile(); ovviamente
la modalità di accesso (dwAccess) sarà  GENERIC_WRITE e
dwFlags sarà FTP_TRANSFER_TYPE_BINARY (meglio essere
espliciti e non usare i defaults).
Occorre poi riempire il buffer; quindi:
Dim lpBuffer as String
Dim BytesWritten as Long
Dim lngRet as Long
    lpBuffer = String("0", 512)    'oppure 1024, da testare
    Open "FileName" For Binary Access Read As #FileNumber
--begin loop
        Get #FileNumber, , lpBuffer
        'Quindi scrivere il file
        lngRet = InternetWriteFile(hFile, lpBuffer, 512, BytesWritten)
        --loop while lngRet = True and BytesWritten > 0
        --err if lngRet = False
--end loop
    Close #FileNumber
    --InternetCloseHandle
                                        --hFile    <-- importante
                                        --hConnection
Da includere ovviamente il controllo sulla lettura
"past end of file".

 ha scritto nel messaggio
news:8qtufp$gfk7d$1...@ID-51240.news.cis.dfn.de...
Intanto Grazie 1000...
Però il file che arriva su ftp non è esattamente la stessa copia del fle
locale,
Mettiamo che il file da inviare sia di 483.372 Byte, sul server Ftp arriverà
483.840, ovverò il file aggiunto di tot byte per arrivare a 512.
Forse non mi sono spiegato bene, ma nell'ultimo Get che si fa
lpBuffer ha una lunghezza di 512, mentre in realtà sarebbe ad esempio di
320.
Come faccio ad accorgermi di questo inconviente?
Potrei confrontare lpbuffer con un carattere che indica la fine del file!
Lpbuffer = left(lpbuffer,512- instr(lpbuffer,"EOF")
Ciao a tutti
Oz

 Potrei confrontare lpbuffer con un carattere che indica la fine del file!
Eh, lo sapevo. Ricordi come chiude il messaggio precedente ?
[Da includere ovviamente il controllo sulla lettura "past end of file"]
Chiaramente non è detto che la lunghezza del file sia per forza un
multiplo di 512 o quant'altro.
In genere si calcolano le iterazioni dividendo la dimensione del file
per la dimensione del chunk.
Se la lunghezza del file è [FileLen] = LOF(#FileNumber), il numero
di iterazioni è [Iterazioni] = Int([FileLen] / [ChunkLen]);
il resto, se c'è, è [Resto] = ([FileLen] Mod [ChunkLen])
Se [Resto] > 0 occorre effettuare [Iterazioni] +1 --> Get #FileNumber
In pratica:
Dim lngFileLen As Long
Dim lngIterazioni As Long
Dim lngResto As Long
Dim lngChunkLen As Long
Dim lpBuffer As String
Dim Counter As Long
    lngChunkLen = 512
    lpBuffer = String("0", lngChunkLen)
    Counter = 0
    Open [FileName] For Binary Access Read As #FileNum
    lngFileLen = LOF(#FileNum)
    lngIterazioni = Int(lngFileLen / lngChunkLen)
    lngResto = lngFileLen Mod lngChunkLen
    Do While Counter =< lngIterazioni
        Counter = Counter + 1
        Get #FileNum,  , lpBuffer
        -- InternetWriteFile [hFile], lpBuffer, lngChunkLen, [BytesWritten]
    Loop
    If lngResto Then
        lpBuffer = String("0", lngResto)
        Get #FileNum,  , lpBuffer
        -- InternetWriteFile [hFile], lpBuffer, lngResto, [BytesWritten]
    End If
    --Close #FileNum
    --InternetCloseHandle hFile
    --InternetCloseHandle hConnection
NB
Ovviamente occorre verificare la dimensione del file da inviare.
Se è superiore a [Long] occorre "spezzarlo".