Visualizzazione post con etichetta Compact Framework. Mostra tutti i post
Visualizzazione post con etichetta Compact Framework. Mostra tutti i post

venerdì 18 febbraio 2011

Windows Mobile 6 utilizzo del tools Cellular Emulator

Riporto l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_windows-mobile-6-utilizzo-del-tools-cell_1001.aspx



Introduzione


Con l’installazione del pacchetto SDK di Windows Mobile 6, si installano diversi tools, tra questi c’è ne uno denominato Cellular emulator, che ci permette di emulare un cellulare e fare le prove per il nostro sviluppo.
L’articolo vuole fornire l’utilizzo del tools “Cellular emultar per effettuare una telefonato ed invio di un sms all’emulatore di Visual studio 2008 e precisamente di tipo Windows Mobile 6.



Esecuzione


Apriamo Visual Studio 2008, e si crea un nuovo progetto di tipo Device, avviamo l’emulatore Windows Mobile 6, questa procedura, si può fare, anche saltando il passo della creazione del progetto, ma utilizzando il device manager, ossia la gestione degli emulatori dei vari device installati sul pc.
Dopo aver aperto l’emulatore di WM6, si apre (start->programmi->Windows Mobile 6 SDK->tools) il tool “cellular emulator”.
Verifichiamo che la porta impostata è COM 3, nella parte inferiore a sinistra, dovrebbe comparire la seguente scritta “DE : COM3”.
A questo punto, dal device di Windows Mobile 6, selezioniamo la voce di menu File e poi successivamente la voce Configure, a questo punto viene aperta una finestra (figura 1).



Figura 1


Passiamo alla pagina denominata “peripherals”, nella sezione “serial port 0:” impostiamo il valore COM3 di norma è imposta su COM4.
Tramite il pulsante ok, confermiamo le modifiche apportate.
A questo punto, sempre nel device di WM6, selezioniamo la voce “File” successivamente “Reset” e poi “Soft” in questo modo impostiamo i valori nuovi.




Figura 2



Nel tools Cellular Emulator, che abbiamo avviato precedentemente, inseriamo nella casella di testo “Phone Number” un numero (per esempio: 7272024) e digitiamo il pulsante DIAL.
A questo punto nell’emulatore di Windows Mobile 6 verrà visualizzato l’avviso di chiamata, come mostrato in figura 2.
Riprendiamo il tools “Cellular Emulator” e dalla linguetta “Sms”, nella casella di testo “Send to Device” inseriamo del testo, e tramite il pulsante “Send”, verrà inviato un sms all’emulatore di Windows Mobile 6, che visualizzerà un avviso di tale messaggio, il tutto come mostrato in figura 3.



Figura 3
Nella linguetta “At Log” viene tracciato tutte le operazioni compiute con il tools “Cellular Emulator”.


Conclusioni


L’articolo ha voluto fornire al lettore l’utilizzo dello strumento Cellular Emulator, che si trova nel pacchetto SDK di Windows Mobile 6. Un ottimo strumento, che ci permette di emulare chiamate, e sms, e quindi effettuare delle prove accurate prima di distribuirlo su un vero device.

sabato 2 ottobre 2010

Compact Framework utilizzo camera per foto e Video (VB.Net e C#)

Si riporta l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_compact-framework-la-gestione-delle-foto_972.aspx


Introduzione
Dalla versione di Windows mobile 5, posiamo utilizzare tramite le classi opportune, la fotocamera del dispositivo mobile per effettuare delle foto o delle riprese.
In questo articolo, vedremo alcuen tecniche di come utilizzare la camera del dispositivo mobile.
Si crea un nuovo progetto di tipo device, tramite il compact framework 3.5, inseriamo nel progetto due pulsanti, il primo permette di eseguire il codice per effettuare le foto, il secondo per effettuare delle riprese.


Stesura del codice.
Prima di passare in visualizzazione codice, inseriameno nel nostro progetto, un riferimento alla dll Microsoft.Windows.Form, che aggiungiamo tra i riferimenti.


Qui di seguito si riporta il codice per VB.Net e C# di tali dichiarazioni.


VB.Net
Imports Microsoft.WindowsForm.Forms


C#
Using Microsoft.WindowsForm.Forms


Terminata questa parte, nell'evento click di un pulsante, scriviamo il codice per eseguire la classe CameraCaptureDialog, che permette di gestire la fotocamera del dispositivo.


Questa classe, contiene un metodo chiamato ShoDialog che restituisce un enumerazione di vari risultati, come per esempio l'annullamento, la conferma ed altro ancora.
Questo metodo permette di avviare la fotocamera.
Qui di seguito si riporta il codice per entrambi i linguaggi del suo utilizzo per effettuare delle foto.


VB.Net



Dim CameraFoto As New CameraCaptureDialog()



CameraFoto.Owner = Me


'imposto il titolo


CameraFoto.Title = "Mio titolo"


'imposto la cartella documenti


CameraFoto.InitialDirectory = "\My Documents"


'nome file


CameraFoto.DefaultFileName = "\MiaFoto.jpg"


'risoluzione


CameraFoto.Resolution = New Size(100, 100)


'Avvio la foto


If CameraFoto.ShowDialog = Windows.Forms.DialogResult.OK Then


MessageBox.Show(CameraFoto.FileName)


End If




C#


CameraCaptureDialog CameraFoto = new CameraCaptureDialog();


CameraFoto.Owner = this;


//imposto il titolo


CameraFoto.Title = "Mio titolo";


//imposto la cartella documenti


CameraFoto.InitialDirectory = @"\My Documents";


//nome file


CameraFoto.DefaultFileName = @"\MiaFoto.jpg";


//risoluzione


CameraFoto.Resolution = new Size(100, 100);


//Avvio la foto


if (CameraFoto.ShowDialog() == DialogResult.OK)


MessageBox.Show(CameraFoto.FileName);


Come si vede dal codice appena illustrato, si è creato un oggetto di tipo CameraCaptureDialog, la proprietà Owner è stata impostata con il nome della classe madre, mentre le altre proprietà, permettono rispettivamente di impostare il titolo della finestra che viene aperta, il percorso dove salvare l'immagine, il nome, la risoluzione.

La stessa classe, ci permette anche di gestire i video, impostando determinate proprietà.
Qui di seguito, si riporta un frammento di codice per entrambi i linguaggi di programmazione.


VB.Net


'video



Dim CameraVideo As New CameraCaptureDialog()



CameraVideo.Owner = Me


'imposto il path di salvataggio


CameraVideo.InitialDirectory = "\My Documents"


'imposto il file video


CameraVideo.DefaultFileName = "\MioVideo.3gp"


'imposto il titolo


CameraVideo.Title = "Mio Titolo"


'imposto il tipo


CameraVideo.VideoTypes = CameraCaptureVideoTypes.Messaging


'imposto la risoluzione


CameraVideo.Resolution = New Size(176, 144)


'il tempo di video (30 secondi)


CameraVideo.VideoTimeLimit = New TimeSpan(0, 0, 30)


'la modalità


CameraVideo.Mode = CameraCaptureMode.VideoWithAudio


If CameraVideo.ShowDialog = Windows.Forms.DialogResult.OK Then


MessageBox.Show(CameraVideo.FileName)


End If




Catch ex As Exception


MessageBox.Show(ex.Message)


End Try



C#


CameraCaptureDialog CameraVideo = new CameraCaptureDialog();



CameraVideo.Owner = this;


//imposto il path di salvataggio


CameraVideo.InitialDirectory = @"\My Documents";


//imposto il file video


CameraVideo.DefaultFileName = @"\MioVideo.3gp";


//imposto il titolo


CameraVideo.Title = "Mio Titolo";


//imposto il tipo


CameraVideo.VideoTypes = CameraCaptureVideoTypes.Messaging;


//imposto la risoluzione


CameraVideo.Resolution = new Size(176, 144);


//il tempo di video (30 secondi)


CameraVideo.VideoTimeLimit = new TimeSpan(0, 0, 30);


//la modalità


CameraVideo.Mode = CameraCaptureMode.VideoWithAudio;


if (CameraVideo.ShowDialog() == DialogResult.OK )


{


MessageBox.Show(CameraVideo.FileName);


}




l'uso di alcune proprietà è uguale al codice visto in precedenza, solo che impostando la proprietà videotype e VideotimeLimit, e mode, verrà utilizzata la funzione ripresa.
Con Mode, viene impostato il tipo di ripresa con audio, mentre la proprietà videotimelimit, limita il tempo di dura, nel nostro caso 30 secondi.



Conclusioni
Si è visto, come la programmazione in Windows Mobile 5 e 6 è notevolemnte semplificata per uso di alcuni componenti di cui è dotato il dispositivo, come la videocamera.

sabato 25 settembre 2010

Ripristinare l'emulatore di Windows Mobile 6

Riporto l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_ripristinare-l’emulatore-di-windows-mobi_973.aspx



Introduzione
Per coloro che sviluppano applicazioni mobile, tramite l’ambiente di sviluppo Visual Studio 2008, con il compact Framework, possano trovarsi nella situazione, di non visualizzare gli emulatori di Windows mobile 6, nonostante l’installazione è avvenuta con successo.
In questo articolo, vedremo, come evitare di disinstallare gli sdk ed evitare di ripetere l’installazione di essi, ma abilitare il nostro ambiente anche a tali emulatori.
Come si vede nella figura 1, possiamo utilizzare gli emulatori riguardante pockect Pc 2003, windows mobile 5 pocket pc e windows mobile 5 smartphone, ma non la versione 6 come riportato in figura 2 dal “Device Emulator Manager” (menu strumenti – “Device emulator manager” )nonostante sono installati tali emulatori.






Figura 1



Figura 2


Configurazione per il ripristino
Vedremo come poter utilizzare tali emulatori senza dover effettuare noiose e ripetute installazioni e rimozioni di software.
Apriamo la finestra delle opzioni degli emulatori, tramite Strumenti (tools)->opzioni (opzions)->Device Tools , situato nella parte sinistra delle varie voci.
Altra alternativa per visualizzare la finestre delle opzioni dei device, è quella di fare click sull’icona “Device Options” situata nella barra degli strumenti di VS2008 (per abilitarla, fate click in uno spazio vuoto della barra tramite il tasto destro e selezionate la voce DEvice) come mostrato in figura 3.


Figura 3


A questo punto, dalla finestra che viene aperta, nella voce “Devices” selezioniamo, nella casella combinata in alto relative alle piattaforme, la versione Windows Mobile 6. Come mostrato in figura 4.



Figura 4


Nella parte inferiore, dove sono elencati i vari dispositivi, selezioniamo quello relativo (o a vostro piacimento) a Windows Mobile 6 professional Emulatr, tramite il pulsante proprietà… o properties…
Viene aperta una finestra, nella quale si trovano le impostazioni per quell’emulatore.





Figura 5


Facciamo click sul pulsante “opzioni Emulatore….” “Emulator Options…” e nella finestra che viene aperta (figura 6) sono elencati alcune informazioni, nella prima linguetta “Generale” annottiamoci (tramite un copia ed incolla su notepad) il valore situato nella casella “Os Image Name”.
Passiamo alla pagina Dispaly, e nella casella Skin, o schema ci annottiamo (sempre tramite un copia ed incolla su notepad) il valore di tale casella.



Figura 6


Terminata questa parte, chiudiamo le relative finestre e ritorniamo nella finestra delle opzioni del device (figura 4).
Selezioniamo dalla casella combinata in alto, il target relativo Windows mobile 5 pocket pc sdk, in questo modo vedremo nella parte sottostante i vari emulatori a disposizione.
Selezioniamo quello relativo a “Windows mobile 5 pocket pc emulator” o quello di vostro piacimento e facciamo click sul pulsante Save As o salva come.. “ ed impostiamo il valore WM 6 new.
Dopo averlo selezionato, facciamo click sul pulsante proprietà o properties, e nella finestra che viene aperta (figura 5) facciamo click sul pulsante “opzioni emulatore” o “emulator option” e nella finestra che viene aperta (figura 6) riportiamo nella casella “Os image name” il parametro copiato precedentemente (il primo per intenderci) , passiamo alla pagina Display, e nella casella “skin” mettiamo il parametro copiato precedentemte (il secondo, quello di tipo xml) .
Facciamo click sul pulsante ok, in tutte le finestre, in modo che viene visualizzata nell’elenco degli emulatori (figura 7).





Figura 7


Ora non ci resta che testare la nostra applicazione per vederla visualizzata in questo emulatore.
Inoltre nel disegnare l’applicazione avremmo la possibilità di farlo con l’immagine della versione 6.


Conclusioni
L’articolo ha voluto illustrare una tecnica di come evitare le noiose disinstallazioni e re installazioni dei vari emulatori sdk in caso di problemi, anche se è consigliabile reinstallare il tutto per avere un ambiente funzionante ed ottimale.
A breve, nel mese di ottobre 2010, uscirà la nuova versione del sistema operativo mobile denominato “Windows Phone 7” ed anche il modo di sviluppare applicazioni su questa piattaforma cambierà, adottando un nuovo modello di programmazione, e nuovi strumenti.

martedì 7 settembre 2010

Compact Framework inviare un sms tramite VB.Net e C#

Questo trucco illustra come inviare un messaggio sms tramite Vb.net e c#, con il compact framework 2.0. Da notare che sul pc dev'essere installato sdk mobile 5.0, perchè tali classi si trova con la versione windows mobile 5 e non precedenti.

Aggiungere al progetto il riferimento a Microsft.WindowsMobile.PocketOutlook fatto ciò, inserire il namespace PocketOutlook come riportato di seguito:



Vb.net



Imports Microsoft.WindowsMobile.PocketOutlook



C#



using Microsoft.WindowsMobile.PocketOutlook;



Di seguito si riporta il codice per l'invio di un sms, da inserire nell'evento click di un pulsante o dove lo si desidera.



Vb.net



Try



'creazione dell'oggetto sms



Dim smsinvio As New SmsMessage()



'imposto il testo del messaggio



smsinvio.Body = "Esempio di invio"



'aggiungo il numero di telefono, il numero 4250010001 permette di inviare un sms all'emulatore altrimenti possiamo mettere anche il numero di un cellulare



smsinvio.To.Add(New Recipient("4250010001"))



'metodo per l'invio del messaggio sms



smsinvio.Send()



'gestione degli errori per sms



Catch exsms As InvalidSmsRecipientException



MessageBox.Show(exsms.Message, "InvioSms")



'errore per la gesteione di pockeoutlook



Catch expocket As PocketOutlookException



MessageBox.Show(expocket.Message, "InvioSmsm")



'errore generico



Catch ex As Exception



MessageBox.Show(ex.Message, "InvioSmsm")





End Try





C#



try



{



//creazione dell'oggetto sms



SmsMessage smsinvio = new SmsMessage();



//imposto il testo del messaggio



smsinvio.Body = "Esempio di invio";



//aggiungo il numero di telefono, il numero 4250010001 permette di inviare un sms all'emulatore altrimenti possiamo mettere anche il numero di un cellulare



smsinvio.To.Add(new Recipient("4250010001"));



//metodo per l'invio del messaggio sms



smsinvio.Send();





}



catch (InvalidSmsRecipientException exsms)



{



MessageBox.Show(exsms.Message);



}



catch ( PocketOutlookException expocket)



{



MessageBox.Show(expocket.Message);



}



catch(Exception ex)



{



MessageBox.Show(ex.Message);



}

lunedì 21 giugno 2010

Compact Framework inviare un email tramite VB.Net e C#

Il seguente frammento di codice, illustra una tecnica di come inviare un email, in ambiente Windows mobile 5 o versione superiore, tramite il linguaggio di programmazione VB.Net e C#


Dopo aver aggiunto il riferimento a windowsmobile.pocketoutlook aggiungere lo spazio di nomi relativo a "pocketoutlook", come riportato qui di seguito.


Codice VB.Net


Imports Microsoft.WindowsMobile.PocketOutlook


Codice C#


using Microsoft.WindowsMobile.PocketOutlook;


Per inviare l'email, utilizziamo la classe emailmessagge, e tramite le proprietà to (utilizzando il metodo add) subject, body impostiamo il destinatario, l'oggetto ed il testo da inviare. Mentre il metodo send ci permette di inviare l'email, tramite l'account registrato sul dispositivo, che otteniamo tramite l'oggetto outlooksession.


Qui di seguito si riporta un frammento di codice.



VB.Net


Try


'imposto l'account del destinatario in conoscenza e conoscenza nascosta


Dim email As New EmailMessage()


email.To.Add(New Recipient("Emanuele", "emanuele@dominio.it"))


email.CC.Add(New Recipient("Nome", "nome@dominio.it"))


'imposto oggetto e testo del messaggio


email.BodyText = "testo del messaggio"


email.Subject = "oggetto del messaggio"


'Gestione account configurati


Dim sessione As New OutlookSession()


'invio email


email.Send(sessione.EmailAccounts(0).Name)


Catch exOut As PocketOutlookException


'errore outlook


MessageBox.Show(exOut.Message)


Catch ex As Exception


'errore generico


MessageBox.Show(ex.Message)


End Try



C#


try


{


//imposto l'account del destinatario in conoscenza e conoscenza nascosta


EmailMessage email = new EmailMessage();


email.To.Add(new Recipient("Emanuele", "emanuele@dominio.it"));


email.CC.Add(new Recipient("Nome", "nome@dominio.it"));


//imposto oggetto e testo del messaggio


email.BodyText = "testo del messaggio";


email.Subject = "oggetto del messaggio";


//Gestione account configurati


OutlookSession sessione = new OutlookSession();


//invio email


email.Send(sessione.EmailAccounts[0].Name);


}


catch (PocketOutlookException exOut)


{


//errore outlook


MessageBox.Show(exOut.Message);


}


catch (Exception ex)


{


//errore generico


MessageBox.Show(ex.Message);


}


sabato 29 maggio 2010

Compact Framework, rilevare il numero di telefono della chiamata che si sta effettuando

Il frammento di codice qui di seguito, illustra una tecnica di come rilevare il numero di telefono della chiamata che si sta effettuando il tutto tramite il linguaggio VB.Net


Imports Microsoft.WindowsMobile.Status


Imports Microsoft.WindowsMobile.Telephony


'oggetto per la gestione dello stato


Dim stato As New SystemState(SystemProperty.PhoneTalkingCallerNumber)


'funzione che rileva il numero di telefono


Public Sub NotificatDiCambiamento(ByVal sender As Object, ByVal args As ChangeEventArgs)


Dim state As SystemState = CType(sender, SystemState)


MessageBox.Show("Numero che si sta chiamdno: " & args.NewValue.ToString())


End Sub



Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


Dim phnTelefono As New Phone()


phnTelefono.Talk("4250010001")


End Sub


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


'aggiungo un gestore di evento


AddHandler stato.Changed, AddressOf NotificatDiCambiamento


End Sub



Come si vede dal codice, si è creato un oggetto di tipo systemstate, riguardante lo stato di chiamata.


Nell'evento load della form, si è creato un gestore di evento, nel caso lo stato del dispositivo mobile cambia, e precisamente nel momento in cui viene effettuata la chiamata viene eseguito il metodo "notificaDiCambiamento" in questo modo possiamo rilevare il numero che stiamo chiamando


L'evento click del pulsante, effettua una chiamata in modo che viene notificato il cambiamento di stato.

domenica 22 febbraio 2009

Compact Framework disabilitare il suggerimento nelle textbox

Riporto l'articolo scritto per il sito iprogrammatori http://www.iprogrammatori.it/articoli/programmazione/art_compact-framework-disabilitare-il-sugger_609.aspx riguardante lo sviluppo smart device.




Tramite le api di Windows Mobile, vedremo come applicare ad una casella di testo, la possibilità di evitare il suggerimento, che compare quando si digita del testo in tale casella.


Inseriamo in una form, due caselle di testo con le relative label, di quest’ultima, in una applichiamo alla proprietà text, il seguente testo “Senza Suggerimento” mentre nell’altra sempre per la proprietà text il valore “Suggerimento”, il tutto come mostrato in figura 1.



Figura 1


Stesura del codice.


Inseriamo lo spazio dei nome, per la gestione delle api, di seguito si riporta il frammento di codice di tale dichiarazione.


VB.Net

Imports System.Runtime.InteropServices

C#

using System.Runtime.InteropServices;


Ora inseriamo la dichiarazione di api, in particolare utilizzeremo le funzioni di api, GetCapture della dll coredll, SHSetInputContenxt della dll aygshell ed infine la funzione SHSetInputContext .


Di seguito si riporta il frammento di codice delle suddette operazioni oltre alla creazione di un enum per disabilitare il suggerimento.



VB.Net

'dichiarazione di api

"coredll")> _

Private Shared Function GetCapture() As IntPtr

End Function


"aygshell")> _

Private Shared Function SHSetInputContext(ByVal hwnd As IntPtr, ByVal dwFeature As SHIC_FEATURE, ByVal lpValue As String) As Integer

End Function

"aygshell")> _

Private Shared Function SHSetInputContext(ByVal hwnd As IntPtr, ByVal dwFeature As SHIC_FEATURE, ByRef lpValue As Integer) As Integer

End Function



_

Enum SHIC_FEATURE

SHIC_FEATURE_RESTOREDEFAULT = 0

SHIC_FEATURE_AUTOCORRECT = 1

SHIC_FEATURE_AUTOSUGGEST = 2

SHIC_FEATURE_HAVETRAILER = 3

SHIC_FEATURE_CLASS = 4

End Enum

C#

//dichiarazione di api

[DllImport("coredll")]

extern static IntPtr GetCapture();


[DllImport("aygshell")]

extern static int SHSetInputContext(IntPtr hwnd, SHIC_FEATURE dwFeature, string lpValue);

[DllImport("aygshell")]

extern static int SHSetInputContext(IntPtr hwnd, SHIC_FEATURE dwFeature, ref int lpValue);


[Flags]

enum SHIC_FEATURE

{

SHIC_FEATURE_RESTOREDEFAULT = 0,

SHIC_FEATURE_AUTOCORRECT = 0x00000001,

SHIC_FEATURE_AUTOSUGGEST = 0x00000002,

SHIC_FEATURE_HAVETRAILER = 0x00000003,

SHIC_FEATURE_CLASS = 0x00000004

}


Ora nell’evento load della form, utilizziamo le api, per disabilitare il suggerimento alla prima casella di testo, mentre nella seconda, non impostiamo nulla.


Di seguito si riporta il frammento di codice situato nell’evento load della form, per disabilitare il suggerimento della prima casella di testo.




VB.Net

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

txtnonSuggerimento.Capture = True

Dim nosuggerimento As IntPtr = GetCapture()

txtnonSuggerimento.Capture = False

Dim ret As Integer

Dim FALSO As Integer = 0

ret = SHSetInputContext(nosuggerimento, SHIC_FEATURE.SHIC_FEATURE_AUTOSUGGEST, FALSO)


End Sub

C#

private void Form1_Load(object sender, EventArgs e)

{

txtnonSuggerimento.Capture = true;

IntPtr nosuggerimento = GetCapture();

txtnonSuggerimento.Capture = false;

int ret;

int FALSO = 0;

ret = SHSetInputContext(nosuggerimento, SHIC_FEATURE.SHIC_FEATURE_AUTOSUGGEST, ref FALSO);


}




Conclusioni


Ora che abbiamo scritto il nostro codice, non ci resta che testare l’applicativo, avviamolo, e digitiamo, tramite la tastiera virtuale, un testo in cui il sistema ci suggerisce a video la parola delle prime lettere che stiamo digitando.


Nella prima casella il suggerimento sarà disabilitato, quindi non vedremmo nessuna parola, mentre nella seconda casella verranno visualizzati i suggerimenti.


Tramite la parola download potete scaricare il file utilizzato in questo articolo.

Download

sabato 21 febbraio 2009

Compact Framework 3.5 comprimere e decomprimere i file

Riporto l'articolo pubblicato per il sito iprogrammatori http://www.iprogrammatori.it/articoli/programmazione/art_compact-framework-35-comprimere-e-decomp_610.aspx



Con l’uscita della nuova versione del Compact Framework 3.5 sono state introdotte nuove classi. Il namespace System.io.Compression, contiene al suo interno diverse classi per la gestione dei file, in particolare per comprimere e decomprime file e cartelle.

In questo articolo vedremo come comprimere e decomprimere un file.


Creazione del progetto


Dopo aver creato un nuovo progetto smart device ,in Visual Studio 2008, aggiungiamo nella form, quattro caselle di testo, con altrettanti label per i vari titoli quattro pulsanti, il tutto come mostrato in figura 1.






Figura 1





Come si può vedere dalla figura 1, i controlli situati nella parte superiore, avranno il compito di comprimere i file, selezionato nel proprio device, mentre quelli posti al di sotto del pulsante, con la proprietà text impostata con il testo “Crea File zip – comprimi” permetto di selezionare il file zippato in precedenza e decomprimerlo.


Stesura di codice


Una volta creata la nostra finestra di esempio, passiamo in visualizzazione codice,


Per gestire i file, occorre utilizzare lo spazio dei nomi system.io, mentre per la gestione delle classi per comprimere e decomprime i file, occorre utilizzare il namespace system.io.compression.



Di seguito si riporta tali dichiarazioni.




VB.Net

Imports System.IO

Imports System.IO.Compression


C#

using System.IO;

using System.IO.Compression;


una volta aggiunti iI namespace si creano due funzioni per comprimere e decomprimere I file


La funzione per comprimere i file, accetta due argomenti, il primo il percorso ed il nome del file da comprimere, mentre il secondo argomento, il percorso e nome del file zippato, quello che verrà generato.


Tramite le classi FileStream e GZipStream, possiamo gestire i file e la modalità di compressione.


Di seguito si riporta i frammenti di codice delle suddette operazioni.






VB.Net

Public Sub Comprimi(ByVal origine As String, ByVal Destinazione As String)


'Verifico che il file esista

If File.Exists(origine) = False Then

MessageBox.Show("File da comprimere inestisistente")

Exit Sub

End If


' creazione dello stream del file da zippatre

Dim buffer As Byte() = Nothing

Dim StreamOrigine As FileStream = Nothing

Dim StreamDestinazione As FileStream = Nothing

Dim FileZip As GZipStream = Nothing


Try

' Leggo lo stream dati del file

StreamOrigine = New FileStream(origine, FileMode.Open, FileAccess.Read, FileShare.Read)


' recupero i byte del file

buffer = New Byte(StreamOrigine.Length) {}

Dim dimensione As Integer = StreamOrigine.Read(buffer, 0, buffer.Length)


' Apro un stream per il file di scrittura (zip)

StreamDestinazione = New FileStream(Destinazione, FileMode.OpenOrCreate, FileAccess.Write)


'imposto il file compresso

FileZip = New GZipStream(StreamDestinazione, CompressionMode.Compress, True)


'Scrivo nel file compresso il buffer

FileZip.Write(buffer, 0, buffer.Length)

MessageBox.Show("Operazione terminata")

Catch ex As ApplicationException

MessageBox.Show("Errore: " & ex.Message, "Funzione: Comprimi", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1)

Finally

'libero la memoria

If Not (StreamOrigine Is Nothing) Then

StreamOrigine.Close()

End If

If Not (FileZip Is Nothing) Then

FileZip.Close()

End If

If Not (StreamDestinazione Is Nothing) Then

StreamDestinazione.Close()

End If

End Try


End Sub


C#


void Comprimi(string origine, string Destinazione)

{

//Verifico che il file esista

if (File.Exists(origine) == false)

{

MessageBox.Show("File da comprimere inestisistente");

return;


}


// creazione dello stream del file da zippatre

Byte[] buffer = null;

FileStream StreamOrigine = null;

FileStream StreamDestinazione = null;

GZipStream FileZip = null;

try

{ // Leggo lo stream dati del file

StreamOrigine = new FileStream(origine, FileMode.Open, FileAccess.Read, FileShare.Read);


// recupero i byte del file

buffer = new Byte[StreamOrigine.Length];

Int32 dimensione = StreamOrigine.Read(buffer, 0, buffer.Length);


// Apro un stream per il file di scrittura (zip)

StreamDestinazione = new FileStream(Destinazione, FileMode.OpenOrCreate, FileAccess.Write);


//imposto il file compresso

FileZip = new GZipStream(StreamDestinazione, CompressionMode.Compress, true);


//Scrivo nel file compresso il buffer

FileZip.Write(buffer, 0, buffer.Length);

MessageBox.Show("Operazione terminata");


}

catch (Exception ex)

{


MessageBox.Show("Errore: " + ex.Message, "Funzione: Comprimi", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);

}

finally

{


//libero la memoria

if (StreamOrigine != null)

StreamOrigine.Close();


if (FileZip != null)

FileZip.Close();


if (StreamDestinazione != null)

StreamDestinazione.Close();


}




}







La funzione decomprimi, accetta due argomenti di tipo stringa, il primo il percorso ed il nome del file zippato, mentre il secondo argomento, il percorso ed il nome del file che sarà decompresso


L’utilizzo della classe filestream, è utile per gestire il flusso dei dati, mentre la classe GZipStream, lavora sulla compressione dei file.


Qui di seguito si riporta il frammento di codice della funzione decomprimi






VB.Net

Public Sub Decomprimi(ByVal Origine As String, ByVal Destinazione As String)


'Verifico che i file esista

If File.Exists(Origine) = False Then

MessageBox.Show("File da decomprimere inestisistente")

Exit Sub

End If


'Creo lo strem dei file

Dim StreamOrigine As FileStream = Nothing

Dim StreamDestinazione As FileStream = Nothing

Dim FileDecomprimere As GZipStream = Nothing

Dim Dati As Byte() = Nothing


Try

'leggo il file da decomprimere

StreamOrigine = New FileStream(Origine, FileMode.Open)


'Creo l'oggetto che mi decomprime il file

FileDecomprimere = New GZipStream(StreamOrigine, CompressionMode.Decompress, True)


'Imposto le dimensioni del byte

Dati = New Byte(4) {}

Dim posizione As Integer = CType(StreamOrigine.Length, Integer) - 4

StreamOrigine.Position = posizione

StreamOrigine.Read(Dati, 0, 4)

StreamOrigine.Position = 0

Dim dimensione As Integer = BitConverter.ToInt32(Dati, 0)


Dim buffer(dimensione + 100) As Byte

Dim offset As Integer = 0

Dim total As Integer = 0


'leggo il file compresso

While True

Dim bytesRead As Integer = FileDecomprimere.Read(buffer, offset, 100)

If bytesRead = 0 Then

Exit While

End If

offset += bytesRead

total += bytesRead

End While


'scrivo il nuovo file

StreamDestinazione = New FileStream(Destinazione, FileMode.Create)

StreamDestinazione.Write(buffer, 0, total)


' libero il buffer

StreamDestinazione.Flush()

MessageBox.Show("File decompresso")

Catch ex As Exception

MessageBox.Show("Errore " & ex.Message, "Funzione Decomprimi", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1)


Finally

'Libero i vari oggetti utilizzati

If Not (StreamOrigine Is Nothing) Then

StreamOrigine.Close()

End If

If Not (FileDecomprimere Is Nothing) Then

FileDecomprimere.Close()

End If

If Not (StreamDestinazione Is Nothing) Then

StreamDestinazione.Close()

End If

End Try


End Sub


C#

void Decomprimi(string Origine, string Destinazione)

{


//Verifico che i file esista

if (File.Exists(Origine) == false)

{

MessageBox.Show("File da decomprimere inestisistente");

return;


}


//Creo lo strem dei file

FileStream StreamOrigine = null;

FileStream StreamDestinazione = null;

GZipStream FileDecomprimere = null;

Byte[] Dati = null;


try

{

//leggo il file da decomprimere

StreamOrigine = new FileStream(Origine, FileMode.Open);


//Creo l'oggetto che mi decomprime il file

FileDecomprimere = new GZipStream(StreamOrigine, CompressionMode.Decompress, true);


//Imposto le dimensioni del byte

Dati = new Byte[4] ;

Int32 posizione = Convert.ToInt32(StreamOrigine.Length) - 4;

StreamOrigine.Position = posizione;

StreamOrigine.Read(Dati, 0, 4);

StreamOrigine.Position = 0;

Int32 dimensione = BitConverter.ToInt32(Dati, 0);


byte[] buffer = new byte[dimensione + 100];

Int32 offset = 0;

Int32 total = 0;


//leggo il file compresso

while (true)

{

Int32 bytesRead = FileDecomprimere.Read(buffer, offset, 100);

if (bytesRead == 0)

break;

offset += bytesRead;

total += bytesRead;


}

//scrivo il nuovo file

StreamDestinazione = new FileStream(Destinazione, FileMode.Create);

StreamDestinazione.Write(buffer, 0, total);


// libero il buffer

StreamDestinazione.Flush();

MessageBox.Show("File decompresso");

}

catch (Exception ex)

{

MessageBox.Show("Errore " + ex.Message, "Funzione Decomprimi", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);

}


finally

{

//Libero i vari oggetti utilizzati

if (StreamOrigine != null)

StreamOrigine.Close();


if (FileDecomprimere != null)

FileDecomprimere.Close();

if (StreamDestinazione != null)

StreamDestinazione.Close();


}







}




Ora dobbiamo gestire i pulsanti che si trovano vicino alle caselle di testo, questi pulsanti, avranno il compito di aprire una finestra di dialogo per la selezione dei file e cartelle.


Per il pulsante della casella di testo, con il titolo impostato a file da comprimere, dobbiamo aggiungere il seguente frammento di codice, nell’evento click di tale pulsante.


Qui di seguito è riportato il codice.




VB.Net

Private Sub btnCercaFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCercaFile.Click

Dim dlgApri As New OpenFileDialog()

dlgApri.Filter = "*.**.*"

If dlgApri.ShowDialog = Windows.Forms.DialogResult.OK Then

txtFileDaComprimere.Text = dlgApri.FileName

End If

End Sub


C#

private void btnCercaFile_Click(object sender, EventArgs e)

{

OpenFileDialog dlgApri = new OpenFileDialog();

dlgApri.Filter = "*.**.*";

if (dlgApri.ShowDialog() == DialogResult.OK)

txtFileDaComprimere.Text = dlgApri.FileName;


}






Mentre per il pulsante posto accanto alla casella di testo, con il titolo “Nome del file zip” nell’evento click inserire il seguente frammento di codice.



VB.Net

Private Sub btnCercaFileZipDaComprimere_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCercaFileZipDaComprimere.Click

Dim dlgSalva As New SaveFileDialog()

dlgSalva.Filter = "File Zip*.zip"

If dlgSalva.ShowDialog() = Windows.Forms.DialogResult.OK Then

Dim fleinfo As New FileInfo(dlgSalva.FileName)

txtNomeFileZip.Text = dlgSalva.FileName

txtNomeFileZip.Text = txtNomeFileZip.Text.Replace(fleinfo.Extension, ".zip")

End If


C#

private void btnCercaFileZipDaComprimere_Click(object sender, EventArgs e)

{

SaveFileDialog dlgSalva = new SaveFileDialog();

dlgSalva.Filter = "File Zip*.zip";

if (dlgSalva.ShowDialog() == DialogResult.OK)

{

FileInfo fleinfo = new FileInfo(dlgSalva.FileName);

txtNomeFileZip.Text = dlgSalva.FileName;

txtNomeFileZip.Text = txtNomeFileZip.Text.Replace(fleinfo.Extension, ".zip");

}

}




A questo punto la parte per comprimere i file è terminata, c’è rimasta la parte per decomprimere il file compresso, o meglio, impostare gli eventi click dei pulsanti per la ricerca dei file .zip e per la la sezione del percorso e nome del file, che sarà compresso.


Per l’evento click del pulsante posto sulla destra della casella di testo, con la scritta “file compresso – da decomprimere”, dobbiamo aprire una finestra di dialogo per la selezione del file compresso, utilizzando la classe openfiledialog.


Qui di seguito si riporta tale frammento di codice.




VB.Net

Private Sub BtnFileDaDecomprimere_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnFileDaDecomprimere.Click

Dim dlgApri As New OpenFileDialog()

dlgApri.Filter = "*.zip**.zip*"

If dlgApri.ShowDialog = Windows.Forms.DialogResult.OK Then txtFileCompresso.Text = dlgApri.FileName


End Sub


C#

private void BtnFileDaDecomprimere_Click(object sender, EventArgs e)

{

OpenFileDialog dlgApri = new OpenFileDialog();

dlgApri.Filter = "*.zip**.zip*";

if (dlgApri.ShowDialog() == DialogResult.OK)

txtFileCompresso.Text = dlgApri.FileName;


}






Mentre per l’evento click del pulsante che si trova al lato della casella di testo con il titolo impostato nel seguente modo “Percorso e cartelle dove decomprimere” utilizzeremo la classe savefiledialog, il quale apre una finestra di dialogo per il salvataggio del file.


Qui di seguito si riporta il frammento di codice di tali operazioni.





VB.Net

Private Sub btnPercorsoEcartellaDecompresso_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPercorsoEcartellaDecompresso.Click

Dim dlgApri As New SaveFileDialog()

dlgApri.Filter = "*.**.*"

If dlgApri.ShowDialog = Windows.Forms.DialogResult.OK Then txtFileDecompresso.Text = dlgApri.FileName



End Sub


C#

private void btnPercorsoEcartellaDecompresso_Click(object sender, EventArgs e)

{

SaveFileDialog dlgApri = new SaveFileDialog();

dlgApri.Filter = "*.**.*";

if (dlgApri.ShowDialog() == DialogResult.OK)

txtFileDecompresso.Text = dlgApri.FileName;



}








Ora per l’evento del pulsante, con la scritta “Crea file zip – Comprimi” inseriamo il codice per richiamare la funzione per comprimere i file.


Qui di seguito si riporta il frammento di codice delle suddette operazioni.




VB.Net

Private Sub BtnComprimi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnComprimi.Click

If txtNomeFileZip.Text.Trim() = "" OrElse txtFileDaComprimere.Text.Trim() = "" Then Return

Comprimi(txtFileDaComprimere.Text, txtNomeFileZip.Text)

End Sub


C#

private void BtnComprimi_Click(object sender, EventArgs e)

{

if (txtNomeFileZip.Text.Trim() == "" txtFileDaComprimere.Text.Trim() == "")

return;

Comprimi(txtFileDaComprimere.Text, txtNomeFileZip.Text);

}






Infine, occorre richiamare dal pulsante decomprimi file zip, la funzione per decomprimere I file.


Qui di seguito si riporta tale codice:




VB.Net

Private Sub BtnDecomprimi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

If txtFileDecompresso.Text.Trim() = "" OrElse txtFileCompresso.Text.Trim() = "" Then Return


Decomprimi(txtFileCompresso.Text, txtFileDecompresso.Text)

End Sub


C#

private void BtnDecomprimi_Click(object sender, EventArgs e)

{

if (txtFileDecompresso.Text.Trim() == "" txtFileCompresso.Text.Trim() == "")

return;

Decomprimi(txtFileCompresso.Text, txtFileDecompresso.Text);

}





Conclusioni


In questo articolo, è stata illustrata una tecnica di come comprimere e decomprimere i file, naturalmente l’articolo ha voluto fornire le basi al lettore per queste nuove classi per la gestione dei file. Il lettore, potrà ampliare nonché sviluppare un applicativo con funzionalità avanzate, per questo nuovo modo di lavorare sui file in ambiente mobile.


Tramite la parola download potete scaricare il file di esempio utilizzato in questo articolo.


Download