从 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 条评论
登录 后参与评论

相关文章

来自专栏小樱的经验随笔

破解Zip加密文件常用的几种方法

从网络上下载了一个zip文件,最后却发现它是用密码保护的,或者自己用密码加密了一个很重要zip文件,但是一段时间后忘记了密码,无法打开。这个时候,我们就可能就需...

1713
来自专栏cloudskyme

JBPM4.4(1)-简单工程的搭建

源码下载 https://anonsvn.jboss.org/repos/jbpm/jbpm4/ JBPM是什么? jBPM是一个可扩展、灵活的流程引擎, 它可...

2455
来自专栏晨星先生的自留地

实战系列之你真的会mysql注入么?

1605
来自专栏技术小黑屋

Octopress中嵌入ruby代码如何不被解析

用Octopress写博客即将快一年了,感觉自己用的还可以,并且借此熟练使用了Markdown,但是前几天写一篇关于如何在Octopress中集成多说评论的文章...

652
来自专栏逸鹏说道

NET跨平台:在Ubuntu下搭建ASP.NET 5开发环境

0x00 写在前面的废话 年底这段时间实在太忙了,各种事情都凑在这个时候,没时间去学习自己感兴趣的东西,所以博客也好就没写了。最近工作上有个小功能要做成Web应...

2433
来自专栏酷玩时刻

支付宝Wap支付你了解多少?

为了方便开发者生成一对RSA密钥支付宝提供一键生成工具,具体如何生成与配置密钥详见签名专区。

982
来自专栏XAI

Dubbo与Zookeeper、SpringMVC整合和使用(入门级)

后续会补充完善SpringMVC部分 项目码云GIT地址:https://gitee.com/xshuai/dubbo/ 开发工具 MyEclipse 1...

4398
来自专栏假装我会写代码

Laravel Bash 别名

862
来自专栏FreeBuf

文件监控程序V2.0改进版(网站防挂马好手)

前言 技多不压身,多掌握几种不同的编程语言,不但有助于开拓我们的视野,还可以让我们在工作时,自己写一些小程序来帮我们减少工作量。 前段时间给一个客户维护服务器,...

1685
来自专栏晨星先生的自留地

渗透某网站

2034

扫码关注云+社区