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 获取 StorageFileFolderPicker 用于获取目标目录的 StorageFolder 之后获取的。

LoadExistingFolderSelection 和 LoadExistingFileSelection 使用以下代码获取StorageFilesStorageFolder

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() 引发错误:“值不在预期范围内。”的主要内容,如果未能解决你的问题,请参考以下文章

UWP: 实现 UWP 应用自启动

2019-11-25-加强版在国内分发-UWP-应用正确方式-通过win32安装UWP应用

为啥必须在 UWP 中使用 StreamSocketListener 而不是 TcpListener,尽管 UWP 是 .NET Core 的子集,而 TcpListener 在 UWP 中可用?

UWP使用AppService向另一个UWP客户端应用程序提供服务

[UWP]涨姿势UWP源码——IsolatedStorage

win10 uwp 如何开始写 uwp 程序