【问题标题】:UWP apps accessing files from random location on systemUWP 应用程序从系统上的随机位置访问文件
【发布时间】:2015-12-18 00:05:06
【问题描述】:

在 UWP 中存在文件和权限限制,因此我们只能直接从少数文件夹访问文件,或者我们可以使用文件选择器从系统上的任何位置访问。 如何使用从文件选择器中挑选的文件并在应用程序运行时再次使用它们?尝试通过路径再次使用它们,但它给出了权限错误。我知道“futureacceslist”,但它的限制是 1000,如果我没记错的话,它会使应用程序变慢吗? . 有一个更好的方法吗 ?或者我们可以以某种方式将存储文件链接存储在本地 sqlite 数据库中吗?

【问题讨论】:

    标签: windows-10 uwp file-access filepicker


    【解决方案1】:

    有点晚了,但是,是的,未来的访问列表会降低您的应用程序的速度,因为它会返回 storagfile、storagefolder 或 storeageitem 对象。它们通过运行时代理运行,无论主机能力如何,它都会在大约 400 个对象上遇到巨大的性能障碍

    【讨论】:

      【解决方案2】:

      考虑这个方法..

          public async static Task<byte[]> ToByteArray(this StorageFile file)
          {
              byte[] fileBytes = null;
              using (IRandomAccessStreamWithContentType stream = await file.OpenReadAsync())
              {
                  fileBytes = new byte[stream.Size];
      
                  using (DataReader reader = new DataReader(stream))
                  {
                      await reader.LoadAsync((uint)stream.Size);
                      reader.ReadBytes(fileBytes);
                  }
              }
      
              return fileBytes;
          }
      

      这门课..

          public class AppFile
          {
              public string FileName { get; set; }
              public byte[] ByteArray { get; set; }
          }
      

      还有这个变量

          List<AppFile> _appFiles = new List<AppFile>();
      

      只是..

          var fileOpenPicker = new FileOpenPicker();
          IReadOnlyList<StorageFile> files = await fileOpenPicker.PickMultipleFilesAsync();
      
          foreach (var file in files)
          {
              var byteArray = await file.ToByteArray();
              _appFiles.Add(new AppFile { FileName = file.DisplayName, ByteArray = byteArray });
          }
      

      更新

      using Newtonsoft.Json;
      using System.Linq;
      using Windows.Security.Credentials;
      using Windows.Storage;
      
      namespace Your.Namespace
      {
          public class StateService
          {
              public void SaveState<T>(string key, T value)
              {
                  var localSettings = ApplicationData.Current.LocalSettings;
                  localSettings.Values[key] = JsonConvert.SerializeObject(value);
              }
      
              public T LoadState<T>(string key)
              {
                  var localSettings = ApplicationData.Current.LocalSettings;
                  if (localSettings.Values.ContainsKey(key))
                      return JsonConvert.DeserializeObject<T>(((string)    localSettings.Values[key]));
                  return default(T);
              }
      
              public void RemoveState(string key)
              {
                  var localSettings = ApplicationData.Current.LocalSettings;
                  if (localSettings.Values.ContainsKey(key))
                      localSettings.Values.Remove((key));
              }
      
              public void Clear()
              {
                  ApplicationData.Current.LocalSettings.Values.Clear();
              }
          }
      }
      

      【讨论】:

      • 这是一个非常好的答案,也很简单,很明显,我使用字节数组系统将每个文件存储在类 Appfiles 列表中,这对我来说很清楚。但我的问题是,当我再次启动应用程序时,如何再次访问这些文件?您是否建议我可以将该列表数据存储在 sqlite 数据库中?然后再使用该数据访问和读取这些文件?那可能吗?如果是,那么请告诉我使用哪种方法从字节数组中读取文件?还是我需要将它们转换回存储文件? :)
      • SQLite 不是必需的,请查看更新后的答案 ;)!
      • 字符串键是我可以提供的值吗?以便我以后可以使用它来检索文件?我的意思是它可以是与该文件关联的任何字符串?而“T”值是我要保存以备后用的存储文件对吗?
      • 而且“Jsonconvert”也没有被识别,为什么会这样?并且没有要包含的名称空间来删除​​我尝试过的错误,包括使用 Newtonsoft.Json;但是这个命名空间也没有被识别,请帮助解决这个问题:)
      • 您需要将带有 Nugget 的 Json.NET 添加到您的项目中,然后不要忘记将命名空间添加到您的类中:“using Newtonsoft.Json;”
      【解决方案3】:

      如果您需要访问大量文件,请让用户选择父文件夹然后存储这可能是更好的解决方案(除非您想存储 1,000 个从不同位置单独挑选的文件)。您也可以将StorageFolders 存储在访问列表中。

      我不确定您为什么认为它会使您的应用变慢,但要知道这是否会影响您的性能,唯一真正的方法是尝试并根据您的目标进行衡量。

      【讨论】:

      • 我真的很喜欢你的回答,请你澄清一下如何存储用户会给我的父文件夹?整个文件夹可以存储在futureaccesslist中吗?然后以后可以通过代码访问该文件夹中的每个文件?
      • 是的,您只需像存储文件一样存储它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      相关资源
      最近更新 更多