c#获取路径

 C#如何获得当前程序所在的目录12:12Application.StartupPath;Environment.SpecialFolder.ApplicationData 
Environment.SpecialFolder命名空间可以获取很多特定的路径目录。
Environment.SpecialFolder. 
ApplicationData 
CommonApplicationData 
CommonProgramFiles 
Cookies 
DesktopDirectory 
Favorites 
History 
InternetCache 
LocalApplicationData 
Personal 
ProgramFiles 
Programs 
Recent 
SendTo 
StartMenu 
Startup 
Templates 
System 
System.Web.HttpContext.Request.{获取服务器绝对路径和虚拟目录路径}System.AppDomain.CurrentDomain.BaseDirectory;获取应用程序的当前工作目录。

string   path   =   System.IO.Directory.GetCurrentDirectory();Environment.CurrentDirectory 
获取应用程序的当前工作目录。 
System.IO.Directory.GetCurrentDirectory() 
AppDomain.CurrentDomain.BaseDirectory 
这两个只能在WindowForm中使用; 
Application.StartupPath 
Application.ExecutablePath 
--获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。 
Environment.CurrentDirectory     
--获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。 
Application.ExecutablePath

我在项目文件夹里放了一个mdb数据库,供程序使用,发布时我如何获得该路径?vb里是app.path,就是应用程序的路径,不知在c#里怎么写?



答案一

application.path()



答案二

localpath
具体记不清楚了
答案三 c#的写法 (梓赫)
string path = "";
if (system.environment.currentdirectory == appdomain.currentdomain.basedirectory)//windows应用程序则相等
...{
path = appdomain.currentdomain.basedirectory;
}
else
...{
path = appdomain.currentdomain.basedirectory + "bin/";
}
C#获取项目程序路径的方法 1.asp.net webform用“Request.PhysicalApplicationPath获取站点所在虚拟目录的物理路径,最后包含“/”;
2.c# winform用
A:“Application.StartupPath”:获取当前应用程序所在目录的路径,最后不包含“/”;
B:“Application.ExecutablePath ”:获取当前应用程序文件的路径,包含文件的名称;
C:“AppDomain.CurrentDomain.BaseDirectory”:获取当前应用程序所在目录的路径,最后包含“/”;
D:“System.Threading.Thread.GetDomain().BaseDirectory”:获取当前应用程序所在目录的路径,最后包含“/”;
E:“Environment.CurrentDirectory”:获取当前应用程序的路径,最后不包含“/”;
F:“System.IO.Directory.GetCurrentDirectory”:获取当前应用程序的路径,最后不包含“/”;
3.c# windows service用“AppDomain.CurrentDomain.BaseDirectory”或“System.Threading.Thread.GetDomain().BaseDirectory”;
用“Environment.CurrentDirectory”和“System.IO.Directory.GetCurrentDirectory”将得到“ system32”目录的路径;
如果要使用“Application.StartupPath”或“Application.ExecutablePath ”,需要手动添加对“System.Windows.Forms.dll ”的引用,并在程序开头用“using    System.Windows.Forms”声明该引用;

C#获取程序当前路径的方法
C#获取程序当前路径的方法



//获取新的 Process 组件并将其与当前活动的进程关联的主模块的完整路径,包含文件名(进程名)。
string str = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
result: X:/xxx/xxx/xxx.exe (.exe文件所在的目录+.exe文件名)
//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。
string str = System.Environment.CurrentDirectory;
result: X:/xxx/xxx (.exe文件所在的目录)

//获取当前 Thread 的当前应用程序域的基目录,它由程序集冲突解决程序用来探测程序集。
string str = System.AppDomain.CurrentDomain.BaseDirectory;
result: X:/xxx/xxx/ (.exe文件所在的目录+"/")

//获取和设置包含该应用程序的目录的名称。
string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
result: X:/xxx/xxx/ (.exe文件所在的目录+"/")

//获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。
string str = System.Windows.Forms.Application.StartupPath;
result: X:/xxx/xxx (.exe文件所在的目录)

//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
string str = System.Windows.Forms.Application.ExecutablePath;
result: X:/xxx/xxx/xxx.exe (.exe文件所在的目录+.exe文件名)

//获取应用程序的当前工作目录。
string str = System.IO.Directory.GetCurrentDirectory();
result: X:/xxx/xxx (.exe文件所在的目录)

经常要在应用程序里读取与其在同一个路径下的配置文件或其它文件等,但在Windows平台与WinCE平台下,获取当前路径的方法却不一样,现把本人的经验写在下面,下面的“CurrentPath”属性可以获取应用程序的当前路径,经测试,在WinXP与WinCE下均正常运行。

PS:可以写成静态方法,编译到动态库里,到处都可以用了。

public class Configs
{
private string m_CurrentPath;

private string Platform

get

{
return Environment.OSVersion.Platform.ToString();
}


public string CurrentPath



get

}

if(Platform.Equals("WinCE"))

{

m_CurrentPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);

}

else if(Platform.Equals("Win32NT"))

{

m_CurrentPath = Directory.GetCurrentDirectory();
}

return m_CurrentPath;

}

}

public Configs()

{

}

}

C#中获取程序当前路径的集中方法

string str1 =Process.GetCurrentProcess().MainModule.FileName;//可获得当前执行的exe的文件名。 
string str2=Environment.CurrentDirectory;//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。
//备注 按照定义,如果该进程在本地或网络驱动器的根目录中启动,则此属性的值为驱动器名称后跟一个尾部反斜杠(如“C:/”)。如果该进程在子目录中启动,则此属性的值为不带尾部反斜杠的驱动器和子目录路径(如“C:/mySubDirectory”)。
string str3=Directory.GetCurrentDirectory();//获取应用程序的当前工作目录。
string str4=AppDomain.CurrentDomain.BaseDirectory;//获取基目录,它由程序集冲突解决程序用来探测程序集。
string str5=Application.StartupPath;//获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。
string str6=Application.ExecutablePath;//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
string str7=AppDomain.CurrentDomain.SetupInformation.ApplicationBase;//获取或设置包含该应用程序的目录的名称。

1.   System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
获取模块的完整路径。
2.   System.Environment.CurrentDirectory
获取和设置当前目录(该进程从中启动的目录)的完全限定目录。
3.   System.IO.Directory.GetCurrentDirectory()
获取应用程序的当前工作目录。这个不一定是程序从中启动的目录啊,有可能程序放在C:/www里,这个函数有可能返回C:/Documents and Settings/ZYB/,或者C:/Program Files/Adobe/,有时不一定返回什么东东,我也搞不懂了。
4.  System.AppDomain.CurrentDomain.BaseDirectory
获取程序的基目录。
5.  System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase
获取和设置包括该应用程序的目录的名称。
6.  System.Windows.Forms.Application.StartupPath
获取启动了应用程序的可执行文件的路径。效果和2、5一样。只是5返回的字符串后面多了一个"/"而已
7.  System.Windows.Forms.Application.ExecutablePath
获取启动了应用程序的可执行文件的路径及文件名,效果和1一样。

文章给出功能实现代码,其中SingleInstance类实现只允许一个实例运行,Program为测试主程序入口。在代码中标识说明文字。完整代码下载。
主要代码
SingleInstance.cs文件,
using System;
using System.IO;
using System.Diagnostics;
using System.Threading;
using System.Reflection;
using System.Runtime.InteropServices;
/*------------------------------------------------
郑佐 2006-07-01 http://blog.csdn.net/zhzuo
--------------------------------------------------*/
namespace Zhengzuo.CSharpCode
{
/// <summary>
/// 只启动一个应用程序实例控制类
/// </summary>
public static class SingleInstance
{
private const int WS_SHOWNORMAL = 1;
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
//标志文件名称
private static string runFlagFullname = null;
//声明同步基元
private static Mutex mutex = null;
/// <summary>
/// static Constructor
/// </summary>
static SingleInstance()
{
}
#region api实现
/// <summary>
/// 获取应用程序进程实例,如果没有匹配进程,返回Null
/// </summary>
/// <returns>返回当前Process实例</returns>
public static Process GetRunningInstance()
{
Process currentProcess = Process.GetCurrentProcess();//获取当前进程
//获取当前运行程序完全限定名
string currentFileName = currentProcess.MainModule.FileName;
//获取进程名为ProcessName的Process数组。
Process[] processes = Process.GetProcessesByName(currentProcess.ProcessName);
//遍历有相同进程名称正在运行的进程
foreach (Process process in processes)
{
if (process.MainModule.FileName == currentFileName)
{
if (process.Id != currentProcess.Id)//根据进程ID排除当前进程
return process;//返回已运行的进程实例
}
}
return null;
}
/// <summary>
/// 获取应用程序句柄,设置应用程序前台运行,并返回bool值
/// </summary>
public static bool HandleRunningInstance(Process instance)
{
//确保窗口没有被最小化或最大化
ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL);
//设置真实例程为foreground window
return SetForegroundWindow(instance.MainWindowHandle);
}
/// <summary>
/// 获取窗口句柄,设置应用程序前台运行,并返回bool值,重载方法
/// </summary>
/// <returns></returns>
public static bool HandleRunningInstance()
{
Process p = GetRunningInstance();
if (p != null)
{
HandleRunningInstance(p);
return true;
}
return false;
}
#endregion
#region Mutex实现
/// <summary>
/// 创建应用程序进程Mutex
/// </summary>
/// <returns>返回创建结果,true表示创建成功,false创建失败。</returns>
public static bool CreateMutex()
{
return CreateMutex(Assembly.GetEntryAssembly().FullName);
}
/// <summary>
/// 创建应用程序进程Mutex
/// </summary>
/// <param name="name">Mutex名称</param>
/// <returns>返回创建结果,true表示创建成功,false创建失败。</returns>
public static bool CreateMutex(string name)
{
bool result = false;
mutex = new Mutex(true, name, out result);
return result;
}
/// <summary>
/// 释放Mutex
/// </summary>
public static void ReleaseMutex()
{
if (mutex != null)
{
mutex.Close();
}
}
#endregion
#region 设置标志实现
/// <summary>
/// 初始化程序运行标志,如果设置成功,返回true,已经设置返回false,设置失败将抛出异常
/// </summary>
/// <returns>返回设置结果</returns>
public static bool InitRunFlag()
{
if (File.Exists(RunFlag))
{
return false;
}
using (FileStream fs = new FileStream(RunFlag, FileMode.Create))
{
}
return true;
}
/// <summary>
/// 释放初始化程序运行标志,如果释放失败将抛出异常
/// </summary>
public static void DisposeRunFlag()
{
if (File.Exists(RunFlag))
{
File.Delete(RunFlag);
}
}
/// <summary>
/// 获取或设置程序运行标志,必须符合Windows文件命名规范
/// 这里实现生成临时文件为依据,如果修改成设置注册表,那就不需要符合文件命名规范。
/// </summary>
public static string RunFlag
{
get
{
if(runFlagFullname == null)
{
string assemblyFullName = Assembly.GetEntryAssembly().FullName;
//CommonApplicationData://"C://Documents and Settings//All Users//Application Data"
string path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
//"C://Program Files//Common Files"
//string path = Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles);
runFlagFullname = Path.Combine(path, assemblyFullName);
}
return runFlagFullname;
}
set
{
runFlagFullname = value;
}
}
#endregion
}
}
Program.cs文件,
using System;
using System.Windows.Forms;
using System.Diagnostics;
using Zhengzuo.CSharpCode;
/*------------------------------------------------
郑佐 2006-07-01 http://blog.csdn.net/zhzuo
--------------------------------------------------*/
namespace Zhengzuo.Test.WinGui
{
static class Program
{
[STAThread]
static void Main(string[] args)
{
if (args.Length == 0) //没有传送参数
{
Process p = SingleInstance.GetRunningInstance();
if (p != null) //已经有应用程序副本执行
{
SingleInstance.HandleRunningInstance(p);
}
else //启动第一个应用程序
{
RunApplication();
}
}
else //有多个参数
{
switch (args[0].ToLower())
{
case "-api":
if (SingleInstance.HandleRunningInstance() == false)
{
RunApplication();
}

break;
case "-mutex":
if (args.Length >= 2) //参数中传入互斥体名称
{
if ( SingleInstance.CreateMutex(args[1]) )
{
RunApplication();
SingleInstance.ReleaseMutex();
}
else
{
//调用SingleInstance.HandleRunningInstance()方法显示到前台。
MessageBox.Show("程序已经运行!");
}
}
else
{
if (SingleInstance.CreateMutex())
{
RunApplication();
SingleInstance.ReleaseMutex();
}
else
{
//调用SingleInstance.HandleRunningInstance()方法显示到前台。
MessageBox.Show("程序已经运行!");
}
}

break;
case "-flag"://使用该方式需要在程序退出时调用
if (args.Length >= 2) //参数中传入运行标志文件名称
{
SingleInstance.RunFlag = args[1];
}
try
{
if (SingleInstance.InitRunFlag())
{
RunApplication();
SingleInstance.DisposeRunFlag();
}
else
{
//调用SingleInstance.HandleRunningInstance()方法显示到前台。
MessageBox.Show("程序已经运行!");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}

break;
default:
MessageBox.Show("应用程序参数设置失败。");

break;
}
}
}
//启动应用程序
static void RunApplication()
{
Application.EnableVisualStyles();
Application.Run(new MainForm());
}
}
}
功能测试
功能测试类别包括下面五类,
1.本地系统同一应用程序目录;
2.本地系统同一应用程序修改运行文件名称使两次运行名称不同;
3.本地系统两次运行程序目录不同,不修改文件名称;
4.本地系统不同会话用户登录启动应用程序;
5.远程计算机程序访问启动应用程序(一个程序在远程另一个在本地)。
运行CMD命令行,
第一种调用方式:
WindowsApplication1.exe
或 WindowsApplication1.exe –api
第二种调用方式:
WindowsApplication1.exe –mutex
或WindowsApplication1.exe –mutex {F140AE26-626C-42f8-BD49-45025742205E}
第三种调用方式:
WindowsApplication1.exe –flag
或WindowsApplication1.exe –flag c:/blog.csdn.net.zhzuo
测试结果,


匹配/互斥/标志
1同一目录
2修改名称
3不同目录
4不同用户
5远程访问


1同一目录
O/O/O






2修改名称

X/O/O





3不同目录


X/O/O




4不同用户



#/X/O



5远程访问




X/O/O


备注:O - 表示成功,X – 表示失败,# - 程序第二个运行没有反应
针对远程访问的测试,需要在系统管理工具的.NET Framework 2.0 Configuration中进行设置授权该局域网路径允许访问,否则会抛出System.Security.SecurityException异常。
根据测试结果可见三种实现方式适用范围不同,理想的实现是结合他们的优点进行多点判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值