一、文件压缩
当应用程序保存和加载数据,它可以使用压缩。
1、使用 Windows.Storage.Compression.Compressor 压缩,获得一个Compressor stream。
var s = await destFile.OpenAsync(FileAccessMode.ReadWrite); Compressor compressor = new Compressor(s.GetOutputStreamAt(0), CompressAlgorithm.Mszip, 0);
其中,Mszip是压缩算法之一,我们还可以用Xpress、XpressHuff、Lzms算法压缩。0,表示使用默认的压缩块的大小。
2、解压使用Decompressor
二、Known Folder
KnownFolders是一个API,简化了开发人员的访问手机上的用户数据。在KnownFolders中包括设备上的SD卡(如果已插入)上的文件,而且在KnownFolders上的文件是所有APP共同拥有的。
1、KnownFolders 视图(例子)
2、获取用户的数据
KnownFolders提供方法获取手机上的图片、视频、音乐,比如获取手机上的图片,代码如下:
var pictures = await Windows.Storage.KnownFolders.PicturesLibrary.GetFilesAsync();
3、使用SD卡
App可以读写文件到SD卡中,而且这使得能够应用到在彼此之间共享数据。由于SD卡代表了一个“共享”资源,应用程序必须在manifest申请它想访问的文件类型关联。
(1)准备
让一个App有能力使用SD卡,是需要事先设置一些功能。
要把Removable Storage 功能打勾,如果你需要使用KnownFolder API,可能你要把Picture Library等功能打开。
(2)为程序关联想要访问文件的类型
在manifest中,为应用程序指定一个与它关联的文件类型,这样程序才能打开这种类型的文件,如图所示
(这个程序使.txt格式文件与之关联)
(3)获取SD卡操作
var devices = Windows.Storage.KnownFolders.RemovableDevices; var sdCards = await devices.GetFoldersAsync(); if (sdCards.Count == 0) return; var firstCard = sdCards[0];//firtCard是sd卡的根目录,可以在上面创建文件夹及文件
Note:我们可以在模拟器模拟SD卡操作,方法是打开WP8.1模拟器的工具面板,在sd卡界面模拟插入sd卡(同时也可以弹出sd卡),如下图
(4)例子
在sd卡上读取写入文件的完整方法。
写:
private async void writeCustomersToSDCard(string foldername, string filename, Customers customers) { var devices = Windows.Storage.KnownFolders.RemovableDevices; var sdCards = await devices.GetFoldersAsync(); if (sdCards.Count == 0) return; var firstCard = sdCards[0]; StorageFolder notesFolder = await firstCard.CreateFolderAsync(foldername, CreationCollisionOption.OpenIfExists); Stream stream = await notesFolder.OpenStreamForWriteAsync(filename, CreationCollisionOption.ReplaceExisting); DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Customers)); serializer.WriteObject(stream, customers); await stream.FlushAsync(); stream.Dispose(); }
读:
private async Task<Customers> readCustomersFromSDCard(string foldername, string filename) { var devices = Windows.Storage.KnownFolders.RemovableDevices; var sdCards = await devices.GetFoldersAsync(); if (sdCards.Count == 0) return null; var firstCard = sdCards[0]; StorageFolder notesFolder = await firstCard.GetFolderAsync(foldername); Stream stream = await notesFolder.OpenStreamForReadAsync(filename); DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Customers)); Customers result = serializer.ReadObject(stream) as Customers; stream.Dispose(); return result; }