UWP StorageFile.CopyAsync() 引发错误:“值不在预期范围内。”
Posted
技术标签:
【中文标题】UWP StorageFile.CopyAsync() 引发错误:“值不在预期范围内。”【英文标题】:UWP StorageFile.CopyAsync() Throwing Error: "Value does not fall within the expected range." 【发布时间】:2020-01-13 08:06:31 【问题描述】:我正在尝试用 AppData 子目录中的新版本覆盖文件。
当前过程是用户必须选择要覆盖的文件,以及它所在的文件夹目录,以便我可以将它们添加到将来的访问列表中。稍后用户可以从一组图像中进行选择,此时它需要复制并覆盖目标文件。我尝试这样做的代码如下:
// lets try to copy file to wallpaper default location.
ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings;
var faToken = localSettings.Values["WallpaperStorageFileFAToken"] as string;
var faTokenFolder = localSettings.Values["WallpaperStorageFolderFAToken"] as string;
var destinationFile = await LoadExistingFileSelection(faToken);
var destinationFolder = await LoadExistingFolderSelection(faTokenFolder);
StorageFile movedFile = null;
try
movedFile = await imageFile.CopyAsync(destinationFolder, destinationFile.Name, NameCollisionOption.ReplaceExisting);
catch (Exception genEx)
//
Fa
令牌是在用户使用 FileOpenPicker
获取 StorageFile
和 FolderPicker
用于获取目标目录的 StorageFolder
之后获取的。
LoadExistingFolderSelection 和 LoadExistingFileSelection 使用以下代码获取StorageFiles
和StorageFolder
await StorageApplicationPermissions.FutureAccessList.GetFileAsync(faToken);
和
await StorageApplicationPermissions.FutureAccessList.GetFolderAsync(faFolderToken);
问题在于这一行:
imageFile.CopyAsync(destinationFolder, destinationFile.Name, NameCollisionOption.ReplaceExisting);
抛出此错误:
“值不在预期范围内。”
就是这样,实际上没有别的,任何想法都会很棒。
【问题讨论】:
当我使用你的代码测试它时,它运行良好。你能展示完整的代码让我们重现它吗? @Faywang-MSFT 我今天可能会尝试将其全部放入 git repo 中,但有没有可能这是权限问题,我的意思是我可以将文件直接复制到 appdata 文件夹中我正在尝试手动覆盖文件。 应用本地文件夹目录可以读写,不存在权限问题。 【参考方案1】:反斜杠...老实说,这是你开发生涯中的那些时刻之一,你只是坐在那里叹息,因为它太愚蠢了。
所以我可以很高兴地将我想要完全复制的图像检索到一个 StorageFile
对象中,该对象的路径包含一个额外的反斜杠,Windows 操作系统文件资源管理器不会对此感到惊讶。
到目前为止没有问题,很好地继续然后对其运行复制操作,突然你得到了
“值不在预期范围内。”
异常,可以说是我见过的与文件路径问题相关的最没有帮助的异常之一。
所以你有它,反斜杠,仔细检查 Path 属性。事后诸葛亮。通常我会删除这个问题,因为这个答案并不是什么特别大的启示。但我认为它可以作为对可怕的 反斜杠 和 UWP 的 Storage API 的警告。
【讨论】:
以上是关于UWP StorageFile.CopyAsync() 引发错误:“值不在预期范围内。”的主要内容,如果未能解决你的问题,请参考以下文章
2019-11-25-加强版在国内分发-UWP-应用正确方式-通过win32安装UWP应用
为啥必须在 UWP 中使用 StreamSocketListener 而不是 TcpListener,尽管 UWP 是 .NET Core 的子集,而 TcpListener 在 UWP 中可用?
UWP使用AppService向另一个UWP客户端应用程序提供服务