• 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;
            }
  • 相关阅读:
    mysql错误:java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone.
    MyBatis中id回填的两种方式
    springboot项目打war包流程
    Caused by: java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forget to include springcloudstarterloadbalancer?
    idea thymeleaf页面变量报错解决
    项目编码流程
    逻辑删除
    mysql 连接url中需要添加useUnicode=true&characterEncoding=UTF8
    【转】[wp7应用内截图]Taking a screenshot from within a Silverlight #WP7 application
    Wp7客户端与Webservice的数据传输,json的序列化与反序列化
  • 原文地址:https://www.cnblogs.com/NEIL-X/p/4166221.html
Copyright © 2020-2023  润新知