I am working on an UWP text editor. I have added desktop extension to it to modify system files and other read only files. The problem I have is there is no reliable way to detect if a file has read-only attribute. FileInfo.IsReadOnly
doesn't work and StorageFile.Attributes
has FileAttributes.ReadOnly
when file is dragged and dropped from file explorer.
How do I reliably check whether the file has read only flag or not?
While there is no way to detect the readonly attribute by using dotnet methods, however 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
can be used to change/remove these attributes.
After some research and deep dive in MSDN, I came to know about RetrievePropertiesAsync(IEnumerable<String>)
and
SavePropertiesAsync(IEnumerable<KeyValuePair<String,Object>>)
methods for Windows.Storage.FileProperties.StorageItemContentProperties
which can be used to get and set properties by name (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
doesn't contain ReadOnly
flag), although SetFileAttributesFromApp
works for that scenario but limitation of SetFileAttributesFromApp
is it won't work for sensitive file types (.bat, .cmd etc.). So both those methods could be used combined to have maximum effect.