是否可以访问本地目录中的文件? (通用 Windows 平台)
is it possible to access files in local directories? (Universal Windows Platform)
我正在尝试了解如何访问本地文件而不是 ms-appx
资源等。但似乎不可能。我错过了什么吗?这个小例子抛出一个错误,但文件确实存在于驱动器 D 的根目录中。在通用 Windows 平台开发中是否可能?或者它可能只是在 PC 上调试时不起作用,但可能在真实设备上 windows IOT?
private void Button_Click(object sender, RoutedEventArgs e)
{
string path = @"D:\skyblue.jpg";
Uri uri_ = new Uri(path, UriKind.Absolute);
var a=Windows.Storage.ApplicationData.Current.LocalFolder;
Task.Run(() =>{
if (!File.Exists(path))
Dispatcher.RunAsync(CoreDispatcherPriority.Low, () =>
{
textBlock1.Text = "file not found";//this happens albeit file exists
});
});
}
https://channel9.msdn.com/Events/Build/2017/B8012
截至创作者的更新,在该视频的第 32:45 分钟左右,他们确认答案是 "none" -- 他们注意到您不能做的一件事是 "direct access to file system." 那是几个月前的事了,也许您正在使用更新的版本。但作为起点,我认为可以肯定地说文件访问(如果存在的话)是一项新功能。我还没有坐下来了解最新版本的功能,但如果您不是最前沿的,可以肯定地说您无法访问文件系统吗?
您需要使用 File.Exists() 来检查这样一个文件的路径:
string path = @"D:\test.jpg";
await Task.Run(() => {
if (!File.Exists(path))
throw new FileNotFoundException();
});
并使用 Directory.Exists() 来检查目录的路径,如下所示:
path = @"D:\test";
await Task.Run(() => {
if (!Directory.Exists(path))
throw new FileNotFoundException();
});
您可以找到详细信息here。
对于accessing Application data locations有两种方法:
// Method #1
string path = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "Project1", "1.jpg");
StorageFile file = await StorageFile.GetFileFromPathAsync(path);
// Method #2
StorageFile file1 = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/Project1/1.jpg"));
注:
- 您需要为 UWP 应用程序设置文件夹权限。例如,运行 Windows IoT 核心设备上的此命令:
FolderPermissions d:\test -e
- 您需要像这样声明文件类型:
您是要存储文件还是访问资源?目前尚不清楚您的最终目标。您也没有展示如何创建 path
。将此字符串写出以验证它是否在您认为的位置可能会有所帮助。
在我的一些应用程序中,我使用 _PathToPubCacheFolder = ApplicationData.Current.GetPublisherCacheFolder("YourInfoHere").Path;
来存储文件。
https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions 是一个很好的参考。
我正在尝试了解如何访问本地文件而不是 ms-appx
资源等。但似乎不可能。我错过了什么吗?这个小例子抛出一个错误,但文件确实存在于驱动器 D 的根目录中。在通用 Windows 平台开发中是否可能?或者它可能只是在 PC 上调试时不起作用,但可能在真实设备上 windows IOT?
private void Button_Click(object sender, RoutedEventArgs e)
{
string path = @"D:\skyblue.jpg";
Uri uri_ = new Uri(path, UriKind.Absolute);
var a=Windows.Storage.ApplicationData.Current.LocalFolder;
Task.Run(() =>{
if (!File.Exists(path))
Dispatcher.RunAsync(CoreDispatcherPriority.Low, () =>
{
textBlock1.Text = "file not found";//this happens albeit file exists
});
});
}
https://channel9.msdn.com/Events/Build/2017/B8012
截至创作者的更新,在该视频的第 32:45 分钟左右,他们确认答案是 "none" -- 他们注意到您不能做的一件事是 "direct access to file system." 那是几个月前的事了,也许您正在使用更新的版本。但作为起点,我认为可以肯定地说文件访问(如果存在的话)是一项新功能。我还没有坐下来了解最新版本的功能,但如果您不是最前沿的,可以肯定地说您无法访问文件系统吗?
您需要使用 File.Exists() 来检查这样一个文件的路径:
string path = @"D:\test.jpg";
await Task.Run(() => {
if (!File.Exists(path))
throw new FileNotFoundException();
});
并使用 Directory.Exists() 来检查目录的路径,如下所示:
path = @"D:\test";
await Task.Run(() => {
if (!Directory.Exists(path))
throw new FileNotFoundException();
});
您可以找到详细信息here。
对于accessing Application data locations有两种方法:
// Method #1
string path = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "Project1", "1.jpg");
StorageFile file = await StorageFile.GetFileFromPathAsync(path);
// Method #2
StorageFile file1 = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/Project1/1.jpg"));
注:
- 您需要为 UWP 应用程序设置文件夹权限。例如,运行 Windows IoT 核心设备上的此命令:
FolderPermissions d:\test -e
- 您需要像这样声明文件类型:
您是要存储文件还是访问资源?目前尚不清楚您的最终目标。您也没有展示如何创建 path
。将此字符串写出以验证它是否在您认为的位置可能会有所帮助。
在我的一些应用程序中,我使用 _PathToPubCacheFolder = ApplicationData.Current.GetPublisherCacheFolder("YourInfoHere").Path;
来存储文件。
https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions 是一个很好的参考。