从安卓平台到Win8:文件的处理
本文将介绍如何编写Win8中Windows Store里的应用代码,用于保存图像、文档等文件。在应用中,文件可以保存到应用定义的位置或USB设备之类的外部存储设备中。
用户可能在使用编辑器类程序时想要保存当前正在处理的文档,并立刻重新打开它。也可能用户在使用图像编辑程序时想将当前图片保存到USB设备中以便在电视上查看或在数码相框中使用。因此,你可以实现保存文件到应用定义位置或外部存储设备中的功能来帮助用户实现需求。
这里我简单说明一下Windows Store应用中文件存储功能的基础,每个程序都可以将文件存储到特定设备的一系列目录中(它们被称为本地目录、漫游目录以及临时目录)。
当用户安装了一个Windows Store应用后,Windows会自动创建这些目录,同时Windows也会引导程序到目录。你需要做的就是使用ApplicationData类去访问它们。当用户卸载应用时,Windows也会自动移除对应的目录。
Windows小技巧 如果用户想要存储一些更有价值、不可替代的文件,那么你需要让你的应用将其存储到SkyDrive之类的更具持久性的位置中。
在你想把文件存储到外部存储设备时,需要使用DeviceInformation类和StorageDevice类。这些内容以后会细讲,先展示一下刚才这些内容如何用代码实现。
在Windows Store应用中,保存一个名为hello.txt的文件,如果是本地目录的话需要这样写:
var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("Hello.txt");await FileIO.WriteTextAsync(file, "Hello world!");
如果是漫游目录的话则是这样:
var file = await ApplicationData.Current.RoamingFolder.CreateFileAsync("Hello.txt");await FileIO.WriteTextAsync(file, "Hello world!");
临时目录则是这样:
var tempFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync("TempFile.txt");
安卓小技巧 在安卓应用中,本地目录代码需要这么写:
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 Store应用只能访问它们自己的文件。
如果想要将文件存储到外部存储设备中,你必须先声明应用中的Package.appsxmanifest的Removable Storage属性。
声明后则需使用如下代码检测外部存储设备是否可用:
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");
安卓小技巧 在安卓应用中,同样的功能实现需要先在应用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");