【问题标题】:absolute path file - is located in special KnownFolders.PicturesLibrary绝对路径文件 - 位于特殊的 KnownFolders.PicturesLibrary
【发布时间】:2019-08-10 09:42:42
【问题描述】:

在面向 UWP 的应用程序中,如果文件(在我的应用程序中修改)已从应用程序无法写入的位置打开(在这种情况下,“另存为”只会能得到的)。但是,允许应用程序写入 KnownFolders.PicturesLibrary,我需要在代码中确定给定路径是否位于 PicturesLibrary(或该位置的嵌套子文件夹)内。

我能够判断一个路径是否是另一个路径的子文件夹,但对于 StorageFolder

StorageFolder picturesDirectory = KnownFolders.PicturesLibrary;

我得到空的 Path 属性值。

那么,我如何判断给定路径还是不是位于 PicturesLibrary 中?

有什么方法可以将 KnownFolders.Pictures 库解析为磁盘路径?

或者我应该使用打开文件时获得的绝对路径以外的其他东西来识别文件是否来自 PicturesLibrary?

【问题讨论】:

  • 我现在无法检查,但如果你查看PicturesLibrary 的所有 1 级子级,我认为它们应该是真正的文件夹。

标签: uwp filepath subdirectory known-folders storagefolder


【解决方案1】:

获取图片库路径的方法如下:

var myPictures = await Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Pictures);
string libraryPath = myPictures.SaveFolder.Path;

如果要判断图片是否在图片库中,可以通过比较路径来实现。

if(imagePath.StartsWith(libraryPath))
{
    // Todo
}

当然,你需要打开对图片文件夹的访问权限。

最好的问候。

【讨论】:

  • 只获取默认保存位置,而不是所有可能的文件夹。
【解决方案2】:

考虑到答案和 cmets,我创建了一个简单的例程,它将判断应用程序是否具有写访问权限。这一切都是关于创建一个小文件并测试保存几个字节的真正能力。看起来很健壮,重要的是它验证了有效的访问,而不是暗示。

代码:

private async Task<bool> CanWriteToSiblingFile(String inputPath)
        {
            try
            {
                StorageFile storageFile = await StorageFile.GetFileFromPathAsync(inputPath);
                var folder = await storageFile.GetParentAsync();

                var newFile = await folder.CreateFileAsync("temp_file.txt", CreationCollisionOption.GenerateUniqueName);

                using (Stream stream = await newFile.OpenStreamForWriteAsync())
                using (StreamWriter tw = new StreamWriter(stream, Encoding.UTF8))
                {
                    tw.Write("saving ability probe");
                    tw.Flush();
                }

                await newFile.DeleteAsync(StorageDeleteOption.PermanentDelete);
                return true;
            }
            catch(Exception ex)
            {
                return false;
            }
        }

这个答案解决了根本业务需求(检测覆盖能力),而不是我想用来实现业务需求的更具体的情况, - 所以更改线程标题可能是合适的……

最好的问候,迈克尔

【讨论】:

    猜你喜欢
    • 2012-02-21
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多