File.Exists()总是在与可执行文件相同的目录中搜索吗?

时间:2013-10-11 10:12:45

标签: c# .net

我需要在与可执行文件相同的目录中检查文件。

目前我正在使用此代码 -

if (!File.Exists(versionFile))
{
     File.Create(versionFile).Close();        
}

在一个地方,我正在使用它:

string file =     
   Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) 
        + "\\" + args.Executable;
    if (File.Exists(file)) {
        Process.Start(file);
        Application.Exit();
    }

两者都在做同样的工作,但我不确定哪一个更强大。我想不出任何一个会失败的情况,但与此同时我对这两种方法都有一种愚蠢的感觉。

哪一个更强大还是还有其他更好的替代方案来解决这个简单问题?

3 个答案:

答案 0 :(得分:3)

第一个使用当前目录(可以通过Directory.SetCurrentDirectory(dir)设置),因此第二种方法比第一种方法更健壮。

答案 1 :(得分:3)

他们没有做同样的工作:第一个将查找相对于当前工作目录的文件,该文件可能与第二个文件不同。

两者都不是完全健壮的,因为如果已从非托管应用程序加载托管程序集,GetEntryAssembly可以返回null,并且Assembly.Location可能是程序集下载缓存。

The best solution is to use AppDomain.CurrentDomain.BaseDirectory

答案 2 :(得分:1)

我用:

string startupPath = null;

using (var process = Process.GetCurrentProcess())
{
    startupPath = Path.GetDirectoryName(process.MainModule.FileName);
}

原因是这是迄今为止我发现的唯一可靠的。作为旁注,Application.StartupPath执行此操作:

public static string StartupPath
{
    get
    {
        if (Application.startupPath == null)
        {
            StringBuilder buffer =
                new StringBuilder(260);
            UnsafeNativeMethods.GetModuleFileName(
                NativeMethods.NullHandleRef, buffer, buffer.Capacity);
            Application.startupPath =
                Path.GetDirectoryName(((object)buffer).ToString());
        }
        new FileIOPermission(
            FileIOPermissionAccess.PathDiscovery,
            Application.startupPath).Demand();
        return Application.startupPath;
    }
}