在应用程序间共享文件

时间:2017-02-01 17:54:58

标签: raspberry-pi3 windows-10-iot-core

我正在Pi 3上开发一个相当复杂的过程控制后台应用程序(使用c#,VC 2015)。这是以模块化方式开发和测试的(显示器,用户输入,gpio扩展板,各种类型的传感器,继电器,网络通信等)。每个模块都构建为一个单独的DLL,并使用自己的后台测试应用程序进行测试。

我的问题是我需要在所有模块中维护一组通用数据,尤其是一组应用程序参数。还有本地存储作为结果和日志记录的缓存。因此,几个不同的应用程序需要在开发期间访问这些数据 - 但一次只能访问一个。显然在最终项目中,会有一个应用程序,所以没问题。

我很惊讶地发现Win IoT似乎不允许不同应用程序访问简单文件。应用程序服务和其他应用程序间通信似乎都处于事务级别,在此处不合适。构建应用程序服务工具来处理所有I / O将是乏味的(最终不需要)。

有没有人知道如何理智地管理这种情况,拜托?

1 个答案:

答案 0 :(得分:2)

由于UWP应用的File access permissions。从本地存储中的文件读取数据似乎无法访问。

因此,如果您愿意使用连接到Raspberry Pi的可移动设备(外部存储)并将您的应用程序参数存储在文件(如文本文件)中,并从您的应用程序中读取数据。

我在桌面上测试以下代码(UWP app)并从多个应用程序成功读取数据。我相信你可以从一个应用程序读取Raspberry Pi上的数据,但我没有测试多个应用程序。你可以尝试一下。如果有任何疑虑,请随时告诉我。

        Task.Run( async () =>
        {
            var removableDevices = KnownFolders.RemovableDevices;

            var externalDrives = await removableDevices.GetFoldersAsync();

            var drive0 = externalDrives[0];

            var testFolder = await drive0.GetFolderAsync("test");

            var SharedDateFile = await testFolder.GetFileAsync("data.txt");

            var data = await FileIO.ReadTextAsync(SharedDateFile);

            System.Diagnostics.Debug.WriteLine(data);
        });

在应用清单中,您需要指定可移动存储功能并注册至少一个文件类型关联声明。

<强>更新

使用publisher folder是更好的解决方案。首先,在Package.appxmanifest中添加以下扩展名:

  <Extensions>
  <Extension Category="windows.publisherCacheFolders">
    <PublisherCacheFolders>
      <Folder Name="Folder1"/>
    </PublisherCacheFolders>
  </Extension>
  </Extensions>

然后像这样写下和读取文件:

        //Write file
        var folder = Windows.Storage.ApplicationData.Current.GetPublisherCacheFolder("Folder1");
        var file = await folder.CreateFileAsync("settings.txt", Windows.Storage.CreationCollisionOption.OpenIfExists);
        await FileIO.WriteTextAsync(file,"Hello writen by app1");

        //Read file
        var folder = Windows.Storage.ApplicationData.Current.GetPublisherCacheFolder("Folder1");
        var file = await folder.GetFileAsync("settings.txt");
        var text = await FileIO.ReadTextAsync(file);
        System.Diagnostics.Debug.WriteLine(text);