WinRT文件系统
WinRT和苹果的AppStore的新政策一样,也是一个沙箱环境,应用程序获得的权限十分有限。这虽然提高了程序的安全性,但是也妨碍了一些系统底层功能的开发,降低了用户体验。
WinRT中文件系统也被限制在了库中,这是Windows 7首次引入的类似于我的文档的目录结构,可以管理用户常用的文档、图片、音乐、视频等。
目前只能访问系统内置的几个库:文档、音乐、图片、视频,自定义的库我没有找到访问的方法。若想访问其他文件需要使用FilePicker、FolderPick等对话框,后续再来测试。
以文档库为例,测试一下文件系统。
大多数文件系统的API都位于Windows.Storage命名空间:
1、枚举目录中的顶层目录:
Windows.Storage.StorageFolder __doc = Windows.Storage.KnownFolders.DocumentsLibrary;
//枚举目录中的顶层目录
foreach (Windows.Storage.StorageFolder __folder in await __doc.GetFoldersAsync())
{
this.txtFolder.Text += __folder.Name + "\n";
}
GetFoldersAsync()没有递归的重载版本,若想要获取所有子目录,则需要写一个递归函数。
2、枚举目录中的顶层文件:
foreach (Windows.Storage.StorageFile __file in await __doc.GetFilesAsync())
{
this.txtFile.Text += __file.Name + "\n";
}
同上GetFilesAsync()也没有重载版本。
3、创建文件,若存在则覆盖:
await __doc.CreateFileAsync("Test.txt", Windows.Storage.CreationCollisionOption.ReplaceExisting);
4、创建目录,若存在则覆盖:
await __doc.CreateFolderAsync("Test", Windows.Storage.CreationCollisionOption.ReplaceExisting);
5、复制文件:
StorageFile __f = await __doc.GetFileAsync("Test.txt");
StorageFolder __fo = await __doc.GetFolderAsync("Test");
await __f.CopyAsync(__fo, "NewTest.txt", NameCollisionOption.ReplaceExisting);
await __f.CopyAndReplaceAsync(__f);
目录没有提供Copy方法,需要手动处理,先创建空目录,然后递归创建子目录、子文件。
6、重命名文件:
await __f.RenameAsync("NewTest.txt", NameCollisionOption.ReplaceExisting);
7、重命名目录:
await __fo.RenameAsync("NewTest", NameCollisionOption.ReplaceExisting);
8、剪切文件:
await __f.MoveAsync(__fo, "NewTest.txt", NameCollisionOption.ReplaceExisting);
目录没有提供剪切方法,也需要手动处理。
9、向文件中写入文本:
await FileIO.WriteTextAsync(__f, "写入文本");
FileIO是一个静态类,可以对指定文件进行操作。类似还有一个PathIO,针对指定绝对路径的文件或目录进行操作。
10、通过字节写入文件:
IBuffer __buffer = GetBufferFromString("通过字节写入");
await FileIO.WriteBufferAsync(__f, __buffer);
11、获取文件流:
IRandomAccessStream __stream = await __f.OpenAsync(FileAccessMode.ReadWriteNoCopyOnWrite);
12、删除文件,直接删除,不放进回收站:
await __f.DeleteAsync(StorageDeleteOption.PermanentDelete);
13、删除目录,直接删除,不放进回收站:
await __fo.DeleteAsync(StorageDeleteOption.PermanentDelete);
注意只能删除空目录,若目录中还有子目录或文件,则需要先删除子文件,需要递归删除。