从 Android 到 Windows 8:文件操作

本文将带你了解如何编写代码,使得 Windows8 商店应用可以保存文件(例如照片和文档)。你可以将这些文件存储在应用数据文件夹,或将它们保存到外部存储介质(如 USB 驱动器)。

例如你编写了一个文字处理应用,用户可能希望保存正在处理的文档,并在下次使用时打开它。又例如你编写了一个照片编辑应用,用户可能希望将修改后照片保存到 USB 驱动器,然后将该 USB 驱动器连接到电视机或数码相框以便以后查看。为了帮助你的用户达到目的,你可以在第一个例子中把文档保存到应用数据文件夹,而在第二个例子中把照片保存到外部存储介质。

下面介绍 Windows 商店应用的应用数据文件夹。每个应用程序可以将文件存储到特定设备上的一组单独的目录(分别是 local,roaming 和 temporary 目录):

  • local 目录中的文件仅存在于当前设备中。
  • roaming 目录中的文件则会在同用户所有安装了该应用的设备中漫游。
  • temporary 目录和 local 目录类似,但是系统可以随时删除其中的文件。

当用户安装 Windows 商店应用时,Windows 会自动创建这些应用数据目录。你不必担心如何找到它们,因为 Windows 自动保存了这些目录的位置。你只需要使用 ApplicationData 类就可以访问它们。如果用户卸载了应用,Windows 会自动删除与之相关的应用数据目录,因此你也不必担心如何清理它们。

Windows 提示

如果用户需要保存的应用数据文件特别有价值,或具有不可替代性,请考虑将这类文件保存到其他更安全的位置,例如用户的 Skydrive。

若要将文件存储在外部存储介质中,可以使用 DeviceInformation 和StorageDevice 类。这些内容将在后文有更详细的介绍。

接下来介绍实际代码。

将文件保存到应用数据文件夹

在 Windows 商店应用中,如果要保存名为 hello.txt 的文件到 local 目录下,你可以使用如下代码:

var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("Hello.txt"); 
await FileIO.WriteTextAsync(file, "Hello world!");

保存到 roaming 目录的代码如下:

var file = await ApplicationData.Current.RoamingFolder.CreateFileAsync("Hello.txt"); 
await FileIO.WriteTextAsync(file, "Hello world!");

保存到 temporary 目录:

var tempFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync("TempFile.txt");

Android 提示

在安卓应用中,如果要保存文件到本地,你可以编写如下代码:

File tempFile; 
tempFile = File.createTempFile("TempFile.txt", null, context.getCacheDir());
String filename = "hello.txt"; 
String string = "Hello world!"; 
FileOutputStream outputStream;  
outputStream = openFileOutput(filename, Context.MODE_PRIVATE); 
outputStream.write(string.getBytes());
outputStream.close();

将文件创建模式设置为 MODE_PRIVATE,这样其他应用程序就无法访问你的应用数据了。作为对比,Windows 商店应用默认只能访问自己的应用数据。

将文件保存到外部存储

在 Windows 商店应用中,你必须在与应用关联的 Package.appsxmanifest 中声明可移动存储的访问权限。

声明这项权限后,首先使用如下代码检查外部存储介质是否可用。

public async Task<bool> IsExternalStorageAvailable() 
{
   var devices = await DeviceInformation.FindAllAsync(StorageDevice.GetDeviceSelector());
   if (devices.Count > 0)
        return true;
   else     
        return false; 
}

如果外部存储介质可用,就可以使用下列代码创建文件。

var storage = StorageDevice.FromId(deviceInformation.Id); 
await storage.CreateFileAsync("HelloWorld.png");

Android提示

在Android应用程序中,为了完成类似的功能,首先需要在应用的 manifest 文件中声明 WRITE_EXTERNAL_STORAGE 权限,如下所示。

<manifest>  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
</manifest>

请求权限后,使用如下代码检查外部存储介质是否可用。

public boolean isExternalStorageWritable() {
      String state = Environment.getExternalStorageState();
      if (Environment.MEDIA_MOUNTED.equals(state)) {
          return true;  
      }   
      return false; 
}

如果外部存储介质可用,就可以创建文件。例如,要在媒体的“图片”目录中创建一个文件,具体的代码如下。

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "HelloWorld.png");

本文的版权归 沈星繁 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏高性能服务器开发

(六)关于网络编程的一些实用技巧和细节

这些年,接触了形形色色的项目,写了不少网络编程的代码,从windows到linux,跌进了不少坑,由于网络编程涉及很多细节和技巧,一直想写篇文章来总结下这方面的...

3537
来自专栏小曾

.Net Web开发技术栈

有很多朋友有的因为兴趣,有的因为生计而走向了.Net中,有很多朋友想学,但是又不知道怎么学,学什么,怎么系统的学,为此我以我微薄之力总结归纳写了一篇.Net w...

1522
来自专栏高性能服务器开发

(六)关于网络编程的一些实用技巧和细节

这些年,接触了形形色色的项目,写了不少网络编程的代码,从windows到linux,跌进了不少坑,由于网络编程涉及很多细节和技巧,一直想写篇文章来总结下这方面的...

4115
来自专栏java技术学习之道

Java 11 新功能来了!

4444
来自专栏程序员的SOD蜜

单数据库,多数据库,单实例,多实例不同情况下的数据访问效率测试

最近公司的项目准备优化一下系统的性能,希望在数据库方面看有没有提升的空间,目前压力测试发现数据库服务器压力还不够大,Web服务器压力也不是很大的情况下,前台页面...

23510
来自专栏慎独

AVPlayer初体验之边下边播与视频缓存

1.3K5
来自专栏Jack-Cui

基于nRF24L01的一对多节点通信(一收多发)

平台:STM32F103ZET6 无线通信模块:nRF24L01 功能描述:使用nRF24L01构建无线通讯节点,实现一个节点接收,六个节点发送的无线...

2410
来自专栏逢魔安全实验室

DDCTF 2018 逆向 baby_mips Writeup

3285
来自专栏FreeBuf

VirtualApp技术黑产利用研究报告

一、 前言 VirtualApp(以下称VA)是一个App虚拟化引擎(简称VA)。VirtualApp创建了一个虚拟空间,你可以在虚拟空间内任意的安装、启动和卸...

2708
来自专栏Java 源码分析

Netty 入门

1. 粘包问题 一 .长连接与短连接: 1.长连接:Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送和接收。长连接在 net...

3697

扫码关注云+社区