UWP 应用程序从系统上的随机位置访问文件
UWP apps accessing files from random location on system
UWP中有文件和权限限制,所以我们只能直接从几个文件夹中访问文件,或者我们可以使用filepicker从系统的任何地方访问。
如何使用从文件选择器中选取的文件并在应用程序运行时再次使用它们?试图通过路径再次使用它们,但它给出了权限错误。我知道 "futureacceslist" 但它的限制是 1000,而且如果我没记错的话它会使应用变慢? .
有一个更好的方法吗 ?或者我们可以将存储文件 link 以某种方式存储在本地 sqlite 数据库中吗?
如果您需要访问大量文件,请用户访问 select 父文件夹然后存储它可能是更好的解决方案(除非您想存储 1,000 个从不同位置单独挑选的文件) .您也可以在访问列表中存储 StorageFolder
s。
我不确定为什么您认为它会使您的应用变慢,但了解这是否会影响您的性能的唯一真正方法是尝试并衡量您的目标。
考虑这个方法..
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;
}
这个class..
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();
}
}
}
有点晚了,但是,是的,未来的访问列表会减慢您的应用程序,因为它 returns storagfile、storagefolder 或 storeageitem 对象。这些 运行 通过 运行 时间代理,无论主机能力如何,它在大约 400 个对象时都会遇到巨大的性能障碍
UWP中有文件和权限限制,所以我们只能直接从几个文件夹中访问文件,或者我们可以使用filepicker从系统的任何地方访问。 如何使用从文件选择器中选取的文件并在应用程序运行时再次使用它们?试图通过路径再次使用它们,但它给出了权限错误。我知道 "futureacceslist" 但它的限制是 1000,而且如果我没记错的话它会使应用变慢? . 有一个更好的方法吗 ?或者我们可以将存储文件 link 以某种方式存储在本地 sqlite 数据库中吗?
如果您需要访问大量文件,请用户访问 select 父文件夹然后存储它可能是更好的解决方案(除非您想存储 1,000 个从不同位置单独挑选的文件) .您也可以在访问列表中存储 StorageFolder
s。
我不确定为什么您认为它会使您的应用变慢,但了解这是否会影响您的性能的唯一真正方法是尝试并衡量您的目标。
考虑这个方法..
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;
}
这个class..
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();
}
}
}
有点晚了,但是,是的,未来的访问列表会减慢您的应用程序,因为它 returns storagfile、storagefolder 或 storeageitem 对象。这些 运行 通过 运行 时间代理,无论主机能力如何,它在大约 400 个对象时都会遇到巨大的性能障碍