检查文件在 UWP 中是否有只读标志

Check whether file has read only flag in UWP

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

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

可以看到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);

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

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

我能想到的唯一解决方法(除了始终使用桌面扩展)是声明 broadFileSystemAccess 功能(我已经描述了过程 for example). This is a capability which gives you access to the whole filesystem and allows you to get a file using an arbitrary path with the StorageFile.GetFileFromPathAsync method (see Docs)。请注意,当您将应用程序提交到 Microsoft Store 时,您需要解释为什么需要此功能。

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

虽然无法使用 dotnet 方法检测只读属性,但是 GetFileAttributesExFromApp can be used to get a lot of attributes(readonly, hidden etc.) of the file that aren't available via StorageFile api. Also, SetFileAttributesFromApp 可用于 change/remove 这些属性。

编辑

在 MSDN 进行一些研究和深入研究后,我开始了解 RetrievePropertiesAsync(IEnumerable<String>)Windows.Storage.FileProperties.StorageItemContentPropertiesSavePropertiesAsync(IEnumerable<KeyValuePair<String,Object>>) 方法可用于按名称获取和设置属性(Full list of properties names), the name System.FileAttributes can be used to get file attributes and can be used to detect if read-only flag is present. While retrieving properties always works modifying properties will only work if app has write access to file (Windows.Storage.StorageFile.Attributes 不包含 ReadOnly 标志),尽管 SetFileAttributesFromApp 适用于此方案,但 SetFileAttributesFromApp 的限制是它不适用于敏感文件类型(.bat、.cmd 等)。所以这两种方法可以结合起来使用,以达到最大的效果。