快速入门:读取和写入文件 (HTML)

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

使用 StorageFile 对象读取和写入文件。

先决条件

示例中使用的文件

这些示例中的所有代码均取自文件访问示例并依赖于该示例的全局 sampleFile 变量。此变量表示这些范例中该示例写入和读取自的文件 (sample.dat)。

文件访问示例会创建 sample.dat 文件,并存储返回的 storageFile 对象,如下所示:

Windows.Storage.ApplicationData.current.localFolder.createFileAsync("sample.dat",
    Windows.Storage.CreationCollisionOption.replaceExisting).then(function (file) {
        sampleFile = file;
    });

注意  在库中创建文件之前,必须在应用清单中声明必要的功能。要了解有关文件访问和功能的详细信息,请参阅文件访问和权限使用 Windows 运行时对用户资源的访问

 

写入文件

这些步骤显示了当你有一个可写入的文件以及一个表示该文件的 storageFile 时写入该文件的方法。

将文本写入文件

通过调用 fileIO 类的 writeTextAsync 方法,将文本写入文件。

文件访问示例展示了如何调用 writeTextAsync(file, contents) 来将一些随机文本写入其 sampleFile,如下所示:

Windows.Storage.FileIO.writeTextAsync(sampleFile, "Swift as a shadow").then(function () {
    // Add code to do something after the text is written to the file
});

尽管 writeTextAsync 方法没有返回值,但仍可以在将文本写入文件之后,使用 thendone 来声明函数并执行其他任务,如示例所示。

使用缓冲区将字节写入文件

  1. 获取要写入文件的字节的缓冲区。

    例如,文件访问示例调用 convertStringToBinary 以获取基于随机字符串的字节缓冲区,如下所示:

    var buffer = Windows.Security.Cryptography.CryptographicBuffer.convertStringToBinary(
        'What fools these mortals be', Windows.Security.Cryptography.BinaryStringEncoding['']
    );
    
  2. 通过调用 fileIO 类的 writeBufferAsync 方法,将字节从你的缓冲区写入文件。

    文件访问示例展示了如何使用 writeBufferAsync 将字节从缓冲区写入其 sampleFile,如下所示:

    Windows.Storage.FileIO.writeBufferAsync(sampleFile, buffer).then(function () {
        // Add code to do something after the text is written to the file
    });
    

    尽管 writeBufferAsync 没有返回值,但仍可以在将文本写入文件之后,使用 thendone 来声明函数并执行其他任务,如示例所示。

使用事务处理流将文本写入文件

  1. 通过调用 storageFile.openTransactedWriteAsync 方法,打开到文件的流。打开操作完成后,它将返回文件的内容流。

    文件访问示例展示了如何通过调用 storageFile.openTransactedWriteAsync 方法在文件 (sampleFile) 上打开流,如下所示:

    sampleFile.openTransactedWriteAsync().then(writeToStream);
    

    确保声明某个函数(类似于 writeToStream)以捕获 transaction(类型为 StorageStreamTransaction),以便可以在该方法完成之后写入到该文件,如下所示:

    function writeToStream(transaction) {
        // Add code to use the stream to write to your file
    }
    
  2. 使用这些步骤将代码添加到 writeToStream 函数,该函数将在 storageFile.openAsync 方法完成之后将文本写入到文件。

    1. 使用 transaction 创建新的 dataWriter 对象并调用 dataWriter.writeString 方法,从而将文本写入流。

      文件访问示例展示了如何将文本写入流,如下所示:

      var dataWriter = new Windows.Storage.Streams.DataWriter(transaction.stream);
      dataWriter.writeString("Swift as a shadow");
      
    2. 通过调用 dataWriter.storeAsynctransaction.commitAsync 方法将文本保存到文件中并关闭流。

      文件访问示例展示了如何将文本保存到文件并关闭流,如下所示:

      dataWriter.storeAsync().then(function () {
          transaction.commitAsync().done(function () {
              // Text in stream has been saved to the file
              transaction.close();
          });
      });
      

可以下载文件访问示例,查看函数内上下文中的代码示例。

从文件读取

这些步骤显示了当你有一个可读取的文件以及一个表示该文件的 storageFile 时从该文件读取的方法。

从文件读取文本

通过调用 fileIO 类的 readTextAsync 方法,从文件读取文本。

文件访问示例展示了如何通过调用 readTextAsync(file) 从某个文件的 sampleFile 进行读取,从而从该文件读取文本,如下所示:

Windows.Storage.FileIO.readTextAsync(sampleFile).then(function (contents) {
    // Add code to process the text read from the file
});

可以使用 thendone 来声明函数以捕获和处理从文件读取的文本。在 readTextAsync 方法完成之后,会将该文本作为 String 对象(示例中的 contents)传递给此函数。

通过使用缓冲区从文件读取字节

通过调用 fileIO 类的 readBufferAsync 方法,将字节从你的文件读入到缓冲区。

文件访问示例展示了如何通过调用 readBufferAsync 将字节从文件读入到缓冲区,如下所示:

Windows.Storage.FileIO.readBufferAsync(sampleFile).then(function (buffer) {
    // Add code to process the text read from the file
});

可以使用 thendone 来声明函数以在 readBufferAsync 方法完成之后捕获和处理 buffer(类型 IBuffer)数据。

例如,文件访问示例捕获 buffer 并使用 dataReader 对象来读取 buffer 的长度,如下所示:

Windows.Storage.FileIO.readBufferAsync(sampleFile).then(function (buffer) {
    var dataReader = Windows.Storage.Streams.DataReader.fromBuffer(buffer);
    var output = dataReader.readString(buffer.length);
});

当然,以这种方式读取 buffer 的长度不是特别有用,但你可以自由地、更有创造性地处理 buffer。你可能会查看一下 dataReader 类中提供的方法,以获得对可以进行哪些事项的更多想法。

使用流从文件读取文本

  1. 通过调用 storageFile.openAsync 方法,从文件打开流。打开操作完成后,它将返回文件的内容流。

    文件访问示例展示了如何通过调用 storageFile.openAsync 方法在文件 (sampleFile) 上打开流,如下所示:

    sampleFile.openAsync(Windows.Storage.FileAccessMode.readWrite).then(readFromStream);
    

    确保声明某个函数(类似于 readFromStream)以捕获流(类型 IRandomAccessStream),以便可以在该方法完成之后从该流进行读取,如下所示:

    function readFromStream(readStream) {
        // Add code to use the stream to read text from your file
    }
    
  2. 使用这些步骤将代码添加到 readFromStream 函数,该函数将在 storageFile.openAsync 方法完成之后从文件读取文本。

    1. readStream 获取要读取的 dataReader 对象。

      文件访问示例展示了如何获取 dataReader,如下所示:

      var dataReader = new Windows.Storage.Streams.DataReader(readStream);
      
    2. 通过调用 dataReader.loadAsyncdataReader.readString 方法读取文本。

      文件访问示例展示了如何读取文本,如下所示:

      
      dataReader.loadAsync(readStream.size).done(function (numBytesLoaded) {
          var fileContent = dataReader.readString(numBytesLoaded);
          // Process text read from the file
          dataReader.close();
      });
      

可以下载文件访问示例,查看函数内上下文中的代码示例。

摘要和后续步骤

现在,如果你有一个表示某个文件的 storageFile,应了解如何从该文件读取和写入。

若要了解使用图像文件的信息,请参阅如何选择和显示图像如何解码图像以及使用 Blob 保存和加载内容示例

相关主题

访问文件中的数据

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

如何选择和显示图像

如何解码图像

文件访问和权限

文件访问示例

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

参考

Windows.Storage.StorageFile class

Windows.Storage.Streams.DataReader class

Windows.Storage.Streams.DataWriter class