确定 Microsoft OneDrive 文件的可用性

重要的应用程序接口(API)

使用 StorageFile.IsAvailable 属性确定 Microsoft OneDrive 文件是否可用。

先决条件

  • 了解通用 Windows 平台(UWP)应用的异步编程

    了解如何在 C# 或 Visual Basic 中编写异步应用,请参阅 在 C# 或 Visual Basic 中调用异步 API。 若要了解如何在C++中编写异步应用,请参阅C++中的 异步编程。

  • 应用功能声明

    请参阅 文件访问权限

使用 StorageFile.IsAvailable 属性

用户可以将 OneDrive 文件标记为离线可用(默认)或仅在线。 此功能使用户能够将大型文件(如图片和视频)移动到其 OneDrive,将其标记为仅联机,并节省磁盘空间(本地保存的唯一内容是元数据文件)。

StorageFile.IsAvailable,用于确定文件当前是否可用。 下表显示了各种方案中 StorageFile.IsAvailable 属性的值。

文件类型 在线 按流量计费的网络 离线
本地文件 真 实 真 实 真 实
标记为可用脱机的 OneDrive 文件 真 实 真 实 真 实
标记为仅限联机的 OneDrive 文件 真 实 基于用户设置
网络文件 真 实 基于用户设置

 

以下步骤演示如何确定文件当前是否可用。

  1. 声明适合要访问的库的功能。
  2. 包括 Windows.Storage 命名空间。 此命名空间包括用于管理文件、文件夹和应用程序设置的类型。 它还包括所需的 StorageFile 类型
  3. 获取所需文件的 StorageFile 对象。 如果要枚举库,则此步骤通常通过调用 StorageFolder.CreateFileQuery 方法来完成,然后调用生成的 StorageFileQueryResult 对象的 GetFilesAsync 方法。 GetFilesAsync 方法返回一个包含 StorageFile 对象的 IReadOnlyList 集合。
  4. 一旦获得对表示所需文件的 StorageFile 对象的访问权限,StorageFile.IsAvailable 属性的值将反映文件是否可用。

以下泛型方法演示如何枚举任何文件夹并返回该文件夹的 StorageFile 对象的集合。 然后,调用方法循环访问返回的集合,引用每个文件的 StorageFile.IsAvailable 属性。

/// <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");
    }
}