检查文件在 UWP 中是否有只读标志
Check whether file has read only flag in UWP
我正在开发 UWP 文本编辑器。我已经为它添加了桌面扩展来修改系统文件和其他只读文件。我遇到的问题是没有可靠的方法来检测文件是否具有只读属性。从文件资源管理器中拖放文件时,FileInfo.IsReadOnly
不起作用,StorageFile.Attributes
有 FileAttributes.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.StorageItemContentProperties
的 SavePropertiesAsync(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 等)。所以这两种方法可以结合起来使用,以达到最大的效果。
我正在开发 UWP 文本编辑器。我已经为它添加了桌面扩展来修改系统文件和其他只读文件。我遇到的问题是没有可靠的方法来检测文件是否具有只读属性。从文件资源管理器中拖放文件时,FileInfo.IsReadOnly
不起作用,StorageFile.Attributes
有 FileAttributes.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
功能(我已经描述了过程 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.StorageItemContentProperties
的 SavePropertiesAsync(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 等)。所以这两种方法可以结合起来使用,以达到最大的效果。