关于.net多层架构的网站如何在底层类库中获取网站的物理路径
相信很多用asp.net+Access做网站的朋友经常都会有这样一个需求:就是想在数据库访问层类库中获取Access数据库的物理路径,然后再拼接数据库连接字符串进行数据库相关的操作.在网站UI层我们可以有很多种方法获取一个网站的物理路径,如:1. Request.PhysicalApplicationPath 2. Request.MapPath("~/"),但是在数据库访问层用这些方法就不行...
笔者近日也有此需求,通过 "g.cn+自己研究" 写出以下方法,经测试(vs2008)有效,所以拿出来分享给大家.
using System.Reflection;
using System.IO; //使用前别忘了引用这两个命名空间.
/// 获取Access数据库的物理路径
/// </summary>
/// <returns></returns>
public static string GetDBPath()
{
string str = Assembly.GetExecutingAssembly().Location;
str = Path.GetDirectoryName(str) + @"\__AssemblyInfo__.ini";
str = File.ReadAllText(str, System.Text.Encoding.Unicode);
int index = str.IndexOf("file:///") + 8;
int length = str.IndexOf("/bin");
str = str.Substring(index, length - index);
str = str.Replace('/', '\\');
str += @"\App_Data\myDB.mdb";
return str; //最后返回的就是该数据库的物理路径.
}
代码解释:
1. string str = Assembly.GetExecutingAssembly().Location;
获取到的值是一个临时目录,如:“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\thinclient\ba81bed7\a7082081\assembly\dl3\62f82680\8345eb5b_37a6c901\abc.dll
2.str = Path.GetDirectoryName(str) + @"\__AssemblyInfo__.ini";
关键是这一句,在dll文件同一目录下有一个"__AssemblyInfo__.ini"文件,用记事本打开可以发现里面包含有dll的实际物理地址,知道这个就好办了,呵呵.
3. str = File.ReadAllText(str, System.Text.Encoding.Unicode);
int index = str.IndexOf("file:///") + 8;
int length = str.IndexOf("/bin");
str = str.Substring(index, length - index);
str = str.Replace('/', '\\');
str += @"\App_Data\cms.mdb";
这些代码就不详细解释了,就是把那个ini文件读出来,从里面找出网站bin文件夹的实际物理路径,然后拼接数据库文件名,就得到了数据库的物理路径了,不过这个方法有效的前提是数据库文件跟网站在同一目录下才行.
后记,这只是本人在写程序过程中的一点积累,可能各位牛人还有更简便的方法可以实现,希望不吝赐教.
--- 小虎 2009.04.15