Mario De Ghetto

Microsoft MVP – Visual Basic (VB.NET: Programmare che passione!)

Archivio per Luglio 2008

[Visual Studio] Traduzione del blog di Sara Ford (tips)

Pubblicato da Mario De Ghetto su 22 Luglio 2008

Credo che molti di voi conosceranno il blog di Sara Ford (http://blogs.msdn.com/saraford/default.aspx). In questo blog, Sara pubblica ogni giorno un suggerimento o un trucco per usare meglio Visual Studio.

A questo proposito è nata un’iniziativa che potrebbe essere interessante soprattutto per chi non conosce bene l’inglese: la traduzione dei suggerimenti giornalieri in un blog tutto italiano (http://blogs.msdn.com/sarafordita/). Nel momento in cui scrivo trovate le traduzioni dei numeri #001 e #002.

L’annuncio di questa iniziativa lo trovate qui: http://blogs.msdn.com/sarafordita/archive/2008/07/18/il-primo-post.aspx.

Un mio ringraziamento va a Emanuele Mattei che mi ha segnalato questa interessante iniziativa (http://blog.shareoffice.it/emanuele/archive/2008/07/21/9647.aspx).

Pubblicato su Novità | 2 Commenti »

[Community] Slide e demo del Community Days 2008

Pubblicato da Mario De Ghetto su 18 Luglio 2008

All’indirizzo http://www.communitydays.it/events/communitydays2008milano.aspx sono stati pubblicati diversi materiali presentati durante le due giornate del “Community Days 2008″ a Segrate, presso la sede di Microsoft Italia.

I materiali, scaricabili liberamente e gratuitamente, consistono in slide e in demo (tipicamente delle “soluzioni” di Visual Studio).

Io personalmente ho partecipato (purtroppo) solo alla seconda giornata, ma consiglio di dare un’occhiata anche a chi non fosse stato presente ad entrambe le giornate, perché sono materiali di tutto rispetto (del resto con degli speaker di quel calibro, non poteva essere altrimenti!).

Pubblicato su Novità | Lascia un commento »

#43: Spostare un insieme di file in una diversa cartella con VB.NET (anche con LINQ)

Pubblicato da Mario De Ghetto su 8 Luglio 2008

Per spostare un file da una cartella a un’altra, possiamo utilizzare semplicemente il metodo My.Computer.FileSystem.MoveFile.

Il problema consiste nel fatto che questo metodo non consente di utilizzare i caratteri jolly e quindi non possiamo eseguire questa istruzione:

My.Computer.FileSystem.MoveFile( _

            “C:\Test1\*.jpg”, “C:\Test2\*.jpg”)

Abbiamo quindi la necessità di recuperare prima di tutto i nomi di tutti i file che rispondono a un determinato schema come *.jpg, poi potremo spostare i file singolarmente, utilizzando un ciclo For Each:

Imports System.IO

Public Class Form1

   Private Sub Button1_Click(ByVal sender As System.Object, _

         ByVal e As System.EventArgs) Handles Button1.Click

      ‘ creazione array con elenco file *.jpg:

      Dim d As New DirectoryInfo(“C:\Test1″)

      Dim f As FileInfo() = d.GetFiles(“*.jpg”)

      ‘ ciclo di spostamento:

      For Each fNext In f

         My.Computer.FileSystem.MoveFile( _

            “C:\Test1\” & fNext.Name, _

            “C:\Test2\” & fNext.Name)

      Next

   End Sub

End Class

Da qui possiamo poi creare una procedura riutilizzabile più volte, inserendola in un modulo di codice:

Imports System.IO

Module Utility

   Public Sub spostaGruppoFile(ByVal nomeFile As String, _

         ByVal dir1 As String, ByVal dir2 As String)

      ‘ creazione array con elenco file *.jpg:

      Dim d As New DirectoryInfo(dir1)

      Dim f As FileInfo() = d.GetFiles(nomeFile)

      ‘ ciclo di spostamento:

      For Each fNext In f

         My.Computer.FileSystem.MoveFile( _

            dir1 & fNext.Name, _

            dir2 & fNext.Name)

      Next

   End Sub

End Module

Tale procedura può essere chiamata semplicemente come segue, passando il nome del file o lo schema (con i caratteri jolly), la cartella di origine e la cartella di destinazione:

spostaGruppoFile(“*.jpg”, “C:\Test1\”, “C:\Test2\”)

Ovviamente è possibile passare una qualsiasi parte del nome dei file che vogliamo selezionare, non solo l’estensione. Per esempio:

 

Imports System.IO

Module Utility

   Public Sub spostaGruppoFile(ByVal nomeFile As String, _

         ByVal dir1 As String, ByVal dir2 As String)

      ‘ creazione array con elenco file:

      Dim d As New DirectoryInfo(dir1)

      Dim f = From elenco In d.GetFiles(nomeFile) _

              Select elenco.Name

      ‘ ciclo di spostamento:

      For Each fNext In f

         My.Computer.FileSystem.MoveFile( _

             dir1 & fNext, _

             dir2 & fNext)

      Next

   End Sub

End Module

 

 

Pubblicato su Tips | Lascia un commento »

#42: Abbreviare la dimensione di un file con VB.NET

Pubblicato da Mario De Ghetto su 2 Luglio 2008

Come tutti i programmatori sanno, in informatica vengono utilizzate delle abbreviazioni per indicare l’unità di misura per la dimensione di un file, della RAM o di un hard disk: per esempio un file di 1.024 byte equivale a un file di 1 “kB”.

Le abbreviazioni utilizzate attualmente sono le seguenti:

  • kiloByte –> kB –> 1.024 (circa 10^3)
  • MegaByte –> MB –> 1.048.576 (circa 10^6)
  • GigaByte –> GB –> 1.073.741.824 (circa 10^9)
  • TeraByte –> TB –> 1.099.511.627.776 (circa 10^12)
  • PetaByte –> PB –> 1.125.899.906.842.620 (circa 10^15)
  • ExaByte –> EB –> 1.152.921.504.606.850.000 ( circa 10^18 )
  • ZettaByte –> ZB –> 1,180.591.620.717.41E+21 (circa 10^21)
  • YottaByte –> YB –> 1,208.925.819.614.63E+24 (circa 10^24)

Per noi programmatori potrebbe quindi essere utile avere una funzione in grado di abbreviare un numero molto grande, così da avere una rappresentazione molto più compatta. Il seguente codice fa proprio questo:

Module Module1

   Public Function ConvertiByte( _

         ByVal strNumero As String) As String

      Dim risultato As String

      Dim potenza As Integer = 0

      Dim nByte As Decimal = 0

      ‘ verifico se è stato passato un parametro:

      ‘ se si, lo converto nel tipo Decimal

      ‘ se no, esco

      ‘TODO: aggiungere verifica se è un numero valido!

      If strNumero <> “” Then

         Try

            nByte = CType(strNumero, Decimal)

         Catch ex As Exception

            Return “Numero troppo grande: Overflow”

         End Try

      Else

         Return “Errore: nessun numero da valutare”

      End If

      ‘ ciclo di riduzione del numero, estraendo

      ‘ il numero di iterazioni effettuate

      Do While ((nByte / 1000) >= 1)

         nByte = nByte / 1024

         potenza += 1

      Loop

      ‘ conversione in stringa con arrotondamento

      risultato = Decimal.Round(nByte, 2).ToString

      ‘ aggiunta della giusta unità di misura

      Select Case potenza

         Case 0

            risultato &= ” byte”

         Case 1

            risultato &= ” KB”

         Case 2

            risultato &= ” MB”

         Case 3

            risultato &= ” GB”

         Case 4

            risultato &= ” TB”

         Case 5

            risultato &= ” PB”

         Case 6

            risultato &= ” EB”

         Case 7

            risultato &= ” ZB”

         Case 8

            risultato &= ” YB”

         Case Else

            risultato = “Non valutabile”

      End Select

      Return risultato

   End Function

End Module

A questo punto basta creare un form, aggiungere una casella di testo e un pulsante. Il codice per gestire l’evento Click del pulsante è il seguente:

Public Class Form1

   Private Sub Button1_Click(ByVal sender As System.Object, _

         ByVal e As System.EventArgs) Handles Button1.Click

      MessageBox.Show(ConvertiByte(Me.TextBox1.Text))

   End Sub

End Class

Semplice vero? Ma proviamo a migliorare un po’ la nostra funzione. E’ sufficiente sostituire tutto il codice seguente al commento “aggiunta della giusta unità di misura”:

      ‘ aggiunta della giusta unità di misura

      Dim misure() As String = _

         {“byte”, “KB”, “MB”, “GB”, “TB”, “PB”, “EB”, “ZB”, “YB”}

      If potenza > 8 Then

         risultato &= ” Non valutabile”

      Else

         risultato &= ” “ & misure(potenza)

      End If

      Return risultato

Con una semplice modifica, poi, possiamo fare in modo che la nostra funzione rappresenti un’abbreviazione di potenze di 10^3. Per esempio (i punti di separazione delle migliaia sono inseriti solo per chiarezza visiva):

- 1.000 –> 1 x 10^3
- 1.000.000 –> 1 x 10^6
- 55.555.555.555 –> 55,56 x 10^9

Ecco quindi la nostra funzione modificata:

Module Module1

   Public Function ConvertiByte( _

         ByVal strNumero As String) As String

      Dim risultato As String

      Dim potenza As Integer = 0

      Dim nByte As Decimal = 0

      ‘ verifico se è stato passato un parametro:

      ‘ se si, lo converto nel tipo Decimal

      ‘ se no, esco

      ‘TODO: aggiungere verifica se è un numero valido!

      If strNumero <> “” Then

         Try

            nByte = CType(strNumero, Decimal)

         Catch ex As Exception

            Return “Numero troppo grande: Overflow”

         End Try

      Else

         Return “Errore: nessun numero da valutare”

      End If

      ‘ ciclo di riduzione del numero, estraendo

      ‘ il numero di iterazioni effettuate

      Do While ((nByte / 1000) >= 1)

         nByte = nByte / 1000

         potenza += 1

      Loop

      ‘ conversione in stringa con arrotondamento

      risultato = Decimal.Round(nByte, 2).ToString

      ‘ aggiunta della giusta unità di misura

      risultato &= ” x 10^” & (potenza * 3).ToString

      Return risultato

   End Function

End Module

Come potete vedere, le uniche differenze sono date dal diverso divisore (1000 anziché 1024) e nella parte finale, dove viene composta la stringa che viene restituita dalla funzione al codice chiamante.

Una precisazione, prima che qualcuno possa pensare che si tratti di un errore. Il seguente codice:

      Do While ((nByte / 1000) >= 1)

         nByte = nByte / 1024

         potenza += 1

      Loop

potrebbe apparire strano o perfino sbagliato. Perché confronto la divisione per 1000 e poi divido per 1024?

E’ molto semplice: nel caso in cui, per esempio, volessi abbreviare 1000 byte, con il confronto per 1024 otterrei la non esecuzione dell’abbreviazione e quindi il risultato sarebbe “1000 byte” anziché “0,98 KB”. Di solito è abbastanza brutto veder superare il valore di 1000 in questi casi e quindi si preferisce comunque arrivare al massimo a 999 (confrontate per esempio con la visualizzazione dell’Esplora Risorse di Windows).

Una curiosità: notate come sia possibile, in VB.NET, scrivere una cosa del genere:

(potenza * 3).ToString

senza dover memorizzare il calcolo matematico in una variabile.

C’è ancora qualcuno che non è convinto a passare a VB.NET?   :-)

Pubblicato su Tips | Lascia un commento »

[BLOG] 50.000 visite!

Pubblicato da Mario De Ghetto su 1 Luglio 2008

Ho appena constatato che in questo blog ho appena raggiunto il ragguardevole numero di 50.000 visite in quasi 6 mesi, cioè dal 12 Gennaio 2008, data in cui ho pubblicato il primo post!

Sono soddisfatto, anche tenendo conto che nell’altro blog, http://community.visual-basic.it/mario/, ho ricevuto circa 14.000 visite in un anno, pari a oltre 21.000 pagine lette.

Questo fatto mi riempie di soddisfazione e mi stimola a fare ancora di più e meglio: prossimamente arriveranno altri post e sto per iniziare a scrivere un nuovo libro, questa volta sulla progettazione dei database. Darò maggiori dettagli più avanti, quando il progetto editorale sarà definito in modo più preciso.

Vi ringrazio tutti per tutte le e-mail, le manifestazioni di stima e per i ringraziamenti e vi invito a seguire ancora questo blog e anche il blog su Visual Basic Tips & Tricks, il cui indirizzo lo vedete qui sopra.

:-)

Pubblicato su Novità | Lascia un commento »