Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Vista上访问ProgramData时发生DirectoryNotFoundException-找不到路径的一部分-WinIOError_C#_.net 2.0 - Fatal编程技术网

C# 在Vista上访问ProgramData时发生DirectoryNotFoundException-找不到路径的一部分-WinIOError

C# 在Vista上访问ProgramData时发生DirectoryNotFoundException-找不到路径的一部分-WinIOError,c#,.net-2.0,C#,.net 2.0,有时,我们软件的一些用户报告由wiredDirectoryNotFoundException异常引起的问题。这只发生在一些运行Vista的用户身上。并非所有运行Vista的用户都有此问题。运行Win7或XP的用户没有关于此问题的报告(但这并不能证明此问题不会发生在这些系统上-我们只是没有此类报告) 我们的软件在ProgramData文件夹中存储一些图形数据。当程序尝试读取这些文件时,将引发以下异常: Message: Could not find a part of the path 'C:\P

有时,我们软件的一些用户报告由wired
DirectoryNotFoundException
异常引起的问题。这只发生在一些运行Vista的用户身上。并非所有运行Vista的用户都有此问题。运行Win7或XP的用户没有关于此问题的报告(但这并不能证明此问题不会发生在这些系统上-我们只是没有此类报告)

我们的软件在ProgramData文件夹中存储一些图形数据。当程序尝试读取这些文件时,将引发以下异常:

Message: Could not find a part of the path 'C:\ProgramData\My App Name\Subfolder\Subfolder'.
mscorlib
   in System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   in System.IO.Directory.InternalGetFileDirectoryNames(String path, String userPathOriginal, String searchPattern, Boolean includeFiles, Boolean includeDirs, SearchOption searchOption)
   in System.IO.Directory.GetFiles(String path, String searchPattern, SearchOption searchOption)
   in System.IO.Directory.GetFiles(String path)

路径是C:\ProgramData\My App Name\Subfolder\Subfolder。文件夹存在-我100%确定。它是由NSIS安装程序创建的。它对所有用户都是可写的(或者至少应该是这样,因为这是我们使用NSIS脚本设置它的方式)。用户确认文件夹存在-他可以使用Windows资源管理器导航到该位置


起初我以为这是UAC的问题,但例外情况是找不到路径的一部分。这让我发疯,因为我们无法在测试系统上重现这个问题。无论配置如何。XP、Vista、Win7-在我们的机器上,它可以正常工作。

最终我们找到了一个有同样问题的用户,并且愿意帮助测试。此错误的根本原因似乎是NSIS安装程序使用一个错误字符创建了文件夹。没有人注意到这一点,因为该字符看起来几乎与应该创建的字符相同。因此,
DirectoryNotFoundException
确实是正确的

NSIS应该创建一个带有字符的文件夹

// U+0144   ń   c5 84   LATIN SMALL LETTER N WITH ACUTE
// U+00F1   ñ   c3 b1   LATIN SMALL LETTER N WITH TILDE
而是创建了一个带有ñ字符的文件夹

// U+0144   ń   c5 84   LATIN SMALL LETTER N WITH ACUTE
// U+00F1   ñ   c3 b1   LATIN SMALL LETTER N WITH TILDE
有线的部分是,这只发生在一些机器上,我们无法复制


今天的教训:在调试方面,永远不要完全信任用户。即使是用户提供的屏幕截图也有误导性,因为它只显示了相关文件夹的内容。

您是否尝试过在这行代码前面做一个简单的if(!File.Exists(path))语句,以防.NET无法读取该文件?“路径是C:\ProgramData\My App Name\Subfolder\Subfolder。文件夹存在-我100%确定。它是由NSIS安装程序创建的。“您是100%确定是因为您依赖于NSIS安装程序,还是因为您能够在相关计算机上启动-->运行-->“C:\ProgramData\My App Name\Subfolder\Subfolder?”“并以这种方式查看文件夹内容吗?@AJ.-用户确认他能够使用windows资源管理器导航到该路径。我看到了屏幕截图。@Josh-这不是“如果存在”的问题-我可以处理异常。问题是,即使该文件夹存在,也会引发异常-或者至少它似乎存在,因为用户可以使用Windows资源管理器导航到该位置。@SiliconMind但如果您执行了测试,并且用户仍然可以导航到该文件夹,这是否意味着运行应用程序的安全设置没有访问该文件夹的权限?您是否考虑过执行安全需求(CodeAccessPermission.demand)?可能的解决方案: