Condividi tramite


Enumerare file e cartelle ed eseguire query su di essi

Accedere a file e cartelle in una cartella, una raccolta, un dispositivo o un percorso di rete. È anche possibile eseguire query su file e cartelle in un percorso utilizzando query personalizzate.

Per indicazioni su come archiviare i dati dell'app WinUI, vedi la classe ApplicationData .

Annotazioni

 Per un esempio completo, vedere l'esempio di enumerazione Folder.

Prerequisiti

Enumerare file e cartelle in una posizione

Annotazioni

 Ricordarsi di dichiarare la funzionalità picturesLibrary.

In questo esempio si usa innanzitutto il metodo StorageFolder.GetFilesAsync per ottenere tutti i file nella cartella radice di KnownFolders.PicturesLibrary (non nelle sottocartelle) ed elencare il nome di ogni file. Successivamente, si usa il metodo StorageFolder.GetFoldersAsync per ottenere tutte le sottocartelle in PicturesLibrary ed elencare il nome di ogni sottocartella.

StorageFolder picturesFolder = KnownFolders.PicturesLibrary;
StringBuilder outputText = new StringBuilder();

IReadOnlyList<StorageFile> fileList = await picturesFolder.GetFilesAsync();

outputText.AppendLine("Files:");
foreach (StorageFile file in fileList)
{
    outputText.Append(file.Name + "\n");
}

IReadOnlyList<StorageFolder> folderList = await picturesFolder.GetFoldersAsync();
           
outputText.AppendLine("Folders:");
foreach (StorageFolder folder in folderList)
{
    outputText.Append(folder.DisplayName + "\n");
}
// MainPage.h
// In MainPage.xaml: <TextBlock x:Name="OutputTextBlock"/>
#include <winrt/Windows.Storage.h>
#include <sstream>
...
Windows::Foundation::IAsyncAction ExampleCoroutineAsync()
{
    // Be sure to specify the Pictures Folder capability in your Package.appxmanifest.
    Windows::Storage::StorageFolder picturesFolder{
        Windows::Storage::KnownFolders::PicturesLibrary()
    };

    std::wstringstream outputString;
    outputString << L"Files:" << std::endl;

    for (auto const& file : co_await picturesFolder.GetFilesAsync())
    {
        outputString << file.Name().c_str() << std::endl;
    }

    outputString << L"Folders:" << std::endl;
    for (auto const& folder : co_await picturesFolder.GetFoldersAsync())
    {
        outputString << folder.Name().c_str() << std::endl;
    }

    OutputTextBlock().Text(outputString.str().c_str());
}

Annotazioni

In C#, ricordarsi di inserire la parola chiave asincrona nella dichiarazione del metodo di qualsiasi metodo in cui si usa l'operatore await.

In alternativa, è possibile usare il metodo StorageFolder.GetItemsAsync per ottenere tutti gli elementi (file e sottocartelle) in una determinata posizione. Nell'esempio seguente viene utilizzato il metodo GetItemsAsync per ottenere tutti i file e le sottocartelle nella cartella radice di KnownFolders.PicturesLibrary (non nelle sottocartelle). Nell'esempio viene quindi elencato il nome di ogni file e sottocartella. Se l'elemento è una sottocartella, l'esempio aggiunge "folder" al nome.

StorageFolder picturesFolder = KnownFolders.PicturesLibrary;
StringBuilder outputText = new StringBuilder();

IReadOnlyList<IStorageItem> itemsList = await picturesFolder.GetItemsAsync();

foreach (var item in itemsList)
{
    if (item is StorageFolder)
    {
        outputText.Append(item.Name + " folder\n");

    }
    else
    {
        outputText.Append(item.Name + "\n");
    }
}
// MainPage.h
// In MainPage.xaml: <TextBlock x:Name="OutputTextBlock"/>
#include <winrt/Windows.Storage.h>
#include <sstream>
...
Windows::Foundation::IAsyncAction ExampleCoroutineAsync()
{
    // Be sure to specify the Pictures Folder capability in your Package.appxmanifest.
    Windows::Storage::StorageFolder picturesFolder{
        Windows::Storage::KnownFolders::PicturesLibrary()
    };

    std::wstringstream outputString;

    for (Windows::Storage::IStorageItem const& item : co_await picturesFolder.GetItemsAsync())
    {
        outputString << item.Name().c_str();

        if (item.IsOfType(Windows::Storage::StorageItemTypes::Folder))
        {
            outputString << L" folder" << std::endl;
        }
        else
        {
            outputString << std::endl;
        }

        OutputTextBlock().Text(outputString.str().c_str());
    }
}

Interrogare i file in un percorso e elencare i file corrispondenti

In questo esempio viene eseguita una query per tutti i file presenti in KnownFolders.PicturesLibrary raggruppati per mese e questa volta l'esempio si ripete in sottocartelle. Prima di tutto, chiamiamo StorageFolder.CreateFolderQuery e passiamo il valore CommonFolderQuery.GroupByMonth al metodo . In questo modo viene visualizzato un oggetto StorageFolderQueryResult .

Successivamente chiamiamo StorageFolderQueryResult.GetFoldersAsync che restituisce gli oggetti StorageFolder che rappresentano le cartelle virtuali. In questo caso si sta raggruppando per mese, quindi le cartelle virtuali rappresentano un gruppo di file con lo stesso mese.

StorageFolder picturesFolder = KnownFolders.PicturesLibrary;

StorageFolderQueryResult queryResult =
    picturesFolder.CreateFolderQuery(CommonFolderQuery.GroupByMonth);
        
IReadOnlyList<StorageFolder> folderList =
    await queryResult.GetFoldersAsync();

StringBuilder outputText = new StringBuilder();

foreach (StorageFolder folder in folderList)
{
    IReadOnlyList<StorageFile> fileList = await folder.GetFilesAsync();

    // Print the month and number of files in this group.
    outputText.AppendLine(folder.Name + " (" + fileList.Count + ")");

    foreach (StorageFile file in fileList)
    {
        // Print the name of the file.
        outputText.AppendLine("   " + file.Name);
    }
}
// MainPage.h
// In MainPage.xaml: <TextBlock x:Name="OutputTextBlock"/>
#include <winrt/Windows.Storage.h>
#include <winrt/Windows.Storage.Search.h>
#include <sstream>
...
Windows::Foundation::IAsyncAction ExampleCoroutineAsync()
{
    // Be sure to specify the Pictures Folder capability in your Package.appxmanifest.
    Windows::Storage::StorageFolder picturesFolder{
        Windows::Storage::KnownFolders::PicturesLibrary()
    };

    Windows::Storage::Search::StorageFolderQueryResult queryResult{
        picturesFolder.CreateFolderQuery(Windows::Storage::Search::CommonFolderQuery::GroupByMonth)
    };

    std::wstringstream outputString;

    for (Windows::Storage::StorageFolder const& folder : co_await queryResult.GetFoldersAsync())
    {
        auto files{ co_await folder.GetFilesAsync() };
        outputString << folder.Name().c_str() << L" (" << files.Size() << L")" << std::endl;

        for (Windows::Storage::StorageFile const& file : files)
        {
            outputString << L"    " << file.Name().c_str() << std::endl;
        }
    }

    OutputTextBlock().Text(outputString.str().c_str());
}

L'output dell'esempio è simile al seguente.

July ‎2015 (2)
   MyImage3.png
   MyImage4.png
‎December ‎2014 (2)
   MyImage1.png
   MyImage2.png