【问题标题】:Check whether file has read only flag in UWP检查文件在 UWP 中是否有只读标志
【发布时间】:2020-10-17 23:05:28
【问题描述】:

我正在开发 UWP 文本编辑器。我添加了桌面扩展来修改系统文件和其他只读文件。我遇到的问题是没有可靠的方法来检测文件是否具有只读属性。从文件资源管理器拖放文件时,FileInfo.IsReadOnly 不起作用,StorageFile.Attributes 具有 FileAttributes.ReadOnly

如何可靠地检查文件是否具有只读标志?

【问题讨论】:

  • 你提到FileInfo.IsReadOnly不起作用,它会抛出错误吗?如果您改为从桌面扩展调用 API 会怎样?
  • 调用 FileInfo.IsReadOnly 在 uwp 应用程序中引发错误。是的,我可以为此调用桌面扩展。但这会减慢保存文件的整个过程。
  • 简单了解一下,StorageFile.Attributes没有正确报ReadOnly的场景是什么?
  • 如果文件是从文件资源管理器拖放的,那么即使文件本身没有只读检查,StorageFile.Attributes 也会报告ReadOnly
  • 我添加了一个检测只读属性的答案。

标签: file uwp win-universal-app windows-10-universal windows-10-desktop


【解决方案1】:

虽然无法使用 dotnet 方法检测只读属性,但 GetFileAttributesExFromApp 可用于获取文件的许多属性(只读、隐藏等),这些属性无法通过 StorageFile 获得接口。此外,SetFileAttributesFromApp 可用于更改/删除这些属性。

编辑

在 MSDN 中进行一些研究和深入研究后,我开始了解 RetrievePropertiesAsync(IEnumerable<String>)SavePropertiesAsync(IEnumerable<KeyValuePair<String,Object>>) 用于Windows.Storage.FileProperties.StorageItemContentProperties 的方法,可用于按名称获取和设置属性(Full list of properties names),名称System.FileAttributes 可用于获取文件属性并可用于检测是否存在只读标志.虽然检索属性始终有效,但只有在应用程序对文件具有写访问权限(Windows.Storage.StorageFile.Attributes 不包含ReadOnly 标志)时,修改属性才有效,尽管SetFileAttributesFromApp 适用于该场景,但SetFileAttributesFromApp 的限制是它不会适用于敏感文件类型(.bat、.cmd 等)。所以这两种方法可以结合起来发挥最大的作用。

【讨论】:

  • 酷,不知道!
  • 请考虑支持这个问题,让更多人知道这一点。
  • @MartinZikmund 你能确认这是有效的吗?你是怎么调用 SetFileAttributesFromApp 方法的?
  • @A.Caillet 我可以确认这是可行的。如果您想要一个示例,请查看this PR,其中我在 UWP 应用程序Notepads 中实现了检查只读标志和更改只读标志。如果您特别想知道如何调用这些函数,请查看this 文件。
【解决方案2】:

你可以看到Attributes属性是否有ReadOnly

    var filePicker = new Windows.Storage.Pickers.FileOpenPicker();
    filePicker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail;
    filePicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.VideosLibrary;
    foreach (string format in HelperUP.subtitlesFormat)
        filePicker.FileTypeFilter.Add(format);
    var file = await filePicker.PickSingleFileAsync();
    if (file == null)
        return;

    Debug.WriteLine(file.Attributes);

【讨论】:

  • 我在我的问题中提到我的应用程序支持拖放功能,并且对于拖放的文件StorageFile.Attributes 也返回FileAttributes.ReadOnly
  • 对于您拖放的文件,它始终是只读的。这是设计使然。
  • 我已经看到了您链接的问题,并且我知道拖放文件是只读的(我知道在 uwp 中使用 Windows.Storage.PathIO 绕过它的解决方法)。我的问题是检测文件属性中是否启用了只读标志。
  • 我添加了一个检测只读属性的答案。
【解决方案3】:

FileAttributes.ReadOnly 引发异常的原因是 System.IO API 无法访问 UWP 中硬盘上的任意文件位置。

另一方面,通过拖放在应用程序中打开的StorageFile 也设置了此属性,这是continuously being discussed 的问题,希望在未来的版本中得到解决。

我能想到的唯一解决方法(除了总是使用桌面扩展)是声明broadFileSystemAccess 功能(例如,我已经描述了here 的过程)。这是一种使您能够访问整个文件系统的功能,并允许您使用StorageFile.GetFileFromPathAsync 方法使用任意路径获取文件(请参阅Docs)。请注意,当您将应用程序提交到 Microsoft Store 时,您需要说明为什么需要此功能。

通过广泛的文件系统访问,您可以拖放StorageFile,获取它的Path,然后使用StorageFile.GetFileFromPathAsync 再次检索相同的文件。该文件的新副本将不再具有“误报”只读属性,并将反映文件系统的实际属性状态。

【讨论】:

  • 所以 uwp 没有办法检测文件是否启用了只读标志?此外,您不需要broadFileSystemAccess 写入已从资源管理器拖放的文件(对我来说似乎过分且不可靠)。我已经使用PathIO api 的解决方法发布了here 的方法。
猜你喜欢
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 2011-11-22
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
相关资源
最近更新 更多