如何在visual studio中获取文件的相对路径?

Tol*_*men 69 c# visual-studio

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

/BulutDepoProject
    /FolderIcon
        Folder.ico
        Main.cs

我可以得到这样的图像:

"C:\\Users\\Tolga\\Desktop\\BulutDepo\\BulutDepoProject\\FolderIcon\\Folder.ico" 
Run Code Online (Sandbox Code Playgroud)

但我应该能够得到类似的东西:

"~\\FolderIcon\\Folder.ico"
Run Code Online (Sandbox Code Playgroud)

我想我不知道它的确切语法所以我不能获取图像.:(

Tol*_*men 50

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

在项目中拥有资源文件后,调用它们很容易,因为:

var myIcon = Resources.MyIconFile;
Run Code Online (Sandbox Code Playgroud)

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

using <namespace>.Properties;
Run Code Online (Sandbox Code Playgroud)

  • @ christo8989 OP是一个*image*文件,无论如何都是`readonly`,所以.... (4认同)

Ada*_*lus 32

我有点晚了,我不确定这是不是你想要的,但我想我会添加它以防万一其他人发现它有用.

假设这是您的文件结构:

/BulutDepoProject
    /bin
        Main.exe
    /FolderIcon
        Folder.ico
        Main.cs
Run Code Online (Sandbox Code Playgroud)

您需要编写相对于Main.exe文件的路径.所以,你要访问Folder.ico,在Main.cs你可以使用:

String path = "..\\FolderIcon\\Folder.ico"
Run Code Online (Sandbox Code Playgroud)

这似乎对我有用!

  • 这是一个糟糕的解决方案,不要使用它...这只有效,因为在“调试”场景中,您当前的工作目录是“&lt;Project&gt;/Debug”,因此它适用于 VS 调试环境。但是,如果您退出 IDE...或从不同的工作目录运行 EXE,它肯定会崩溃。 (6认同)

3Da*_*ave 20

省略"〜\":

var path = @"FolderIcon\Folder.ico";
Run Code Online (Sandbox Code Playgroud)

~\在文件系统方面没有任何意义.我见过的唯一正确使用的地方是在一个Web应用程序中,ASP.NET用代替应用程序根目录的绝对路径替换代字号.

您通常可以假设路径相对于EXE所在的文件夹.此外,请确保在Visual Studio的属性选项卡中将图像指定为"content"和"copy if newer"/"always always".

  • @Nyerguds 是的。然而,斜线是错误的方式,并且这个问题被标记为“Visual Studio”,它与Linux并不真正兼容,特别是在2012年发布这个问题时。 (2认同)

小智 14

我也遇到了同样的问题,我能够完成它.那么让我解释一下我应用的步骤.我将根据你的情况解释一下.

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

所以首先在using语句中导入System.IO和System.Reflection.

然后键入下面给出的代码行.

        var outPutDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly(). CodeBase);
Run Code Online (Sandbox Code Playgroud)

实际上,上面给定的行存储了项目输出目录的路径.(这里'output'目录指的是项目的Debug文件夹).

现在将FolderIcon目录复制到Debug文件夹中.然后键入下面给出的Line.

var iconPath = Path.Combine(outPutDirectory, "FolderIcon\\Folder.ico");
Run Code Online (Sandbox Code Playgroud)

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

string icon_path = new Uri(iconPath ).LocalPath;
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

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

Pho*_*nic 5

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

new Uri("pack://application:,,/FolderIcon/" + youImageICO);
Run Code Online (Sandbox Code Playgroud)

或者此代码将在任何机器上运行,如果您的文件夹位于根项目中,如果您想更改它...只需更改此部分@“..\”

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


小智 5

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

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

string pathToIcoFile = AppDomain.CurrentDomain.BaseDirectory + "//FolderIcon//Folder.ico";
Run Code Online (Sandbox Code Playgroud)

希望有所帮助。