PDA

View Full Version : [VB] Scrivere un file


beog
08-01-2004, 17:14
Ciao a tutti,
sto cercando di fare un semplice programma con VBasic, però non riesco a risolvermi un problema:

Quando uso il comando Write# il programma mi scrive le stringhe tr virgolette.

In pratica:
Write #1, "Antonio fa caldo!"

Lui scrive nel file "Antonio fa caldo!"

Mentre io voglio che mi scriva solo Antonio fa caldo!


Avete la soluz?

Grazie

matpez
08-01-2004, 17:30
Prova a mettere PRINT al posto di WRITE

GogetaSSJ
09-01-2004, 08:06
Originariamente inviato da matpez
Prova a mettere PRINT al posto di WRITE
Invece di provare, usa PRINT perchè è la soluzione giusta ;)

matpez
09-01-2004, 12:50
Originariamente inviato da GogetaSSJ
Invece di provare, usa PRINT perchè è la soluzione giusta ;)

Prova è un modo di dire :p

Se no nn replicavo se nn ero sicuro :)

beog
09-01-2004, 14:22
Ottimo!!!

Grazie ragazzi.

Però ditemi una cosa...
Forse è impossibile, ma c'è la possibilità di trasferire una file TXT via internet?
Cioè io ho un sito web dove devo spedire un file TXt sempre aggiornato via FTP, posso farlo con VB senza dover creare il TXT con VBasic e poi spedirlo con Un client?

E' tanto complesso?

In pratica volevo fare un pulsante che mandasse il file via FTP...

Forse è fanstascienza!

matpez
09-01-2004, 15:02
No per nulla...

Ti posto una mio procedura.


Option Explicit

Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUsername As String, ByVal sPassword As String, ByVal lService As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Private Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" (ByVal hFtpSession As Long, ByVal lpszLocalFile As String, ByVal lpszRemoteFile As String, ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean


Private Sub SendFileFTP()

On Error GoTo Errore


Dim sFileRemote As String
Dim sDirRemote As String
Dim sFileLocal As String
Dim lOpen As Long
Dim lConnection As Long
Dim nFreeFile As Integer


'trasferisco il file nel FTP
DoEvents

lOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0)
lConnection = InternetConnect(lOpen, LeggiPreferences("DATI FTP", "Host"), INTERNET_INVALID_PORT_NUMBER, LeggiPreferences("DATI FTP", "UserName"), mcCrypt.DecryptAPI(LeggiPreferences("DATI FTP", "Password"), "Id9VhDCX21", True), INTERNET_SERVICE_FTP, IIf(LeggiPreferences("DATI FTP", "AccessoPassivo") = "0", 0, INTERNET_FLAG_PASSIVE), 0)

If lOpen <> 0 And lConnection <> 0 Then

'creo il file da mettere sul FTP
nFreeFile = FreeFile
Open App.Path & "\" & LeggiPreferences("DATI FTP", "File") For Output As #nFreeFile
Print #nFreeFile, CreaFTPFile(LeggiPreferences("DATI FTP", "FileCode"))
Close #nFreeFile

sDirRemote = "/" & LeggiPreferences("DATI FTP", "Cartella")
sFileRemote = LeggiPreferences("DATI FTP", "File")
sFileLocal = App.Path & "\" & sFileRemote

Call rcd(LeggiPreferences("DATI FTP", "Host"), sDirRemote, lConnection)

'mando il file all'FTP
DoEvents
bSendFileFTP = FtpPutFile(lConnection, sFileLocal, sFileRemote, FTP_TRANSFER_TYPE_BINARY, 0)

'elimino il file
Call Kill(App.Path & "\" & LeggiPreferences("DATI FTP", "File"))
End If

End Sub

Private Sub rcd(ByVal sHost As String, sDir As String, ByVal lConnection As Long)

On Error GoTo Errore

Dim sPathFromRoot As String


If sDir = "" Then
Exit Sub
Else
If InStr(1, sDir, sHost) Then
sPathFromRoot = Mid$(sDir, Len(sHost) + 1, Len(sDir) - Len(sHost))
Else
sPathFromRoot = sDir
End If
If sPathFromRoot = "" Then
sPathFromRoot = "/"
End If
Call FtpSetCurrentDirectory(lConnection, sPathFromRoot)
End If

End Sub


Se nn capisci qlc nel codice chiedi pure! :p

beog
11-01-2004, 10:17
Non è per NIENTE complicato!

SCHERZI?

Io non ci ho capito niente!!!

Però sono sicuro che funzionerà!

Dimmi solo dove devo mettere l'indirizzo FTP, la pass, l'account e il nome del file da trasf


Ciao e grazie (scusa l'ignoranza)

beog
11-01-2004, 10:51
Ah, un'altra cosa.
Ho visto che li c'è una funz di kill, vuol dire che cancella il file dopo averlo mandato?

Se io voglio che mandi il tutto con un pulsante dove devo metterlo quel codice?

Grazie ancora

matpez
11-01-2004, 12:38
- Si kill elimina il file creato dopo averlo mandato!

- Per metterlo in un command basta che crei un command e richiami la funzione SendFileFTP

- Per i dati nell'FTP devi cambiare questa riga:

lConnection = InternetConnect(lOpen, HOST, INTERNET_INVALID_PORT_NUMBER, USER_NAME, PASSWORD, INTERNET_SERVICE_FTP, ACCESSO_PASSIVO, 0)

E cambi quesi: HOST, USER_NAME, PASSWORD. ACCESSO_PASSIVO (dove metti 0 per sidattivarlo, e il parametro INTERNET_FLAG_PASSIVE per attivarlo

beog
11-01-2004, 13:18
Ho abbastanza capito, però rispetto al codice che avevi messo sopra c'è qualche diff...

Cioè dal cod sopra sembra che questi dati se li ricavi in qualche altro modo, tipo leggendoli da file.

Poi, il file da spedire, ponendo che sia ciccio.txt, dove lo devo inserire?

Grazie per la pazienza

matpez
11-01-2004, 13:39
Si scusami, pensavo che riuscissi a cambiare da solo i dati....colpa mia che nn ci ho pensato prima sorry :cry:

Questo è un brandello di codice del mio programma ed effettivamente i parametri che servivano andavo a prenderli da un file INI dove ci sono memorizzate le opzioni del programma.

'creo il file da mettere sul FTP
nFreeFile = FreeFile
Open App.Path & "\ciccio.txt" & For Output As #nFreeFile
Print #nFreeFile, qui metti il contenuto del file
Close #nFreeFile

sDirRemote = "/" & 'cartella dell'ftp (es: ublteam.com/prova)
sFileRemote = "ciccio.txt"
sFileLocal = App.Path & "\ciccio.txt"

Call rcd(LeggiPreferences("DATI FTP", "Host"), sDirRemote, lConnection)

'mando il file all'FTP
DoEvents
bSendFileFTP = FtpPutFile(lConnection, sFileLocal, sFileRemote, FTP_TRANSFER_TYPE_BINARY, 0)

'elimino il file
Call Kill(sFileLocal)


PS: se nn te li avevo già mandati ecco le costanti
Private Const INTERNET_OPEN_TYPE_DIRECT = 1
Private Const INTERNET_INVALID_PORT_NUMBER = 0
Private Const INTERNET_SERVICE_FTP = 1
Private Const INTERNET_FLAG_PASSIVE = &H8000000
Private Const FTP_TRANSFER_TYPE_BINARY = &H2

beog
11-01-2004, 14:09
Le cost devo metterle nelle dichiarazioni vero?

Il mio prob è che ora, non so come, tutte le variabile che avevo messo mi diventato nn definite!
Che palle però...

Sono proprio un zuccone, però non ci riesco.
Potresti farmi un favore? Mi mandi per mail un file VB dove ci sia un pulsante che faccia mandare al sito:

"ftp.utenti.lycos.it"

nella cartella "prova/"

con account "Arturo"
con password "Antonio"

il file già esistente "c:\ciccio.txt" ???

Lo so che è una grande richiesta, ma io ci provo ;)

Grazie cmq, ciao

matpez
11-01-2004, 16:01
Ti ho mandato una mail...spostiamoci li a parlare! a dopo

beog
16-01-2004, 12:45
Ora tutto funziona, però ho un problema:

la connessione viene aperta ma non viene chiusa, cioè non fa il log out, quindi se devo inviare 2 file a breve dist di tempo non funzia perchè l'FTP è occupato da l'altro client.

Come faccio a fare il log out?

Grazie, ciao

matpez
16-01-2004, 13:13
Scusami tanto!! :(

Purtroppo mi ero dimenticato che io la chiusura nn c'è l'ho in quella routine :(

Riparo subito all'errore

Public Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer

E devi mettere la funzione:
Call InternetCloseHandle(lConnection)

Sorry ancora

beog
16-01-2004, 22:54
E devo metterla alla fine della funzione SendFileFTP? Giusto?

Grazie, ciao...

PS non devi scusarti, anzi, sei il mio salvatore!!!

maxithron
16-01-2004, 22:58
Originariamente inviato da beog
PS non devi scusarti, anzi, sei il mio salvatore!!!


Non vedo l'ora che anche matpez prepari un suo tutorial per Visual Basic!!

matpez
16-01-2004, 23:06
Originariamente inviato da maxithron
Non vedo l'ora che anche matpez prepari un suo tutorial per Visual Basic!!

Aime...purtroppo il tempo per me nn è così tanto da stare ore a scrivere qlc...e se lo facessimo assieme così ci lavoriamo entrambi e in metà tempo lo mettiamo up?

Bho...sei convinto? :)

Fammi sapere... al massimo concordiamo via email! :p

maxithron
16-01-2004, 23:17
Originariamente inviato da matpez
Aime...purtroppo il tempo per me nn è così tanto da stare ore a scrivere qlc...e se lo facessimo assieme così ci lavoriamo entrambi e in metà tempo lo mettiamo up?

Bho...sei convinto? :)

Fammi sapere... al massimo concordiamo via email! :p

Ma io di VB so solo qualche cosina. Ogni tanto riprendo un pò lo studio ma davvero sono a livelli minimi. :(

matpez
16-01-2004, 23:47
Originariamente inviato da maxithron
Ma io di VB so solo qualche cosina. Ogni tanto riprendo un pò lo studio ma davvero sono a livelli minimi. :(

Vorrà dire che metteremo prima il mio nome e poi il tuo :oink: :p :oink:

matpez
17-01-2004, 16:11
Originariamente inviato da maxithron
Ma io di VB so solo qualche cosina. Ogni tanto riprendo un pò lo studio ma davvero sono a livelli minimi. :(

Novità sulla mia proposta :confused:

maxithron
17-01-2004, 17:38
Originariamente inviato da matpez
Novità sulla mia proposta :confused:

Ma dai..... davvero non ne sono all'altezza per Visual Basic. :(

E' un linguaggio che ho lasciato da troppo tempo ed anche quando ci "stavo dentro" non ero una cima. :p

Potrei solo magari sviluppare la parte iniziale ed arrivare fino a....mmmhhh.... diciamo una panoramica della struttura "if...then".