本文将带你了解如何编写代码,使得 Windows8 商店应用可以保存文件(例如照片和文档)。你可以将这些文件存储在应用数据文件夹,或将它们保存到外部存储介质(如 USB 驱动器)。
例如你编写了一个文字处理应用,用户可能希望保存正在处理的文档,并在下次使用时打开它。又例如你编写了一个照片编辑应用,用户可能希望将修改后照片保存到 USB 驱动器,然后将该 USB 驱动器连接到电视机或数码相框以便以后查看。为了帮助你的用户达到目的,你可以在第一个例子中把文档保存到应用数据文件夹,而在第二个例子中把照片保存到外部存储介质。
下面介绍 Windows 商店应用的应用数据文件夹。每个应用程序可以将文件存储到特定设备上的一组单独的目录(分别是 local,roaming 和 temporary 目录):
当用户安装 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");