martedì 1 settembre 2026

C# convertire un DateTime in DateOnly

Nel caso in cui abbiamo la necessità di convertire un valore di tipo DateTime in un DateOnly, ossia ottenere esclusivamente la data, possiamo utilizzare il metodo FromDateTime() della classe DateOnly.

Di seguito un esempio di utilizzo:


C#

DateOnly soloData = DateOnly.FromDateTime(DateTime.Now);


mercoledì 12 agosto 2026

FT: Buone vacanze a tutti voi

 

Buone vacanze da un programmatore

Quest'anno, dopo un lungo periodo, non farò le meritate vacanze. Tanto lavoro, infatti, in un nuovo progetto nel quale finalmente torno a sviluppare con C# in ambiente Windows Forms.

In questo primo giro di boa, come si dice in questi casi, posso ritenermi molto fortunato e, soprattutto, soddisfatto di come è andato questo primo semestre.

Ritornato dal periodo americano, in particolare dopo diversi mesi trascorsi a Boston, una nuova avventura mi ha assorbito e, soprattutto, mi ha fatto ritrovare la voglia di tornare a quello che facevo prima: lo sviluppatore .NET.

Un progetto molto interessante, dal quale mi sto togliendo davvero molte soddisfazioni.

Se da una parte ho tolto spazio all'attività di apprendimento della lingua inglese, dall'altra ho continuato a curare il mio spazio su GitHub, con la pubblicazione di alcuni progetti, che potete visitare a questo indirizzo:

GitHub – Emanuele2025

Un altro aspetto importante di questi mesi è stato vedere sempre più concretamente l'utilizzo dell'intelligenza artificiale come assistente nello sviluppo software.

Uno strumento che mi sta davvero aiutando e che, giorno dopo giorno, sta diventando sempre più presente nel mio modo di lavorare.

In questi mesi anche il blog mi ha dato molte soddisfazioni, superando i ben due milioni di visitatori, un traguardo per me molto significativo.

Certo, per alcuni i numeri possono contare poco o nulla, ma sapere che il blog continua a essere seguito, nonostante l'intelligenza artificiale stia inevitabilmente togliendo traffico a molti siti web, è comunque una cosa che fa molto piacere.

Con la testa rivolta alla città di Boston, auguro a tutti voi di trascorrere delle serene e gioiose vacanze.

Ritornerò a settembre con nuovo materiale tecnologico, nuove esperienze da raccontare e, chissà, magari anche con la speranza di poter dare presto notizia dell'uscita di Windows 12.

Buone vacanze a tutti voi, cari lettori!


lunedì 10 agosto 2026

C# Windows Forms: visualizzare una finestra di dialogo per salvare un file

In questo esempio, realizzato in C# e nell'ambiente Windows Forms, vedremo come visualizzare una finestra di dialogo che consenta all'utente di scegliere il percorso e il nome del file da salvare.

A tale scopo possiamo utilizzare la classe SaveFileDialog, disponibile nel framework .NET.

Di seguito viene riportato un semplice esempio di utilizzo.

C#

using (SaveFileDialog sfdSalvaFile = new SaveFileDialog())

{

    //Filtro solo per il formato pdf o docx formato di salvataggio

    sfdSalvaFile.Filter = "Pdf (*.Pdf)|*.Pdf|Word (*.docx)|*.docx";

    sfdSalvaFile.FilterIndex = 1;

 

    //Imposto di default il nome file

    sfdSalvaFile.FileName = "mioFile.pdf";

 

    //Imposto la cartella iniziale da visualizzare nella finestra

    sfdSalvaFile.InitialDirectory = @"C:\";

    byte[] dati = GetDati();  

    //Visualizzo la finestra di salvataggio, se è ok salvo

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

    {

        string percorso = sfdSalvaFile.FileName;

                   

        File.WriteAllBytes(percorso , dati);

                   

    }

}


domenica 9 agosto 2026

Come leggere e importare file VCF in C# senza librerie di terze parti

In questo esempio, realizzato in  C# per l'ambiente Windows Forms , vedremo come estrarre le informazioni contenute nei file di tipo  VCF (vCard) , utilizzati per rappresentare e scambiare i dati dei contatti, anche tramite applicazioni come Outlook.

L'obiettivo è leggere i file VCF presenti all'interno di una cartella, estrarre alcune informazioni del contatto, come nome, indirizzo e-mail e note , e visualizzarle successivamente all'interno di un controllo `DataGridView`.

Il tutto viene realizzato tramite una classe personalizzata, senza utilizzare librerie di terze parti.

La classe `DtoContattiVcf` rappresenta il singolo contatto e contiene le proprietà `Nome`, `Email` e `Note`.

Il metodo `Contatti()` si occupa invece di individuare tutti i file `.vcf` presenti nella cartella specificata e di creare un oggetto `DtoContattiVcf` per ciascun file.



C#

    public class DtoContattiVcf

    {

        public string Nome { get; set; } = string.Empty;

 

        public string Email { get; set; } = string.Empty;

 

        public string Note { get; set; } = string.Empty;

 

        public DtoContattiVcf()

        {

        }

 

        public DtoContattiVcf(string percorsoNomeFile)

        {

            if (!File.Exists(percorsoNomeFile))

            {

                return;

            }

 

            string[] lines = File.ReadAllLines(percorsoNomeFile);

 

            foreach (string line in lines)

            {

                if (line.StartsWith("FN:", StringComparison.OrdinalIgnoreCase))

                {

                    Nome = line.Substring(3).Trim();

                }

                else if (line.StartsWith("EMAIL;", StringComparison.OrdinalIgnoreCase))

                {

                    int posizione = line.IndexOf(':');

 

                    if (posizione >= 0)

                    {

                        Email = line.Substring(posizione + 1).Trim();

                    }

                }

                else if (line.StartsWith("NOTE;", StringComparison.OrdinalIgnoreCase))

                {

                    int posizione = line.IndexOf(':');

 

                    if (posizione >= 0)

                    {

                        Note = line.Substring(posizione + 1).Trim();

                    }

                }

            }

        }

 

        public List<DtoContattiVcf> Contatti(string percorsoFilesVcf)

        {

            List<DtoContattiVcf> returnContatti = new List<DtoContattiVcf>();

 

            if (!Directory.Exists(percorsoFilesVcf))

            {

                return returnContatti;

            }

 

            foreach (string fileVcf in Directory.EnumerateFiles(

                percorsoFilesVcf,

                "*.vcf",

                SearchOption.TopDirectoryOnly))

            {

                try

                {

                    DtoContattiVcf contatto = new DtoContattiVcf(fileVcf);

 

                    returnContatti.Add(contatto);

                }

                catch (IOException)

                {

                    

                    continue;

                }

                catch (UnauthorizedAccessException)

                {

                   

                    continue;

                }

            }

 

            return returnContatti;

        }

    }

 



Una volta definita la classe, possiamo utilizzarla all'interno del codice di una form Windows Forms.

Nell'esempio seguente, il percorso della cartella contenente i file VCF viene recuperato da una `TextBox`. I contatti vengono quindi letti e associati al controllo `DataGridView`.


C#


private void BtnRilevaVCF_Click(object sender, EventArgs e)
{
    Cursor.Current = Cursors.WaitCursor;
    try
    {
        string percorso = TxtPercorsoVCF.Text.Trim();

        if (string.IsNullOrWhiteSpace(percorso))
        {
            Utility.MessaggioInfo(
                "Selezionare la cartella contenente i file VCF.");

            return;
        }

        if (!Directory.Exists(percorso))
        {
            Utility.MessaggioInfo(
                "La cartella selezionata non esiste.");

            return;
        }

        DtoContattiVcf contatti = new DtoContattiVcf();

        List<DtoContattiVcf> listaContatti = contatti.Contatti(percorso);

        if (listaContatti.Count == 0)
        {
            Utility.MessaggioInfo(
                "Nessun file VCF presente nella cartella selezionata.");

            return;
        }

        dtgDatiVcf.DataSource = listaContatti;


    }
    catch (Exception ex)
    {
        Utility.MessaggioErrore(ex.Message);
    }
    finally
    {
        Cursor.Current = Cursors.Default;

    }
}