首页 文章

UWP应用程序从系统上的随机位置访问文件

提问于
浏览
4

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

3 回答

  • 1

    考虑这种方法..

    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 });
        }
    

    UPDATE

    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();
            }
        }
    }
    
  • 5

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

    我不确定为什么你认为它会让你的应用变慢,但唯一真正的方法来了解这是否会影响你的表现是尝试它并衡量你的目标 .

  • 2

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

相关问题