0

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

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

StorageFolder picturesDirectory = KnownFolders.PicturesLibrary;

我得到空的 Path 属性值。

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

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

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

4

2 回答 2

0

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

编码:

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

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

最好的问候,迈克尔

于 2019-08-13T21:30:35.327 回答
0

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

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

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

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

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

此致。

于 2019-08-12T01:26:25.943 回答