Win10/UWP新特性系列-GetPublisherCacheFolder

微软Windows Runtime App拥有很强的安全模型来防止不同App之间的数据获取和共享,也就是我们所说的"沙盒机制",每个App都运行在Windows沙盒中,App之间的数据是不会被别的App获取到的。

在UWP中,微软新增了GetPublisherCacheFolder —— 共享存储文件夹的机制,这个获取的共享存储文件夹并不是说打破了原有的"沙盒机制",而是指,同一个软件开发商发布的App之间,是允许访问一个共享的文件夹以及里面的内容。例如,多个应用程序使用相同的图片或者相同的自定义字体,你就可以将这些文件保存在共享存储文件夹中,再或者类似腾讯,腾讯可以把QQ用户的登录信息存储到共享文件夹中,方便于腾讯其他App(QQ空间、QQ音乐等)获取登录信息实现免登录功能。当然,微软的意见还是说让用户有权利了解并知情自己的哪些信息被存储到了共享存储空间中,并还拥有拒绝此操作的权利。

应用的共享存储文件夹将会伴随着第一次安装该开发商的App时创建(如果App使用了该特性)。当然共享存储文件夹也有限制和使用要求:

  • 共享数据文件夹不能作为备份和漫游数据来使用,此外,用户有权利知情共享存储文件夹里面的数据。
  • 不同的软件开发商之间是不能进行共享数据文件夹操作
  • 不能把不同用户之间的数据存储到共享存储文件夹内,防止用户隐私被其他用户知情
  • 共享存储文件夹没有版本控制机制

▲ 声明共享存储文件夹

首先,我们需要在App配置文件中声明这些共享存储文件夹名称,不需要提前创建好这些文件夹,系统会自己帮你创建。

<Package>

  …

  <Extensions>

    …

    <Extension Category="windows.publisherCacheFolder">

      <PublisherCacheFolder>

        <Folder Name="Folder1">

          <Folder Name="Folder2">

</PublisherCacheFolder>

    </Extension>

    …

  </Extensions>

  …

</Package>

  

▲ 访问共享数据文件夹

我们可以调用GetPublisherCacheFolder方法获取共享数据文件夹:

StorageFolder sharedFonts = Windows.Storage.ApplicationData.Current.GetPublisherCacheFolder("fonts");

  

然后使用StorageFolder类来操作共享存储文件和文件夹。

▲ 共享存储文件夹使用限制

  • 共享存储文件夹中没有默认的子文件夹,你在调用GetpublisherCacheFolder 方法时必须填写要操作的文件夹名称
  • 只允许访问配置清单中给出的文件夹
  • 不允许访问共享存储文件夹的根目录文件夹

▲ 共享存储文件夹的清理

我们可以调用ClearPublisherCacheFolderAsync方法来明确指定要清理哪个子文件夹的文件或者哪个共享存储文件夹。共享文件夹自行删除是在卸载最后一个该开发商的App时发生的,共享文件夹是不受App应用程序保护的,当存在多个该开发商的App时,直到卸载最后一个,共享存储文件夹才会彻底被系统删除。

下面举个例子,我们在两个App中都声明使用共享存储文件夹,然后从App_A中存储一个字符串到共享存储文件夹中的一个文件,接着我们在App_B中来获取这个字符串,

App_A和App_B的UI Code 和 cs代码完全一致。

首先,创建一个UWP解决方案,然后创建两个项目

接着分别打开两个项目的Package.appxmanifest文件,添加对共享存储文件的声明:

1 <Extensions>
2   <Extension Category="windows.publisherCacheFolders">
3     <PublisherCacheFolders>
4       <Folder Name="Folder1"/>
5       <Folder Name="Folder2"/>
6     </PublisherCacheFolders>
7   </Extension>
8 </Extensions>

然后在页面上创建一个文本框和两个按钮,如下:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel
        HorizontalAlignment="Center"
        VerticalAlignment="Center">
        <TextBox  x:Name="txtShare" Width="300"/>
        <StackPanel Orientation="Horizontal">
            <Button
            x:Name="btnRead"
            Click="btnRead_Click"
            Margin="3"
            HorizontalAlignment="Left"
            Content="读取一个共享的值"/>
            <Button
            x:Name="btnSave"
            Click="btnSave_Click"
            Margin="3"
            HorizontalAlignment="Right"
            Content="写入一个共享的值"/>
        </StackPanel>
    </StackPanel>
</Grid>

添加后台代码:

 1 private async void btnSave_Click(object sender, RoutedEventArgs e)
 2 {
 3     if (string.IsNullOrEmpty(txtShare.Text.Trim())) return;
 4     var sharedFolder1 = Windows.Storage.ApplicationData.Current.GetPublisherCacheFolder("Folder1");
 5
 6     var shareFile = await sharedFolder1.CreateFileAsync("share.txt", Windows.Storage.CreationCollisionOption.ReplaceExisting);
 7
 8     using (Stream stream = await shareFile.OpenStreamForWriteAsync())
 9     {
10         byte[] content = System.Text.Encoding.UTF8.GetBytes(txtShare.Text.Trim()+" From A ");
11         await stream.WriteAsync(content, 0, content.Length);
12     }
13 }
14
15 private async void btnRead_Click(object sender, RoutedEventArgs e)
16 {
17     var sharedFolder1 = Windows.Storage.ApplicationData.Current.GetPublisherCacheFolder("Folder1");
18     StorageFile shareFile = null;
19     try
20     {
21         shareFile = await sharedFolder1.GetFileAsync("share.txt");
22     }
23     catch (Exception exc)
24     {
25         await new MessageDialog(exc.Message, "提示").ShowAsync();
26     }
27
28     if (shareFile != null)
29     {
30         var accessStream = await shareFile.OpenReadAsync();
31         using (Stream stream = accessStream.AsStreamForRead((int)accessStream.Size))
32         {
33             byte[] content = new byte[stream.Length];
34             await stream.ReadAsync(content, 0, (int)stream.Length);
35
36             txtShare.Text = System.Text.Encoding.UTF8.GetString(content, 0, content.Length);
37         }
38     }
39 }

为了区分两个App存进去的值,我在存储的时候给加上了App标志(A or B),来看下效果:



推荐一个UWP开发群:53078485 大家可以进来一起学习

时间: 2024-09-30 14:20:28

Win10/UWP新特性系列-GetPublisherCacheFolder的相关文章

Win10/UWP新特性系列—Launcher实现应用间的通信

UWP中,微软为Windows.System.Launcher启动器新增了很多的功能,以前只能启动App,打开指定扩展名文件,对uri协议的解析,以及当启动的应用没有安装时则会提示前往商店下载等. 如今,微软丰富了Launcher的功能,使用新的Launcher我们可以在App中实现调用文件资源管理器.App-To-App Server(应用对应用服务),Background Task Server App(后台任务处理服务App)还有设置页面调用. 一:Launcher.LaunchFolde

Win10/UWP新特性系列—使用打印机

微软在Win10时代终于完成的设备系统的大统一,"56个民族,56支花……"(⊙o⊙)…,既然统一了,那么也就意味着API也统一了,所以在UWP中,我们就可以使用统一的打印API来为设备(包括移动设备)添加基于XAML的App打印功能.使用Windows.Graphics.Printing和Windows.UI.Xaml.Printing命名空间,就可以很方便的将打印功能添加到我们的应用中. 下面是个例子,我们需要打印一个购物清单,前台代码如下: 1 <Page.Resource

Win10/UWP新特性系列—电池报告

UWP中,新增了当节电模式开启时,App能获取到通知的API,通过响应电源条件的更改,比如咨询用户是否使用黑色背景等来帮助延长电池使用时间. 通过Windows.Devices.Power命名空间中的电池API,你可以了解到正在运行的设备所有的电池详细信息. 通过创建Battery对象来表示单个电池控制器或聚合的所有电池控制器,然后使用GetReport方法返回BatteryReport对象,该对象可指示响应电池的充电.容量和状态. 需要用到的资源: Battery:提供该设备的电池控制器信息类

Win10/UWP新特性—Drag&amp;Drop 拖出元素到其他App

在以前的文章中,写过微软新特性Drag&Drop,当时可能由于处于Win10预览版,使用的VS也是预览版,只实现了从桌面拖拽文件到UWP App中,没能实现从UWP拖拽元素到Desktop App & UWP App中.昨天重新研究了Win10 拖拽这一块,发现以前没能实现的功能,在正式版的环境下都可以实现了,做个笔记以防日后忘记. 在UWP中,想要拖动元素到Desktop或者另一个UWP App中,除了设置元素的CanDrag="True"我们要使用元素的DragSt

Win10/UWP新特性—SharedStorageAccessManager 共享文件

首先先给大家推荐一个UWP/Win10开发者群:53078485  里面有很多大婶,还有很多学习资源,欢迎大家来一起讨论Win10开发! 在UWP开发中,微软提供了一个新的特性叫做SharedStorageAccessManager,它允许我们的App根据指定的文件生成一个FileToken来共享此文件,其他App可以使用SharedStorageAccessManager. RedeemTokenForFileAsync(fileToken);方法根据FileToken来获取到共享的文件.这样

atitit。win7 win8 win9 win10 win11 新特性总结与战略规划

atitit.win7 win8 win9 win10  win11 新特性总结与战略规划 1. win7 1 1.1. 发布时间 2009年10月22日 1 1.2. 稳定性大幅提升,很少蓝屏死机 1 1.3. 很少损坏不能启动(只有一次,2年,多机) 1 1.4. PC也可以触摸 1 2. win8 新特性 2 2.1. 2012年2月29日 2 2.2. Metro界面跨平台(移动平台,) 2 2.3. 本文导航 2 2.4. U盘上也可运行 2 3. win9 新特性 3 3.1. wi

UWP/Win10新特性系列—App Service

Win10中,新增了一个很实用的新特性叫做App Service,App Service允许App不在前台运行的情况下提供出一个或多个对外服务供其他App使用,这看起来就好像Web开发中的Web Api. 通过对外提供服务的形式,可以使App更好的完成一些其他App所拥有的专业性操作,而不必自己再去实现服务所做的操作.一些企业用户可以提供复杂的服务,比如云识别和云存储来供开发者使用.这样使开发成本大大降低,也可以为服务提供商带来更多的用户.比如我们可以调用二维码识别服务(如下图,假设其他App提

UWP/Win10新特性系列—UserConsentVerifier

在UWP开发中,微软提供了新的用户许可验证方式-指纹(生物识别).Pin.密码验证.在爆料的新型Win10 Mobile移动设备中,会增加虹膜识别等先进的用户身份识别技术,微软现在统一了身份验证的API,将生物识别认证和传统的密码识别封装为系统API供开发者调用,调用者只需关心认证的结果,而无需担心用户使用的是虹膜识别还是指纹还是密码等其他的识别技术. 通过UserConsentVerifier类可以提高应用程序的安全性,例如,你可以授权应用程序的购买,或者访问受限制的资源之前需要指纹验证.下面

Atitit.业务系统的新特性&#160;开发平台&#160;新特性的来源总结

Atitit.业务系统的新特性 开发平台 新特性的来源总结 1.1. 语言新特性(java c# php js python lisp c++ oc swift ruby  go dart1 1.2. 流行lib.frmawork  新特性 jdk clr framework 新特性 (jq   Servlet2 1.3. Ide 新特性( eclipse vs netbea jetbrain2 1.4. Vm  新特性 clr  jvm(jvm好像没有独立的版本号,继承在jdk里面2 1.5.