从 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 7的VPC虚拟机自动不与主机时间同步的解决办法

Virtual PC下的虚拟机会自动与当前host主机的时间同步。但是很多时候,测试虚拟机会很久以后再跑,可是你会发现由于时间不断同步,会导致一些windows...

2087
来自专栏FreeBuf

WebLogic CVE-2018-2628漏洞验证

北京时间4月18日凌晨,Oracle官方发布了4月份的关键补丁更新CPU(CriticalPatchUpdate),其中包含一个高危的Weblogic反序列化漏...

941
来自专栏信安之路

Mimikatz 攻防杂谈

前几天看到了老外一篇讲 mimikatz 防御的文章,感觉行文思路还不错,但是内容稍有不足,国内也有一篇翻译,但是只是照着错误翻译的,所以就萌生了把那篇优秀文章...

1692
来自专栏信安之路

Cobalt Strike 初体验

Cobalt Strike 一款以 metasploit 为基础的 GUI 的框架式渗透测试工具,集成了端口转发、服务扫描,自动化溢出,多模式端口监听,win ...

730
来自专栏漏斗社区

工具|nessus自定义扫描策略

我们是谁? nessus工具! 我们要做什么? 扫描漏洞! 什么时候扫? 天天扫! 序言 有些时候我们并不希望进行全面的扫描和检测,仅需要针对某些漏洞进行安全...

4636
来自专栏Linux Python 加油站

Linux 之父如何定义 Linux?

来源:马哥教育链接:https://mp.weixin.qq.com/s/wwBt5H68tHmf_lHXrd_eSQ本文是 Linus 写于 1991年10月...

602
来自专栏Phoenix的Android之旅

Android的 targetsdkversioin

可能会好奇 targetsdkversioin这个配置是用来干嘛的。 也有很多一两年开发经验的 Android码农会在面试中被问到这个问题。

852
来自专栏云计算

通过与Quickbuild和Mist.io的持续集成实现云管理和使用监控

总结我自己有关 Openstack 的各种骚操作先告一段落。这一次我想谈谈有关监控云服务的使用情况。

32410
来自专栏更流畅、简洁的软件开发方式

【自然框架】——Demo(一)

  这是一个应用自然框架写的一个“配置信息管理程序”,目的就是管理配置信息的,因为自然框架最主要的就是“配置信息”也就是元数据,那么这个配置信息要怎么管理?手动...

22310
来自专栏杨建荣的学习笔记

​ssh免密码登录设置及问题总结

前几天写了一篇文章关于ssh命令的几个使用小技巧(r11笔记第27天),很多朋友给了不少的建议,其中郭亮同学整理了一篇文章发给我在此表示感谢。 关于ssh免密码...

37210

扫码关注云+社区