如何在Visual Studio中获取文件的相对路径?


82

我正在尝试获取在Visual Studio的解决方案资源管理器中添加的图像文件的路径,但无法获取该图像的相对路径。H是我的项目的文件结构:

/ BulutDepoProject
    /文件夹图标
        Folder.ico
        Main.cs

我可以得到这样的图像:

"C:\\Users\\Tolga\\Desktop\\BulutDepo\\BulutDepoProject\\FolderIcon\\Folder.ico" 

但是我应该能够通过以下方式获得它:

"~\\FolderIcon\\Folder.ico"

我想我不知道它的确切语法,所以我无法获取图像。:(



Answers:


54

当您要使用任何类型的外部文件时,肯定有一种方法可以将它们放在项目中的文件夹中,但不如从资源中获取它们那样有效。在常规的Visual Studio项目中,您应该Resources.resx在该Properties部分下有一个文件,如果没有,则可以轻松添加自己的Resource.resx文件。并在其中添加任何类型的文件,您可以在此处找到将资源文件添加到项目中的演练。

在项目中包含资源文件后,调用它们很容易,如下所示:

var myIcon = Resources.MyIconFile;

当然,您应该添加如下using Properties语句:

using <namespace>.Properties;

4
@ christo8989 OP关于一个图像文件,readonly无论如何,所以....
Jesse Chisholm

37

我来晚了,我不确定这是否是您想要的,但是我想我会添加它,以防其他人发现它有用。

假设这是您的文件结构:

/BulutDepoProject
    /bin
        Main.exe
    /FolderIcon
        Folder.ico
        Main.cs

您需要编写相对于Main.exe文件的路径。因此,您要访问Folder.icoMain.cs您可以使用:

String path = "..\\FolderIcon\\Folder.ico"

这似乎对我有用!


1
就我而言,这是一个更好的解决方案,因为所引用的文件由解决方案中的另一个项目管理。语法还不支持单个点吗?string path = ".\\FileName.txt"
Christopher J. Grace

1
这是一个糟糕的解决方案,请不要使用它。。。这仅是因为在“调试”方案中,您当前的工作目录<Project>/Debug 适用于VS Debug环境。但是,如果您退出IDE ...或从其他工作目录运行EXE,则肯定会中断。
Tomer W

25

省略“〜\”:

var path = @"FolderIcon\Folder.ico";

~\在文件系统方面并不意味着任何东西。我所看到的唯一可以正确使用的地方是在Web应用程序中,其中ASP.NET将波浪号替换为应用程序根目录的绝对路径。

通常,您可以假设路径相对于EXE所在的文件夹。另外,请确保在Visual Studio的属性选项卡中将图像指定为“内容”和“如果较新则复制” /“始终复制”。


在unix / linux中,“〜”是“主目录”的同义词。
Nyerguds

1
@Nyerguds是的。但是,斜杠是错误的方式,此问题标记为“ Visual Studio”,与Linux并不真正兼容,尤其是在2012年发布此问题时。
3Dave

“您通常可以假设路径相对于EXE所在的文件夹” <<非常不正确!当您双击Windows中的EXE时,工作目录是用户的私有位置,而不是可执行位置!
Tomer W

@TomerW除了双击可执行文件外,还有许多方法可以运行它。
3Dave

正确,但是...应用程序应该适用于所有方式,包括我认为最常见的Dblclick。
Tomer W

17

我也遇到了同样的问题,我得以解决。因此,让我解释一下我应用的步骤。我将根据您的情况进行解释。

根据我的方法,我们需要使用“ Path”类和“ Assembly”类来获取相对路径。

因此,首先在using语句中导入System.IO和System.Reflection。

然后键入以下给定的代码行。

        var outPutDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly(). CodeBase);

实际上在给定的行上方存储了项目的输出目录的路径。(这里的“ output”目录指的是Debug项目文件夹)。

现在,将FolderIcon目录复制到Debug文件夹中。然后键入下面的给定行。

var iconPath = Path.Combine(outPutDirectory, "FolderIcon\\Folder.ico");

现在,此“ iconPath”变量包含Folder.ico的整个路径。您所要做的就是将其存储在字符串变量中。为此,请使用下面的代码行。

string icon_path = new Uri(iconPath ).LocalPath;

现在,您可以使用此icon_path字符串变量作为图标的相对路径。

谢谢。


1
为什么file:在这条路的前面
Kolob Canyon

2
@KolobCanyon这是因为.NET程序集可以从各种URI运行,而不仅是从磁盘(COM对象,RPC,Etc等)运行。Assembly.GetExecutingAssembly().Location如果确定要处理文件(EXE / DLL),则可以使用
Tomer W

3

我认为使用这将是最简单的

new Uri("pack://application:,,/FolderIcon/" + youImageICO);

否则,如果您要更改文件夹的根目录中的代码,则此代码将在任何计算机上运行...只需更改此部分@“ .. \”

public static string bingPathToAppDir(string localPath)
{
    string currentDir = Environment.CurrentDirectory;
    DirectoryInfo directory = new DirectoryInfo(
        Path.GetFullPath(Path.Combine(currentDir, @"..\..\" + localPath)));
    return directory.ToString();
}

2

在Visual Studio中,请在“解决方案资源管理器”窗格中单击“ Folder.ico”文件。然后,您将看到“属性”窗格。将“复制到输出目录”的行为更改为“如果更新则复制”。这将使Visual Studio将文件复制到输出bin目录。

现在,要使用相对路径获取文件路径,只需键入:

string pathToIcoFile = AppDomain.CurrentDomain.BaseDirectory + "//FolderIcon//Folder.ico";

希望能有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.