目录
1. 修改当前进程的工作目录
使用System.IO.Directory.GetCurrentDirectory和SetCurrentDirectory方法可以得到或者设置当前进程的工作目录(又称当前目录,初始目录)。
Environment类的CurrentDirectory属性(可读可写)内部调用Directory的GetCurrentDirectory和SetCurrentDirectory方法,因此它们是等价的。
staticvoid Main(string[] args)
{
test();
//更改工作目录
Directory.SetCurrentDirectory(@"D:\archives");
test();
}
//输出目录
staticvoid test()
{
//当前工作目录
Console.WriteLine(Directory.GetCurrentDirectory());
//从工作目录的根目录的相对路径
Console.WriteLine(Path.GetFullPath(@"\a\b"));
//从工作目录的相对路径
Console.WriteLine(Path.GetFullPath(@"a\b"));
Console.WriteLine();
}
输出:
e:\users\mgen\documents\visual studio 2010\Projects\TTC\TTC\bin\Release
e:\a\b
e:\users\mgen\documents\visual studio 2010\Projects\TTC\TTC\bin\Release\a\b
D:\archives
D:\a\b
D:\archives\a\b
可以看出来,更改工作目录后,相对路径的值会跟随当前的工作目录而改变。
2. 修改其它进程的工作目录
System.Diagnostics.ProcessStartInfo类的WorkingDirectory属性可以为一个准备启动的进程指定一个工作目录(注意ProcessStartInfo的UseShellExecute必须为false,UseShellExecute为true时WorkingDirectory用来指定文件的包含目录),用一个简单的命令行DIR指令就可以做个测试:
Process.Start("cmd", "/k dir");
很简单,并没有修改默认进程的工作目录,那么会在命令行中显示当前执行文件目录的子文件夹列表。
接下来修改工作目录:
var psi =newProcessStartInfo("cmd", "/k dir");
//不使用ShellExecute,用CreateProcess
psi.UseShellExecute =false;
psi.WorkingDirectory =@"D:\archives";
Process.Start(psi);
这个DIR会显示D盘的Archives目录下的子目录信息。
3. 怎样知道真正的执行文件路径?
既然可以修改其他程序的工作目录。那么你的程序工作目录也有可能被修改,那么Directory.GetCurrentDirectory方法的结果是不确定的。那么怎样知道自己程序真正所在的目录呢?
有多种方法:
Windows Forms程序都熟知的:
//Applicatuib类在System.Windows.Forms命名空间内
Path.GetDirectoryName(Application.ExecutablePath);
还有:
Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);