2014-01-13 57 views
1

我最近从Visual Studio 2008到Visual Studio 2012System.IO.FileInfo工程确定在Visual Studio 2008而不是在Visual Studio 2012

我跟一个老(和复杂)的代码和工作升级升级又出奇地好,除了这个非常功能:

FI = New System.IO.FileInfo("X:\MyFolder\MyFile.sim") 

(其中 “X:\” 是映射的外部驱动器)

  • 在Visual Studio 2008中:FI.Exists
  • 在Visual Studio 2012:FI.Exists

我很困惑有关。有没有人知道我该如何解决这个问题?

+0

您的'TargetFramework'是否从VS2008更改为VS2012?例如。您是否仍在VS2012中使用'NET20'或'NET30'? –

+4

您是以管理员身份运行VS2008还是VS2012,而不是其他人?当你以管理员身份运行时,你的会话中没有相同的映射网络驱动器... –

+0

@ThomasLevesque:我尝试将VS2012作为管理员运行,但并未改变行为。 –

回答

1

根据MSDN,关于System.IO.FileInfo.Exists返回false的原因,NET20NET45之间没有任何变化。这就是说,Exists可以在以下任何一种情况下返回false:

  • 该文件不存在。
  • 该路径不存在。
  • 正在执行的程序集没有权限访问该文件。
    • 执行程序集的用户没有权限
    • 程序集在没有权限的用户范围内执行。 (例如,以管理员身份运行)。
  • 该路径包含无效字符。
  • 该路径为空。
  • 路径无法到达(例如,网络驱动器已断开连接)。

掌握了这些信息之后,您应该尝试在不同的环境中运行您的代码。如:

  • 有或没​​有运行VS作为管理员
  • 运行可执行直接(外VS的)
  • 使用工具如LINQPad以运行该代码的脚本形式:var FI = new System.IO.FileInfo("X:\MyFolder\MyFile.sim");

您可以采取的另一种途径是调试,这是针对本地计算机上存在的已知文件运行它。例如,测试桌面上的文件是否存在于两个运行时间中。尽管我强烈怀疑这与网络驱动器在闲置时断开连接有关。您也可以尝试绕过映射的驱动器并直接转到完整路径(例如\ some-server \ MyFolder \ MyFile.sim)并查看是否引发异常或其他类型的结果。

+0

非常感谢您的详细解答。今天,一天之后,无需重新启动机器,它就可以工作。我无法弄清楚,我没有做任何事情可以改变这种情况:目标框架仍然是NET40等。但在此之前,我测试了“Exists”返回false的所有条件(请参阅下一条评论)。 –

+0

1和2:文件或路径确实存在。 3.1和3.2:我以用户身份访问该文件(因为我可以使用该资源管理器访问该文件),并以管理员身份运行VB2012或不更改结果(FileInfo.Exists仍然为false)。 4:它不包含任何无效字符。 5:路径不为空。 6:驱动器已连接。我没有做其他测试,现在它正在工作,我不能对他们(对不起,如果有其他人有同样的问题,并找到这篇文章)。 –

+0

@Tremor网络驱动器可能会遇到像这样的间歇性问题。我无法告诉你为什么,但我看到过这样不一致的结果。我怀疑这是与缓存连接有关的问题。很高兴它为你工作。 –