我在Visual Studio项目中放置了3个特别大的SQL查询,位于项目目录中的“查询”文件夹下(不是解决方案)。有没有一种雄辩的方式来访问这些文件?我希望像@"Queries/firstSqlQuery.sql
之类的东西能起作用。
指定完整路径,例如@"C:\\Users\John\Documents\VisualStudio2010\Projects\MySolution\MyProject\Queries\firstSqlQuery.sql
是我真的不想做的事情,因为它需要我回到代码并修复路径,如果应用程序移动。
编辑:出于某种原因,该页面正在C:\\Program Files(x86)\Common Files\Microsoft Shared\DevServer\Queries\firstSqlQuery.sql
中查找文件。当可执行文件目录不同时,为什么要查看此位置?
答案 0 :(得分:4)
你可以做这样的事情......如果它在项目之外。 (当我初读这篇文章时 - 我误读并认为它在我假设包含该项目的解决方案目录中) -
var pathToBin = Assembly.GetExecutingAssembly().Location;
var directoryInfoOfBin = new DirectoryInfo(pathToBin);
var solutionDirectory = directory.Parent().Parent();
var pathToSolution = solutionDirectory.FullName;
但是如果它在项目中则更简单
System.Web.HttpContext.Current.Server.MapPath("~/Queries/firstSqlQuery");
答案 1 :(得分:1)
有很多方法可以解决这个问题,但必须首先收集基本的理解。发布像@"Queries/..."
这样的东西本身并不会做任何事情。您需要利用System.IO
命名空间来执行IO操作。
有了这个基础的部分,当你发出这样的命令时,让我们再说一遍:
File.ReadAllText("firstSqlQuery.sql");
隐含的路径是正在执行代码的程序集的Working Directory
。在Visual Studio中调试应用程序时,尤其是ASP.NET应用程序,这是位于项目目录下的bin
目录,默认情况下为 。因此,如果您确实想要访问Queries
文件夹,则必须执行以下操作:
File.ReadAllText(@"..\Queries\firstSqlQuery.sql");
所以,这是处理它的一种方式。
另一种处理方法是通过查看文件属性(例如创建bin
),每次构建项目时将文件复制到Post Build Event
文件夹中,但这样做更多我认为你正在寻找。
此外,关键是要了解您正在开始的目录。
最后,值得注意的是,如果您利用目录结构,则需要确保将Queries
文件夹部署到实际站点。这可能不言而喻,但我以前见过人们遇到过这个问题。
答案 2 :(得分:0)
您可以确保在执行构建时将查询文件复制到输出目录,并从那里读取文件而无需设置路径。