Cercare file su una memory card SD (Italiano)

.NET Gadgeteer mette a disposizione una comoda API per interagire con le memory card SD collegate alla scheda attraverso il modulo SD Card: è possibile recuperare la lista dei file, delle directory, creare cartelle, leggere e scrivere file. Manca però un metodo che restituisca solo i file con una certa estensione. Vediamo quindi come aggiungere tale funzionalità creando un Extension method per la classe StorageDevice. Il codice seguente presuppone che nel progetto sia presente la classe ExtensionAttribute, che abbiamo presentato nel post Extension Methods con .NET Micro Framework.

using System;
using System.Collections;
using Microsoft.SPOT;

using GT = Gadgeteer;

namespace SearchFilesExamples
{
    public static class StorageExtensions
    {
        public static string[] GetFiles(this GT.StorageDevice storage, string extension)
        {
            return GetFiles(storage, null, extension, false);
        }

        public static string[] GetFiles(this GT.StorageDevice storage, string extension,
                                                                       bool recursive)
        {
            return GetFiles(storage, null, extension, recursive);
        }

        public static string[] GetFiles(this GT.StorageDevice storage, string path,
                                                                       string extension)
        {
            return GetFiles(storage, path, extension, false);
        }

        public static string[] GetFiles(this GT.StorageDevice storage, string path,
                                                string extension, bool recursive)
        {
            if (extension[0] != '.')
                extension = '.' + extension;

            ArrayList list = new ArrayList();
            GetFilesHelper(storage, path, extension, recursive, list);
            return (string[])list.ToArray(typeof(string));
        }

        private static void GetFilesHelper(GT.StorageDevice storage, string path,
                                           string extension, bool recursive, ArrayList list)
        {
            var files = storage.ListFiles(path);
            foreach (var fileName in files)
            {
                if (System.IO.Path.GetExtension(fileName).ToLower()
                                                          == extension.ToLower())
                    list.Add(fileName);
            }

            if (recursive)
            {
                var directories = storage.ListDirectories(path);
                foreach (var directoryName in directories)
                    GetFilesHelper(storage, directoryName, extension, recursive, list);
            }
        }
    }
}

I vari overload disponibili consentono di specificare, oltre ovviamente all’estensione dei file, la cartella in cui effettuare la ricerca e se tale ricerca deve essere ricorsiva oppure no.

Proviamo ad utilizzare questo nuovo metodo creando un’applicazione che utilizza il Display T35 e il Button Module. Alla pressione del bottone, viene eseguita una ricerca di tutti i file TXT contenuti sulla scheda.

private Text txtMessage;
private Text txtResults;

private void SetupWindow()
{
    Window window = display.WPFWindow;
    Font baseFont = Resources.GetFont(Resources.FontResources.NinaB);

    Canvas canvas = new Canvas();
    window.Child = canvas;

    Text txtIntro = new Text(baseFont, "Press the button to search for TXT files.");
    canvas.Children.Add(txtIntro);
    Canvas.SetTop(txtIntro, 30);
    Canvas.SetLeft(txtIntro, 20);

    txtResults = new Text(baseFont, string.Empty);
    canvas.Children.Add(txtResults);
    Canvas.SetTop(txtResults, 60);
    Canvas.SetLeft(txtResults, 35);

    txtMessage = new Text(baseFont, string.Empty);
    txtMessage.Width = 300;
    txtMessage.TextWrap = true;
    canvas.Children.Add(txtMessage);
    Canvas.SetTop(txtMessage, 110);
    Canvas.SetLeft(txtMessage, 10);
}

private void button_ButtonPressed(Button sender, Button.ButtonState state)
{
    if (sdCard.IsCardMounted)
    {
        GT.StorageDevice storage = sdCard.GetStorageDevice();
        var textFiles = storage.GetFiles("txt", true);

        txtResults.TextContent = "Your SD Card contains " + textFiles.Length + " TXT files";

        string fileList = string.Empty;
        foreach (var fileName in textFiles)
            fileList += fileName + ", ";
        if (fileList.Length > 0)
            fileList = fileList.Substring(0, fileList.Length - 2);

        txtMessage.TextContent = fileList;
    }
}

Nel gestore dell’evento ButtonPressed, verifichiamo che la memory card sia disponibile (IsCardMounted), quindi recuperiamo l’oggetto per la sua gestione attraverso il metodo GetStorageDevice. A questo punto, possiamo utilizzare il nuovo extension method per ricercare i file con estensione TXT. Non avendo indicato un path, la ricerca viene effettuata a partire dalla root della scheda. Il parametro true indica che vogliamo effettuare una ricerca ricorsiva. Infine, mostriamo il numero totale e i nomi completi dei file trovati.

Il file Program.cs completo della nostra applicazione è il seguente:

using System;
using Microsoft.SPOT;
using Microsoft.SPOT.Presentation;
using Microsoft.SPOT.Presentation.Controls;
using Microsoft.SPOT.Presentation.Media;

using GT = Gadgeteer;
using GTM = Gadgeteer.Modules;
using Gadgeteer.Modules.GHIElectronics;
using System.Collections;

namespace SearchFilesExamples
{
    public partial class Program
    {
        void ProgramStarted()
        {
            SetupWindow();
            button.ButtonPressed += new Button.ButtonEventHandler(button_ButtonPressed);

            Debug.Print("Program Started");
        }

        private Text txtMessage;
        private Text txtResults;

        private void SetupWindow()
        {
            Window window = display.WPFWindow;
            Font baseFont = Resources.GetFont(Resources.FontResources.NinaB);

            Canvas canvas = new Canvas();
            window.Child = canvas;

            Text txtIntro = new Text(baseFont, "Press the button to search for TXT files.");
            canvas.Children.Add(txtIntro);
            Canvas.SetTop(txtIntro, 30);
            Canvas.SetLeft(txtIntro, 20);

            txtResults = new Text(baseFont, string.Empty);
            canvas.Children.Add(txtResults);
            Canvas.SetTop(txtResults, 60);
            Canvas.SetLeft(txtResults, 35);

            txtMessage = new Text(baseFont, string.Empty);
            txtMessage.Width = 300;
            txtMessage.TextWrap = true;
            canvas.Children.Add(txtMessage);
            Canvas.SetTop(txtMessage, 110);
            Canvas.SetLeft(txtMessage, 10);
        }

        private void button_ButtonPressed(Button sender, Button.ButtonState state)
        {
            if (sdCard.IsCardMounted)
            {
                GT.StorageDevice storage = sdCard.GetStorageDevice();
                var textFiles = storage.GetFiles("txt", true);

                txtResults.TextContent = "Your SD Card contains " + textFiles.Length + " TXT files";

                string fileList = string.Empty;
                foreach (var fileName in textFiles)
                    fileList += fileName + ", ";
                if (fileList.Length > 0)
                    fileList = fileList.Substring(0, fileList.Length - 2);

                txtMessage.TextContent = fileList;
            }
        }
    }
}

L’applicazione di esempio è disponibile per il download.

SearchFilesExample.zip

Advertisements

,

  1. Leave a comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: