File.Exists检测问题

时间:2012-02-01 16:12:52

标签: c# .net

我发现了一个程序问题的bizzare问题,其中命令File.Exists()并不总是在与可执行文件相同的目录中检测到相同的文件。

我有类似的事情:

    if (File.Exists("TextFile1.txt"))
        {
        //do some stuff
        }

但奇怪的是,如果我在cmd提示符下运行此可执行文件,它不会检测到该文件。但是,如果我通过另一个进程启动此可执行文件,它将检测文件正常。

关于这个bizzare问题的任何想法? 感谢。

5 个答案:

答案 0 :(得分:13)

这是可执行文件工作目录的相对文件路径。从命令提示符运行应用程序时,工作目录将设置为可执行文件所在的目录。当您通过另一个进程(Process.Start)运行此可执行文件时,工作目录是主进程的工作目录。您可以在运行进程之前修改工作目录,也可以使用绝对文件路径。

要记住的另一件事是,如果您运行代码的帐户对该文件夹没有足够的权限,File.Exists可能会返回false。

  

如果调用者具有所需权限且路径包含,则为true   现有文件的名称;否则,错误。此方法也会返回   如果path为null,无效路径或零长度字符串,则返回false。如果   调用者没有足够的权限来读取指定的   文件,没有抛出异常,方法返回false,无论如何   路径的存在。

答案 1 :(得分:3)

文件路径相对于CurrentDirectory而不是可执行文件所在的位置。您应该完全限定文件路径,或获取可执行文件的位置。

答案 2 :(得分:1)

来自MSDN

  

允许path参数指定相对路径或绝对路径   信息。相对路径信息被解释为相对于   当前的工作目录。获得当前的工作   目录,请参阅GetCurrentDirectory。

当你看GetCurrentDirectory时:

  

当前目录与原始目录不同,后者   是进程开始的那个。

答案 3 :(得分:1)

由于您使用的是相对路径,我有一种预感,即执行程序集的位置不是您想象的那样。

在您的代码中尝试使用以下命令检查exe的启动位置:

System.IO.Path.GetDirectoryName( 
  System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase );

(来自http://msdn.microsoft.com/en-us/library/aa457089.aspx

答案 4 :(得分:0)

问题很可能是CurrentDirectory因进程而异。

但是,另一个问题可能是每个进程都以不同的用户/权限运行,并且命令提示符无权访问文件所在的文件夹。