Determining availability of Microsoft OneDrive files
Important APIs
Determine if a Microsoft OneDrive file is available using the StorageFile.IsAvailable property.
Prerequisites
Understand async programming for Universal Windows Platform (UWP) apps
You can learn how to write asynchronous apps in C# or Visual Basic, see Call asynchronous APIs in C# or Visual Basic. To learn how to write asynchronous apps in C++, see Asynchronous programming in C++.
App capability declarations
Using the StorageFile.IsAvailable property
Users are able to mark OneDrive files as either available-offline (default) or online-only. This capability enables users to move large files (such as pictures and videos) to their OneDrive, mark them as online-only, and save disk space (the only thing kept locally is a metadata file).
StorageFile.IsAvailable, is used to determine if a file is currently available. The following table shows the value of the StorageFile.IsAvailable property in various scenarios.
Type of file | Online | Metered network | Offline |
---|---|---|---|
Local file | True | True | True |
OneDrive file marked as available-offline | True | True | True |
OneDrive file marked as online-only | True | Based on user settings | False |
Network file | True | Based on user settings | False |
The following steps illustrate how to determine if a file is currently available.
- Declare a capability appropriate for the library you want to access.
- Include the Windows.Storage namespace. This namespace includes the types for managing files, folders, and application settings. It also includes the needed StorageFile type.
- Acquire a StorageFile object for the desired file(s). If you are enumerating a library, this step is usually accomplished by calling the StorageFolder.CreateFileQuery method and then calling the resulting StorageFileQueryResult object's GetFilesAsync method. The GetFilesAsync method returns an IReadOnlyList collection of StorageFile objects.
- Once you have the access to a StorageFile object representing the desired file(s), the value of the StorageFile.IsAvailable property reflects whether or not the file is available.
The following generic method illustrates how to enumerate any folder and return the collection of StorageFile objects for that folder. The calling method then iterates over the returned collection referencing the StorageFile.IsAvailable property for each file.
/// <summary>
/// Generic function that retrieves all files from the specified folder.
/// </summary>
/// <param name="folder">The folder to be searched.</param>
/// <returns>An IReadOnlyList collection containing the file objects.</returns>
async Task<System.Collections.Generic.IReadOnlyList<StorageFile>> GetLibraryFilesAsync(StorageFolder folder)
{
var query = folder.CreateFileQuery();
return await query.GetFilesAsync();
}
private async void CheckAvailabilityOfFilesInPicturesLibrary()
{
// Determine availability of all files within Pictures library.
var files = await GetLibraryFilesAsync(KnownFolders.PicturesLibrary);
for (int i = 0; i < files.Count; i++)
{
StorageFile file = files[i];
StringBuilder fileInfo = new StringBuilder();
fileInfo.AppendFormat("{0} (on {1}) is {2}",
file.Name,
file.Provider.DisplayName,
file.IsAvailable ? "available" : "not available");
}
}