Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 检查文件在UWP中是否具有只读标志_File_Uwp_Win Universal App_Windows 10 Universal_Windows 10 Desktop - Fatal编程技术网

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

File 检查文件在UWP中是否具有只读标志,file,uwp,win-universal-app,windows-10-universal,windows-10-desktop,File,Uwp,Win Universal App,Windows 10 Universal,Windows 10 Desktop,我在一个UWP文本编辑器上工作。我已经添加了桌面扩展来修改系统文件和其他只读文件。我的问题是没有可靠的方法来检测文件是否具有只读属性FileInfo.IsReadOnly不起作用,从文件资源管理器拖放文件时,StorageFile.Attributes具有FileAttributes.ReadOnly 如何可靠地检查文件是否具有只读标志 您可以看到属性是否具有只读属性 var filePicker = new Windows.Storage.Pickers.FileOpenPicker(

我在一个UWP文本编辑器上工作。我已经添加了桌面扩展来修改系统文件和其他只读文件。我的问题是没有可靠的方法来检测文件是否具有只读属性
FileInfo.IsReadOnly
不起作用,从文件资源管理器拖放文件时,
StorageFile.Attributes
具有
FileAttributes.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
也设置了此属性,这是一个问题,希望在将来的版本中能够解决

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


通过广泛的文件系统访问,您可以拖放
StorageFile
,获取其
路径
,然后使用
StorageFile.getfilefrompathsync
再次检索相同的文件。此文件的新副本将不再具有“假阳性”只读属性,并将反映文件系统中的实际属性状态。

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

编辑 在对MSDN进行了一些研究和深入研究之后,我了解了
RetrievePropertiesAsync(IEnumerable)

SavePropertiesAsync(IEnumerable)
Windows.Storage.FileProperties.StorageItemContentProperties的方法可用于按名称()获取和设置属性,该名称可用于获取文件属性,并可用于检测是否存在只读标志。虽然检索属性始终有效,但仅当应用程序对文件具有写访问权限(不包含
ReadOnly
标志)时,修改属性才有效,尽管
SetFileAttributesFromApp
适用于该场景,但
SetFileAttributesFromApp
的限制是,它不适用于敏感文件类型(.bat、.cmd等)。因此,这两种方法可以结合使用以产生最大的效果。

您提到的
FileInfo.IsReadOnly
不起作用,是否会引发错误?如果您从桌面扩展调用API呢?调用
FileInfo.IsReadOnly
会在uwp应用程序中引发错误。是的,我可以为此呼叫桌面分机。但这会减慢保存文件的整个过程。请理解,
StorageFile.Attributes
无法正确报告
ReadOnly
?如果从文件资源管理器拖放文件,然后
StorageFile.Attributes
报告
ReadOnly
,即使文件本身没有进行只读检查。我已经添加了一个用于检测只读属性的答案。我在问题中提到,我的应用程序支持拖放功能,并且对于拖放的文件
StorageFile.Attributes
返回
FileAttributes。也是只读的。对于拖放的文件,它始终是只读的。这是出于设计。看到这个问题,我看到了您链接的问题,我知道拖放文件是只读的(我知道在uwp中使用
Windows.Storage.PathIO
绕过这个问题的解决方法)。我的问题是检测文件属性中是否启用了只读标志。我已经添加了一个用于检测只读属性的答案。因此在uwp中无法检测文件是否启用了只读标志??另外,您不需要
broadFileSystemAccess
来写入从资源管理器中拖放的文件(对我来说,这似乎有些过分和不可靠)。我已经发布了一个使用
PathIO
api的变通方法。很酷,我不知道!请考虑一下投票,这个问题显示更多的人可以知道这一点。“MartinZikmund,你能证实这是有效的吗?”你是如何调用SetFileAttributesFromApp方法的?@A.Caillet我可以确认这是有效的。如果你想要一个例子,我在UWP应用程序中实现了检查只读标志和更改只读标志。如果您特别想知道如何调用这些函数,请检查文件。