在Setup Project中调用Directory.Exists(“\\ SERVER \ SHARE \”)

时间:2009-02-16 18:38:23

标签: installer installation .net

我有一个.NET安装项目,我已经添加了自定义安装程序操作。在设置过程中,用户必须为其文件服务器上的共享提供路径(通常是UNC路径)。我尝试进行一些验证,然后继续确保目录存在,如下:

if (!Directory.Exists(serverDirectory)) { 
    throw new InstallException("Specified path does not exist or ..."); 
} 

漂亮的vanilla - 在控制台应用程序中, Directory.Exists()代码按预期工作。但是,在MSI的背景下,它没有。具体而言,使用网络资源时,对 Directory.Exists 的调用始终失败。 Directory.Exists 的文档确实指示了why

  

Exists方法不执行网络身份验证。如果您在未经过预先验证的情况下查询现有网络共享,则Exists方法将返回false。

搜索引导我进入ASP.NET中的其他类似场景,其中模拟就是解决方案。这不适用于此,但它说明了这个问题。

如何检查网络路径是否存在?要使用文档的语言 - 如何在通话前进行预认证?用户正在以管理员身份进行安装,并且在Windows资源管理器中浏览到该路径的工作成功,因此它不是用户的权限,而是缺少代码检查。

我是否已经创建了一个不必要的问题 - 我是否应该省略这一点并在以后尝试使用网络资源时抛出异常...它在很大程度上是同一个关键失败,对吗?

1 个答案:

答案 0 :(得分:1)

这不仅仅是存在:您还需要检查权限,并担心如果他们在您检查和实际使用该值之间的时间段内发生变化会发生什么。

因此,正常的机制是假设一切正常。相反,当假设被证明是错误时,将您的开发工作放在处理异常上,因为无论如何您都需要能够优雅地执行此操作。

对于这种情况,您可以通过立即在相关目录中创建一个小占位符文件并对该文件保持锁定直到您完全使用该文件夹来改进它。这样可以让您提供更好的反馈,因为您在尝试创建文件时会立即收到错误消息。它还有助于保证文件夹保持可访问,因为在Windows下,只要您锁定该文件,至少用户将很难删除或显着更改文件夹。