0

拥有一个 StorageFolder 对象并尝试创建一个名称中包含冒号的文件夹(不是在开头或结尾)会导致 COM 错误并显示 HRESULT 80004005 (HRESULT E_FAIL)。

示例:await ApplicationData.Current.TemporaryFolder.CreateFolderAsync("abc:xyz", CreationCollisionOption.OpenIfExists);

如果冒号在开头或结尾,我会收到 HRESULT 8007007b 消息“文件名、目录名或卷标语法不正确”。没关系。

我检查了其他无效字符,但只有一个冒号导致 E_FAIL。

如果用户输入文件夹名称,这可能会出现问题。解决方法当然是简单地检查文件名中的冒号。

有谁知道 E_FAIL 错误的可能原因?我假设 COM 认为文件夹名称以 URI 开头,但当然无法弄清楚它是哪种 URI。

4

1 回答 1

4

好吧,COM 臭名昭著的错误报告又回来了。多年来,我们已经被 .NET 的优秀和信息丰富的例外宠坏了,但那块地毯被 WinRT 拉走了。COM 是底层互操作机制,HRESULT 是报告错误的方式。

E_FAIL 是规范错误代码,您可以获得的唯一描述性文本是“未指定错误”。准确地说,处理该代码的 Microsoft 程序员不能或不想产生更具描述性的错误。另一个很棒的词是 E_UNEXPECTED,它翻译为“灾难性失败”。术语“灾难性”实际上是指错误消息的价值(如果您得到它)。

推测一下,“abc:xyz”路径字符串实际上是有效的。它指的是一个名为“xyz”的备用数据流,存储在文件“abc”中。因此,起初检查路径字符串不会引起臭味。但是,您正在使用该名称创建文件夹,而不是文件。文件夹不能有备用数据流。显然,这是很晚才发现的,为时已晚,无法产生更准确的错误代码。它应该产生了一个 Windows 错误,并且它们通过与 0x8007000 进行或运算来适当地包装在 HRESULT 中,但由于无法猜测的原因,这并没有完成。

无法发送有关此的反馈,Windows 组没有 DevDiv 的 connect.microsoft.com 等效项。幸好你知道是什么导致了错误。

于 2012-10-06T12:38:35.583 回答