我需要在与可执行文件相同的目录中检查文件。
目前我正在使用此代码 -
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();
}
两者都在做同样的工作,但我不确定哪一个更强大。我想不出任何一个会失败的情况,但与此同时我对这两种方法都有一种愚蠢的感觉。
哪一个更强大还是还有其他更好的替代方案来解决这个简单问题?
答案 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;
}
}