Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用相对路径而不是绝对路径_C#_Winforms_Visual Studio_Relative Path_Absolute Path - Fatal编程技术网

C# 如何使用相对路径而不是绝对路径

C# 如何使用相对路径而不是绝对路径,c#,winforms,visual-studio,relative-path,absolute-path,C#,Winforms,Visual Studio,Relative Path,Absolute Path,我在文件夹中存储了一些图像: C:\MyPrograms\VisualStudio\BirdPrograms\BirdTouchScreenBasic\BirdTouchScreenBasic\DigeImages 我计划在我正在创建程序的另一台计算机上使用此程序 我有一个列表中的图像数组 有没有办法从相对路径而不是绝对路径加载图像 代替 Image.FromFile("C:/MyPrograms/VisualStudio/BirdPrograms/BirdTouchScreenBasic/Bi

我在文件夹中存储了一些图像:

C:\MyPrograms\VisualStudio\BirdPrograms\BirdTouchScreenBasic\BirdTouchScreenBasic\DigeImages

我计划在我正在创建程序的另一台计算机上使用此程序

我有一个列表中的图像数组

有没有办法从相对路径而不是绝对路径加载图像

代替

Image.FromFile("C:/MyPrograms/VisualStudio/BirdPrograms/BirdTouchScreenBasic/BirdTouchScreenBasic/pigeonImages/pigeon5.png");
我可以写:

Image.FromFile("./pigeonImages/pigeon5.png");
假设Visual Basic用于运行程序的文件位于最上面的文件夹中,而鸽子图像文件夹位于最下面的文件夹中,这是错误的

因此,在命令行上,我应该能够键入:


C:\BirdTouchScreenBasic>cd DigeImages

基于您提供的路径如果当前工作目录为BirdTouchScreenBasic,则@.\DigeImages\Dige5.png将是正确的路径。如果希望无论程序在何处运行都可以访问这些图像,则应将它们添加到解决方案中,并使其复制到输出目录。如果是这种情况,那么您可以在整个代码中使用相对路径而不会出现问题。如果您将路径设置为@.\digeimages\fileName.ext,但实际上没有对项目进行结构化,从而使文件夹及其内的文件存在于CWD中,那么您将遇到问题

如果你不知道如何在你的C项目中添加图像资源,这里有一些基本步骤;右键单击项目文件并选择“添加”,然后选择“新建文件夹”,创建文件夹。右键单击文件夹并选择“添加”,然后选择“新建项目”。导航到要添加的图像文件并选择它,然后按ok。右键单击刚添加的图像,选择“属性”。有一个名为Copty的选项用于输出目录集,如果较新,则将其复制或始终复制。

千万不要这样做,您的环境将被设置为什么是完全不可预测的。CurrentDirectory将被设置为什么。它不在你的控制之下,无论什么程序启动,你的程序都会控制它。而且这种情况经常出现错误

相反,您应该创建一个基于EXE位置的绝对路径。假设将图像文件部署在与EXE相同的目录或子目录中。使用如下代码,为清晰起见:

using System.Reflection;
using System.IO;
...
    public static Image LoadPigeon(string name) {
        var exeDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
        var imgDir = Path.Combine(exeDir, "pigeonImages");
        var imgPath = Path.Combine(imgDir, name);
        return Image.FromFile(imgPath);
    }

你试过你的假设吗?因为它是正确的…我的假设是错误的吗?是的,很容易验证…这是WPF/WinForms吗?请检查:请注意,所有相对路径都是程序运行时可以更改的路径,或者不必等于可执行文件的位置。重复问题处理位于可执行文件旁边的文件,这些文件似乎正是您的案例。这就是我正在寻找的。我工作得很好。我在文件夹中有图像,但没有将属性设置为“始终复制”。AppDomain.CurrentDomain.BaseDirectory可能比Assembly.GetEntryAssembly.Location在一般情况下更好,如下所述:。GetEntryAssembly在某些情况下可以返回null,这在WinForms应用程序中是不允许的,这是OP的情况。