WP8.1 Study12:文件压缩与Known Folder(包含SD卡操作)

一、文件压缩

当应用程序保存和加载数据,它可以使用压缩。

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;
        }
原文地址:https://www.cnblogs.com/NEIL-X/p/4166221.html