UWP中如何写入从文件资源管理器拖放的只读文件?
解决UWP拖放只读文件无法写入的问题
这个坑我之前踩过!当从文件资源管理器拖放带ReadOnly属性的文件到UWP应用时,直接用StorageFile的写入API确实会抛出权限错误,核心原因就是只读属性限制了写入操作。下面是具体的解决步骤,还附带完整代码示例:
核心思路
先移除文件的ReadOnly属性,完成写入后可以选择恢复原属性(推荐这么做,避免改变用户文件的原始状态)。
具体实现步骤
- 步骤1:备份原始文件属性
先获取拖放过来的StorageFile的原始Attributes,保存下来,方便后续恢复。 - 步骤2:移除只读属性
通过StorageFile.Properties修改文件属性,去掉FileAttributes.ReadOnly标记。 - 步骤3:执行写入操作
此时文件已经允许写入,调用FileIO或者Stream相关API完成写入。 - 步骤4:(可选)恢复原始属性
写入完成后,把文件属性改回之前备份的状态,尊重用户文件的原始设置。
完整代码示例(C#)
private async Task WriteToReadOnlyDroppedFileAsync(StorageFile droppedFile, string contentToWrite) { // 步骤1:备份原始属性 var originalAttributes = (FileAttributes)await droppedFile.Properties.GetAttributesAsync(); try { // 步骤2:移除ReadOnly属性 await droppedFile.Properties.SetAttributesAsync(originalAttributes & ~FileAttributes.ReadOnly); // 步骤3:执行写入操作(这里以写入文本为例,你可以换成自己的写入逻辑) await FileIO.WriteTextAsync(droppedFile, contentToWrite); } finally { // 步骤4:恢复原始属性(无论写入成功还是失败,都尽量恢复) await droppedFile.Properties.SetAttributesAsync(originalAttributes); } }
注意事项
- 确保你的UWP应用有对应的文件访问权限:拖放过来的文件默认会授予应用临时权限,所以修改属性和写入操作一般都能正常执行,不需要额外声明 broadFileSystemAccess 权限(除非是特殊场景)。
- 放在
finally块里恢复属性很重要,这样即使写入过程中抛出异常,也不会把用户的文件改成非只读状态。 - 如果你的写入逻辑是用
IRandomAccessStream实现的,记得在写入完成后关闭流,再执行属性恢复操作。
内容的提问来源于stack exchange,提问作者Soumya Mahunt
相关产品推荐
相关产品推荐

