Menghitung dan mengkueri file dan folder
Akses file dan folder di folder, pustaka, perangkat, atau lokasi jaringan. Anda juga dapat mengkueri file dan folder di lokasi dengan membuat kueri file dan folder.
Untuk panduan tentang cara menyimpan data aplikasi Platform Windows Universal Anda, lihat kelas ApplicationData.
Catatan
Untuk sampel lengkap, lihat Sampel enumerasi folder.
Prasyarat
Memahami pemrograman asinkron untuk aplikasi Platform Windows Universal (UWP)
Anda dapat mempelajari cara menulis aplikasi asinkron di C# atau Visual Basic, lihat Memanggil API asinkron di C# atau Visual Basic. Untuk mempelajari cara menulis aplikasi asinkron di C++/WinRT, lihat Operasi konkurensi dan asinkron dengan C++/WinRT. Untuk mempelajari cara menulis aplikasi asinkron di C++/CX, lihat Pemrograman asinkron di C++/CX.
Izin akses ke lokasi
Misalnya, kode dalam contoh ini memerlukan kemampuan picturesLibrary , tetapi lokasi Anda mungkin memerlukan kemampuan yang berbeda atau tidak ada kemampuan sama sekali. Untuk mempelajari selengkapnya, lihat Izin akses file.
Menghitung file dan folder di lokasi
Catatan
Ingatlah untuk mendeklarasikan kemampuan gambarLibrary .
Dalam contoh ini, pertama-tama kita menggunakan metode StorageFolder.GetFilesAsync untuk mendapatkan semua file di folder akar KnownFolders.PicturesLibrary (bukan dalam subfolder) dan mencantumkan nama setiap file. Selanjutnya, kita menggunakan metode StorageFolder.GetFoldersAsync untuk mendapatkan semua subfolder di PicturesLibrary dan mencantumkan nama setiap subfolder.
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());
}
#include <ppltasks.h>
#include <string>
#include <memory>
using namespace Windows::Storage;
using namespace Platform::Collections;
using namespace concurrency;
using namespace std;
// Be sure to specify the Pictures Folder capability in the appxmanifext file.
StorageFolder^ picturesFolder = KnownFolders::PicturesLibrary;
// Use a shared_ptr so that the string stays in memory
// until the last task is complete.
auto outputString = make_shared<wstring>();
*outputString += L"Files:\n";
// Get a read-only vector of the file objects
// and pass it to the continuation.
create_task(picturesFolder->GetFilesAsync())
// outputString is captured by value, which creates a copy
// of the shared_ptr and increments its reference count.
.then ([outputString] (IVectorView\<StorageFile^>^ files)
{
for ( unsigned int i = 0 ; i < files->Size; i++)
{
*outputString += files->GetAt(i)->Name->Data();
*outputString += L"\n";
}
})
// We need to explicitly state the return type
// here: -IAsyncOperation<...>
.then([picturesFolder]() -IAsyncOperation\<IVectorView\<StorageFolder^>^>^
{
return picturesFolder->GetFoldersAsync();
})
// Capture "this" to access m_OutputTextBlock from within the lambda.
.then([this, outputString](IVectorView/<StorageFolder^>^ folders)
{
*outputString += L"Folders:\n";
for ( unsigned int i = 0; i < folders->Size; i++)
{
*outputString += folders->GetAt(i)->Name->Data();
*outputString += L"\n";
}
// Assume m_OutputTextBlock is a TextBlock defined in the XAML.
m_OutputTextBlock->Text = ref new String((*outputString).c_str());
});
Dim picturesFolder As StorageFolder = KnownFolders.PicturesLibrary
Dim outputText As New StringBuilder
Dim fileList As IReadOnlyList(Of StorageFile) =
Await picturesFolder.GetFilesAsync()
outputText.AppendLine("Files:")
For Each file As StorageFile In fileList
outputText.Append(file.Name & vbLf)
Next file
Dim folderList As IReadOnlyList(Of StorageFolder) =
Await picturesFolder.GetFoldersAsync()
outputText.AppendLine("Folders:")
For Each folder As StorageFolder In folderList
outputText.Append(folder.DisplayName & vbLf)
Next folder
Catatan
Di C# atau Visual Basic, ingatlah untuk menempatkan kata kunci asinkron dalam deklarasi metode metode apa pun di mana Anda menggunakan operator tunggu .
Atau, Anda dapat menggunakan metode StorageFolder.GetItemsAsync untuk mendapatkan semua item (file dan subfolder) di lokasi tertentu. Contoh berikut menggunakan metode GetItemsAsync untuk mendapatkan semua file dan subfolder di folder akar KnownFolders.PicturesLibrary (bukan dalam subfolder). Kemudian contoh mencantumkan nama setiap file dan subfolder. Jika item adalah subfolder, contoh ditambahkan "folder"
ke nama.
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());
}
}
// See previous example for comments, namespace and #include info.
StorageFolder^ picturesFolder = KnownFolders::PicturesLibrary;
auto outputString = make_shared<wstring>();
create_task(picturesFolder->GetItemsAsync())
.then ([this, outputString] (IVectorView<IStorageItem^>^ items)
{
for ( unsigned int i = 0 ; i < items->Size; i++)
{
*outputString += items->GetAt(i)->Name->Data();
if(items->GetAt(i)->IsOfType(StorageItemTypes::Folder))
{
*outputString += L" folder\n";
}
else
{
*outputString += L"\n";
}
m_OutputTextBlock->Text = ref new String((*outputString).c_str());
}
});
Dim picturesFolder As StorageFolder = KnownFolders.PicturesLibrary
Dim outputText As New StringBuilder
Dim itemsList As IReadOnlyList(Of IStorageItem) =
Await picturesFolder.GetItemsAsync()
For Each item In itemsList
If TypeOf item Is StorageFolder Then
outputText.Append(item.Name & " folder" & vbLf)
Else
outputText.Append(item.Name & vbLf)
End If
Next item
File kueri di lokasi dan menghitung file yang cocok
Dalam contoh ini kita mengkueri semua file di KnownFolders.PicturesLibrary yang dikelompokkan menurut bulan, dan kali ini contoh berulang menjadi subfolder. Pertama, kita memanggil StorageFolder.CreateFolderQuery dan meneruskan nilai CommonFolderQuery.GroupByMonth ke metode . Itu memberi kita objek StorageFolderQueryResult.
Selanjutnya kita memanggil StorageFolderQueryResult.GetFoldersAsync yang mengembalikan objek StorageFolder yang mewakili folder virtual. Dalam hal ini kita mengelompokkan menurut bulan, sehingga folder virtual masing-masing mewakili sekelompok file dengan bulan yang sama.
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());
}
#include <ppltasks.h>
#include <string>
#include <memory>
using namespace Windows::Storage;
using namespace Windows::Storage::Search;
using namespace concurrency;
using namespace Platform::Collections;
using namespace Windows::Foundation::Collections;
using namespace std;
StorageFolder^ picturesFolder = KnownFolders::PicturesLibrary;
StorageFolderQueryResult^ queryResult =
picturesFolder->CreateFolderQuery(CommonFolderQuery::GroupByMonth);
// Use shared_ptr so that outputString remains in memory
// until the task completes, which is after the function goes out of scope.
auto outputString = std::make_shared<wstring>();
create_task( queryResult->GetFoldersAsync()).then([this, outputString] (IVectorView<StorageFolder^>^ view)
{
for ( unsigned int i = 0; i < view->Size; i++)
{
create_task(view->GetAt(i)->GetFilesAsync()).then([this, i, view, outputString](IVectorView<StorageFile^>^ files)
{
*outputString += view->GetAt(i)->Name->Data();
*outputString += L" (";
*outputString += to_wstring(files->Size);
*outputString += L")\r\n";
for (unsigned int j = 0; j < files->Size; j++)
{
*outputString += L" ";
*outputString += files->GetAt(j)->Name->Data();
*outputString += L"\r\n";
}
}).then([this, outputString]()
{
m_OutputTextBlock->Text = ref new String((*outputString).c_str());
});
}
});
Dim picturesFolder As StorageFolder = KnownFolders.PicturesLibrary
Dim outputText As New StringBuilder
Dim queryResult As StorageFolderQueryResult =
picturesFolder.CreateFolderQuery(CommonFolderQuery.GroupByMonth)
Dim folderList As IReadOnlyList(Of StorageFolder) =
Await queryResult.GetFoldersAsync()
For Each folder As StorageFolder In folderList
Dim fileList As IReadOnlyList(Of StorageFile) =
Await folder.GetFilesAsync()
' Print the month and number of files in this group.
outputText.AppendLine(folder.Name & " (" & fileList.Count & ")")
For Each file As StorageFile In fileList
' Print the name of the file.
outputText.AppendLine(" " & file.Name)
Next file
Next folder
Output contoh terlihat mirip dengan yang berikut ini.
July 2015 (2)
MyImage3.png
MyImage4.png
December 2014 (2)
MyImage1.png
MyImage2.png