Oggi vedremo come potete leggere i file TXT direttamente da un vostro programmino Visual Basic .NET. Per iniziare dovete importare nel vostro progetto la libreria System.IO, la quale ci semplificherà la vita nella lettura del nostro file TXT. Io ho disegnato una form come nella immagine qua sotto:
Questa mia form ha questi oggetti:
- Una label
- Una TextBox per vedere il percorso del file selezionato
- Un Bottone per aprire la FileDialog
- Una ListBox dove scrivere il risultato di ogni riga letta dal TXT
Nel evento click del pulsante aggiunto scrivete queste righe di codice per leggere il file TXT:
Dim sr As StreamReader = Nothing
Dim riga As String = Nothing
Dopo aver dichiarato queste variabili scrivete il blocco Try…Catch per intercettare gli errori e li dentro scrivete:
Try
‘Imposto il filtro del mio file dialog a TXT e imposto anche la directory di start del file dialog alla cartella documenti
opFile.Filter = “File txt (*.txt)|*.txt”
opFile.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments)
‘Non permetto la selezione multipla di file
opFile.Multiselect = False
‘Avvio la finestra di selezione file
opFile.ShowDialog()
Dopo aver selezionato il file:
‘Controllo se il file esiste (evito errori quando creo una nuova istanza della variabile sr)
If File.Exists(opFile.FileName) Then
‘Pulisco la ListBox ogni volta che leggo un nuovo file
ListBox1.Items.Clear()
tbPath.Text = opFile.FileName
sr = New StreamReader(opFile.FileName)
‘Leggo le righe fino a quando non arrivo alla fine
riga = sr.ReadLine()
While Not riga Is Nothing
ListBox1.Items.Add(riga)
riga = sr.ReadLine()
End While
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Il risultato di questa funzione la vedete nella immagine qua sotto:
Questo è tutto. Domani vi faccio vedere come scrivere un file TXT o creare un file di LOG per la vostra applicazione. Ciao e buona programmazione.
14 risposte
ciao bilbo ho una domanda da farti non so come fare per mandare a capo, nella lettura di un file di testo dentro un list, le righe nel listbox. misai dire come si fa?
grz.
Ciao Luca,
Devi leggere o scrivere in una listbox?
per leggere devi scorrere tutte le righe della listbox in questo modo:
for j as integer = 0 to lbTua.Items.Coun – 1
lbTua.Items.Item(j)
next
Per aggiungere voci alla tua listbox devi soltanto fare add di un nuovo item cosi:
lbTua.Items.Add(“TESTO CHE VUOI AGGIUNGERE”)
Spero di essere stato chiaro. Ciao
Io vorrei fare questo:
Leggere da un file una serie di righe dove per ogni riga c’è un link and un sito web.
Dunque ogni riga rappresenta un sito da navigare.
Qualcuno di questi siti è attivo , qualcun altro no, per cui il programma deve
tentare ad uno i collegamenti finchè non trova il primo di questi che funziona.
Il programma dunque apre il file legge la prima riga e tenta la navigazione.
Se non funziona prova con la seconda e così via ecc.
Quando raggiunge lo scopo, cioè un sito risponde , interrompe la lettura e semplicemente resta connesso con il link che ha funzionato.
Apri file
do
Leggi riga
naviga il sito della riga
loop finchè non ho connesso ad un sito funzionante
chiudi file
il codece necessario al web browser è già stato montato quindi mi basta costruire questo ciclo.
Ciao.
Suscusa ho duplicato la richiesta perchè avevo sbagliato la mia email per la risposta
Ciao Giunluca potresti fare una cosa del genere secondo me:
Leggi fino a quando la riga non è nothing è una variabile che dichiari prima è false
While Not riga Is Nothing or Not TuaVaribileDiControlloConnessione
TuaVaribileDiControlloConnessione = FunzioneControlloURL(riga )
riga = sr.ReadLine()
End While
La funzione di controllo potrebbe essere fatta così:
Dim url As New System.Uri(ValoreLetto)
Dim req As System.Net.WebRequest
req = System.Net.WebRequest.Create(url)
Dim resp As System.Net.WebResponse
Try
resp = req.GetResponse()
resp.Close()
req = Nothing
return true
Catch ex As Exception
req = Nothing
Return False
End Try
Questo penso che sia tutto. Se ho frainteso qualcosa fammi sapere.
Ciao
Ecco qua il codice che ho messo a punto anche per merito dei tuoi ottimi consigli ( solo piccoli cambiamenti per renderlo a me più famigliare) :
______________________
Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click
Dim leggi As System.IO.StreamReader
Dim riga As String
Dim sitorilevato As Boolean
‘Pulisco la ListBox ogni volta che leggo un nuovo file
ListBox1.Items.Clear()
sitorilevato = False
Try
leggi = OpenText(“C:\wlmirrors.txt”)
While leggi.Peek -1 Or sitorilevato = False
riga = leggi.ReadLine()
sitorilevato = funzionecontrolloURL(riga)
ListBox1.Items.Add(riga)
End While
leggi.Close()
Catch ex As Exception
End Try
ListBox1.Items.Add(riga)
WebBrowser1.Navigate(“http:\\www” + riga)
End Sub
_______________________________________
Public Function funzionecontrolloURL(ByVal riga As String)
Dim url As New System.Uri(riga)
Dim req As System.Net.WebRequest
req = System.Net.WebRequest.Create(url)
Dim resp As System.Net.WebResponse
Try
resp = req.GetResponse()
resp.Close()
req = Nothing
Return False
Catch ex As Exception
req = Nothing
Return True
End Try
End Function
____________________________________
Sai quale è il problema ?
Che la funzione di controllo restituisce il valore true anche se appena il sito viene rilevato ma poi dopo aver caricato un certo numero di byte quel sito non risponde più.
Io vorrei che il programma se ne accorgesse e passasse all’url proposto nella riga successiva del file che ho letto per per riprovare in automatico ed in cascata con un altro server finchè non trova una risposta compiuta di caricamento totale della pagina , mentre il browser si inchioda sulla pagina incriminata accidenti.
Non è mica facile sta roba .
Facile non lo è…
Puoi provare a inserire nel tuo ciclo While anche questo:
WebBrowser1.Navigate(“http:\\www” + riga)
if not WebBrowser1.IsBusy then
exit for
end if
e poi fuori dal for carichi la listbox.
Ti do un consiglio… Non mettere mai del codice fuori dal TryCatch.. Solo le dichiarazioni delle varibili..
L’esempio di come leggere un file testo non funziona.
opFile deve essere dichiarato
CommonDocument non è un membro di System.Enviroment.SpecialFolder
Come ho scritto io il mio codice la lettura del file di testo funziona perfettamente .
ciao, ma dove trovo System.IO???
Basta che la import nella tua clase.. Il System.IO si trova nella System.dll del target framework del tuo progetto. Di solito questo assembly è già linkato nel progetto.
Ciao bilbo avrei una domanda da farti.Avrei bisogno che nella mia textbox quando clicco sul bottone mi visualizzi un file di testo che ho sul server del mio sito e non sul pc!credo che sia possibile ma non ho idea di come fare!HELP ME !!!sono disposto anche a pagarti basta che mi risolvi questa cosa!!GRAZIE IN ANTICIPO !!!
Ciao Alessandro,
La lettura del file che sia locale o sul server si fa nello stesso modo, l’importante e che tu possa raggiungere il file. Se non hai direttamente accesso al server, ma qualche utenza configurata ha accesso, devi utilizzare l’IMPERSONATE di Windows per accedere con l’utente X configurato. Se invece nessuno ha accesso diretto al server l’alternativa più usata è usare un WebService che ti restituisce il file come binario, tu lo appoggi su una cartella sul tuo filesystem e poi lo leggi con la procedura spiegata qua.
Spero di esserti stato di aiuto.
Ciao
Salve vorrei fare una cosa simile a quello che voleva fare Gianluca però deve provarli tutti uno per uno fino alla fine delle righe, senza interruzioni e deve caricare la pagina fino alla fine. Se mi postassi il codice sarei molto contento
Dovrei risolvere un piccolo problema:
Ho preparato un programmino di login ad una cartella nascosta, che, invece di usare la solita username e pwd, usa 4 numericupdown, come un codice pin, con poche righe di codice ho risolto e funziona, ora il problemino è questo, il pin inserito nel codice vorrei si potesse cambiare, avevo pensato ad un file di testo che, editato mi consentisse di cambiare il pin, ma, non so se è possbile far leggere ai controlli NUD il valore di ciascuno dal file di testo, il codice usato è:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If Nud1.Value = 1 And Nud2.Value = 9 And Nud3.Value = 6 And Nud4.Value = 3 Then
Dim collegamento As String = “D:\Test”
Process.Start(collegamento)
Me.Close()
Else
MessageBox.Show(“Pin Errato!”, “Cassaforte”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End If
End Sub
Grazie mille per gli eventuali suggerimenti.
Manuel