Aero - pagina codici (3)
OPERAZIONI AVANZATE CON FILES E TESTI
1) Caricare e salvare solo determinati tipi di files
Utilizzando la funzione di filtro dei Filedialog (open o save) è possibile aprire o salvare formati prestabiliti. Ciò è molto utile per esempio nei lettori multimediali, che devono mostrare solo elementi media (audio e video) nella funzione ‘Apri file’. Oppure negli editor di testi, per stabilire in che formato salvare quanto è stato scritto, o per mostrare nelle cartelle solo i files di tipo testo.
I codici sotto ci permettono di filtrare per tipo file:
Apertura files multimediali (il form prevede un openfiledialog, un componente media player, e una textbox dove temporaneamente viene scritto il nome del file caricato (può anche essere resa invisibile all’ utente):
OpenFileDialog1.Filter = "Audio (*.mp3)|*.mp3|Audio (*.wav)|*.wav|Video (*.avi)|*.avi|Video (*.mpg)|*.mpg|Video (*.wmv)|*.wmv|All Files (*.*)|*.*"
OpenFileDialog1.ShowDialog()
TextBox1.Text = OpenFileDialog1.FileName
AxWindowsMediaPlayer1.URL = TextBox1.Text
Salvataggio di files di testo da una richtextbox (non necessita di aggiungere un savefiledialog al progetto, in quanto lo crea da codice):
Dim dlg As New SaveFileDialog, fName As String = String.Empty
Do
With dlg
.Title = "Salva File"
.Filter = "Rich text files (*.rtf)|*.rtf"
.AddExtension = True
.DefaultExt = "rtf"
If .ShowDialog = Windows.Forms.DialogResult.OK Then
fName = .FileName
RichTextBox1.SaveFile(fName, RichTextBoxStreamType.RichText)
Else
Exit Sub
End If
End With
Loop
Il codice qui sopra permette il salvataggio di un file in una directory qualsiasi.
Ora vedremo come limitare i percorsi.
2) Limitare il salvataggio (o l’ apertura) di un file a un certo percorso
Supponiamo che vogliate fare in modo che tutti i documenti salvati dalla vostra applicazione finiscano in una sottocartella, al di sopra della quale l’ utente non deve poter salire (es: c:\app\documents)
Il codice visto poco sopra dovrà subire una modifica di questo genere:
-
Dovremo definire una cartella ‘limite’ oltre la quale non salire
-
Dovremo verificare se al momento del salvataggio il FileName (che, ricordiamo, è coposto da path + nomefile + estensionefile) inizia con il percorso di quella cartella. Se questo criterio non è soddisfatto, dovremo segnalare l’ errore.
Aggiungeremo quindi nel ciclo With:
.InitialDirectory = “c:\app\documents\”
E modificheremo il ciclo If in questo modo:
If .ShowDialog = Windows.Forms.DialogResult.OK Then
If Not .FileName.StartsWith(.InitialDirectory) Then
MessageBox.Show("Non è possibile cambiare la cartella di destinazione del file", "Attenzione", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
fName = .FileName
RichTextBox1.SaveFile(fName, RichTextBoxStreamType.RichText)
Exit Do
End If
Else
Exit Sub
End If
3) Creare un mini dizionario.
Visual Basic .NET ha un tipo di oggetto Dizionario, che permette delle elaborazioni di stringe avanzate che si rendono necessarie quando trattiamo dati appaiati, cioè assimilabili allo schema "definizione – valore", che in VB.NET sono chiamati KeyValuePair e gestiti tramite .Key e .Value
Il seguente codice, lungo e articolato, permette di creare un mini dizionario. La parte grafica conterrà:
-
Textbox1 = casella di testo multi linea in cui compariranno le definizioni
-
Listbox1 = lista di parole caricate da file
-
Button1 = bottone per caricare il file di testo contenente le definizioni
Dim dict As New Dictionary(Of String, String)
Private Sub button1_Click(sender As System.Object, _
e As System.EventArgs) _
Handles Button1.Click
Using OFD As New OpenFileDialog
With OFD
.Filter = "Dict files (*.dict)|*.dict"
If .ShowDialog = Windows.Forms.DialogResult.OK Then
LeggiDizionario(.FileName)
End If
End With
End Using
End Sub
Private Sub LeggiDizionario(FullPathFileName As String)
Dim lines As String() = IO.File.ReadAllLines(FullPathFileName)
For Each line As String In lines
Dim kv As KeyValuePair(Of String, String) = ToKeyValuePair(line)
dict.Add(kv.Key, kv.Value)
ListBox1.Items.Add(kv.Key)
Next
End Sub
Public Function ToKeyValuePair(pair As String) _
As KeyValuePair(Of String, String)
Dim two As String() = pair.Split("/")
Return New KeyValuePair(Of String, String)(two(0), two(1))
End Function
Private Sub listbox1_Click(sender As Object, _
e As System.EventArgs) _
Handles ListBox1.Click
Dim lst As ListBox = DirectCast(ListBox1, ListBox)
TextBox1.Clear()
TextBox1.SelectedText = dict(lst.SelectedItem)
End Sub
Nel codice sopra abbiamo utilizzato l’ estensione .dict per il file di testo contenente le definizioni.
Queste dovranno essere separate dai valori tramite il carattere “/”.
Il file di testo da caricare dovrà quindi avere questa struttura:
voce 1/definizione 1 può anche contenere spazi
voce 2/definizione 2 può anche contenere spazi
voce 3/definizione 3 può anche contenere spazi