快速入门:通过编程方式访问文件 (HTML)

[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]

访问位于某个位置(如文件夹、库、设备或网络位置)的文件和文件夹。还可以通过构造文件和文件夹查询来查询某个位置的文件和文件夹。

先决条件

枚举某个位置中的顶级文件和文件夹

  1. 获取表示位置的 StorageFolder。

    如果要获取特定文件夹的内容列表,则必须首先获取表示该位置的 StorageFolder 对象。

    文件夹枚举示例展示了如何获取图片库:

    var picturesLibrary = Windows.Storage.KnownFolders.picturesLibrary;
    

    在前面的示例中,我们使用 KnownFolders 获取图片库(作为 StorageFolder 对象)。可以使用 KnownFolders 属性获取表示某些用户资源(如库、设备或网络位置)的文件夹。

    要点  如果希望使用 KnownFolders 属性访问库、设备或网络位置,则应用必须在其应用部件清单中具有相应的功能。要了解有关文件访问和功能的详细信息,请参阅文件访问和权限使用 Windows 运行时对用户资源的访问

     

  2. 获取文件夹内容的列表。

    文件夹枚举示例展示了如何获取图片库中的项目列表:

    picturesLibrary.getItemsAsync().then(function (items) {
    

    如上一示例中所示,可以调用 getItemsAsync() 来获取文件夹的所有内容的列表(StorageFolder 对象)。如果不需要全部项,则可以调用 getItemsAsync(startIndex, maxItemsToRetrieve) 来按索引获取某个范围内的文件夹内容。

    在文件夹上调用 getItemsAsync 方法时,会将要接收的项列表限于该文件夹中的文件和子文件夹,且该列表不包括那些子文件夹中包含的所有文件和文件夹。

    如果需要文件夹中的文件列表,则可以调用 getFilesAsync 方法。如果需要文件夹列表,则可以调用 getFoldersAsync 方法。

    在获取操作之后使用 then 来定义函数,该函数采用接收的对象的列表(上一示例中的 items),并执行所需的其他任务。

  3. 使用列表。

    文件夹枚举示例展示了如何使用图片库中的 items 列表执行其他任务:

    
        outputHeader(picturesLibrary.name, items.size);
        items.forEach(function (item) { 
            if (item.isOfType(Windows.Storage.StorageItemTypes.folder)) { 
                output(id(picturesLibrary.name), item.name + "\\"); 
            } 
            else { 
                output(id(picturesLibrary.name), item.fileName); 
            } 
        });
    

    上一示例将文件夹的 name 和列表的 size 传递给帮助程序函数,该函数向用户显示此信息。

    还可以在整个项列表中循环访问来执行其他任务,如上一示例中所示。可以在项列表上调用 forEach 来循环访问列表中的项。传递给 forEach 的函数应将项列表视为一个参数,并将对列表中的每个 item 执行此函数。

    可以通过分别在每个 item 上调用方法来处理它们。在上一示例中,我们通过将 isOfType 方法的结果(同时存在于文件和文件夹上)与 StorageItemTypes 枚举值相比较,确定 item 是文件夹(StorageFolder 对象)还是文件(StorageFile 对象)。我们使用此比较将关于项的不同信息传递给 output 帮助程序函数,但也可以同时执行许多其他任务。

    要获取更多上下文并查看 outputHeaderoutput 函数如何工作,请下载文件夹枚举示例

完成后,你的代码应类似如下内容:


// Get folder
var picturesLibrary = Windows.Storage.KnownFolders.picturesLibrary;

//  Get folder contents
picturesLibrary.getItemsAsync().then(function (items) {
    // Then perform tasks with the list of files and folders that was retrieved

    // For example, display name of containing folder and count of items in folder
    outputHeader(picturesLibrary.name, items.size);

    // For example, display info for each item
    items.forEach(function (item) { 
        if (item.isOfType(Windows.Storage.StorageItemTypes.folder)) { 
            output(id(picturesLibrary.name), item.name + "\\"); 
        } 
        else { 
            output(id(picturesLibrary.name), item.fileName); 
        } 
    }); 
});

查询某个位置中的文件

  1. 获取包含文件夹。

    如果要获取特定文件夹的内容列表,则必须首先获取该文件夹。

    文件夹枚举示例展示了如何获取图片库:

    var picturesLibrary = Windows.Storage.KnownFolders.picturesLibrary;
    

    在前面的示例中,我们使用 KnownFolders 获取图片库(作为 StorageFolder 对象)。可以使用 KnownFolders 属性获取表示某些用户资源(如库、设备或网络位置)的文件夹。

    要点  如果希望使用 KnownFolders 属性访问库、设备或网络位置,则应用必须在其应用部件清单中具有相应的功能。要了解有关文件访问和功能的详细信息,请参阅文件访问和权限使用 Windows 运行时对用户资源的访问

     

  2. 创建文件夹查询以按照你的指定组织文件。

    在文件夹中创建文件夹查询,会根据条件将该文件夹中的文件及其子文件夹组织成组。所得结果的组是具有文件系统中文件夹的所有功能的虚拟文件夹,从而允许你根据需要获取和处理其中的文件。

    文件夹枚举示例展示了如何创建某个文件夹查询,该查询按拍摄或创建图片的月份对图片库中的图片进行分组:

    var query = picturesLibrary.createFolderQuery(Windows.Storage.Search.CommonFolderQuery.groupByMonth);
    

    如上一示例中所示,可以在文件夹上调用 createFolderQuery(query) 以创建文件夹查询(StorageFolderQueryResult 对象),以根据指定的 CommonFolderQuery 值将该文件夹和子文件夹中的文件组织到虚拟文件夹中。在该示例中,我们选择了基于拍摄或创建图片的月份 (CommonFolderQuery.groupByMonth) 将 picturesLibrary 文件夹中的图片文件分组到虚拟文件夹中。

    也可以通过调用 createFolderQuery()createFolderQueryWithOptions 来创建文件夹查询。

  3. 从查询获取虚拟文件夹列表。

    应用示例主页上的 FolderEnumeration 示例使用 query 来获取虚拟文件夹列表:

    
    query.getFoldersAsync().then(function (monthList) {
        monthList.forEach(function (month) { 
    

    如上一示例所示,可在文件夹查询上调用 getFoldersAsync() 来获取虚拟文件夹列表。使用 then 来定义处理列表的函数。在该示例中,我们的查询返回一个代表月份的虚拟文件夹列表 monthList,并且我们通过调用 monthList.forEach 并定义用于处理每个 month 文件夹的函数,来处理我们的列表。

  4. 获取虚拟文件夹中的文件列表。

    文件夹枚举示例展示了如何使用 month 文件夹来获取在该月份内拍摄或创建的图片列表:

    
            var tempMonthName = month.name; 
            month.getFilesAsync().then(function (files) {
    

    提示  可能会需要存储关于虚拟文件夹 (month) 的信息,以便可以稍后使用该信息。在上一示例中,我们在 tempMonthName 中存储了我们的虚拟文件夹 (month.name) 的名称,以便我们可以在处理我们的图片列表 (files) 时使用该名称。

     

    使用 then 来定义处理接收的文件列表的函数。

完成后,你的代码应类似如下内容:


// Get folder
var picturesLibrary = Windows.Storage.KnownFolders.picturesLibrary; 

// Create query
var query = picturesLibrary.createFolderQuery(Windows.Storage.Search.CommonFolderQuery.groupByMonth); 

// Get virtual folders from query
query.getFoldersAsync().then(function (monthList) { 
    monthList.forEach(function (month) {
 
        var tempMonthName = month.name;
        // Get files from virtual folder 
        month.getFilesAsync().then(function (files) { 
            // Then perform tasks with retrieved files
        }); 
    }); 
});

摘要和后续步骤

若要了解读取和写入文件的信息,请参阅快速入门:读取和写入文件文件访问示例。若要了解使用图像文件的信息,请参阅如何选择和显示图像如何解码图像以及使用 Blob 保存和加载内容示例

若要了解如何通过文件选取器访问文件,请参阅快速入门:使用文件选取器访问文件

相关主题

访问数据和文件

文件访问和权限

快速入门:利用文件选取器访问文件

快速入门:读取和写入文件

编程文件搜索示例

文件夹枚举示例

文件访问示例

使用 Blob 保存和加载内容示例

参考

Windows.Storage.KnownFolders class

Windows.Storage.StorageFile class

Windows.Storage.StorageFolder class

Windows.Storage.StorageItemTypes enum

Windows.Storage.Search.CommonFolderQuery enum

Windows.Storage.Search.StorageFolderQueryResult class