我使用Image.FromFile()时FileNotFound

时间:2013-03-31 13:31:52

标签: c# .net winforms image

在这种情况下我使用Image.FromFile(string)方法:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace GVEMO
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            PaintBackground();
        }
        public void PaintBackground() {
            gameBoard.Image = Image.FromFile("gvemoBack.jpg");
        }
    }
}

gameBoard是pictureBox的名称。但是当我启动这个程序时,我得到异常FileNotFound。图像位于主目录(带有文件夹bin,类,属性等的目录)中。我尝试将此图像复制到所有项目目录中,但异常仍然存在。在哪个目录必须是这个图像或我做错了什么?我使用VS2012和.NET framework 4.5。谢谢

7 个答案:

答案 0 :(得分:4)

图像必须位于当前工作目录中。在启动时,这是从中启动应用程序的目录,这可能是可执行文件所在的目录(但不能是)。请注意,此工作目录可以更改!

我建议您使用其他机制,而不是使用路径。如果您使用FileOpenDialog,则可以将当前工作目录设置为不同的值。因此,最好使用资源或图像所在目录的设置。

答案 1 :(得分:3)

由于您使用了相对路径,因此映像必须位于工作目录中。启动可执行文件时,除非另行指定,否则工作目录将设置为可执行文件所在的目录。显然,图像不存在。

由于很难扩展对工作目录的控制,特别是在GUI应用程序中,通常最好指定完整的绝对路径而不是相对路径。例如:

string dir = Path.GetDirectoryName(Application.ExecutablePath);
string filename = Path.Combine(dir, @"MyImage.jpg");

但是,对于您的场景来说,更好的方法是将图像作为资源包含在内,从而使您的可执行文件自包含。然后,您无需担心细节,例如确保图像与可执行文件位于同一目录中。

答案 2 :(得分:3)

确保您的文件在解决方案资源管理器中可见。如果没有,请单击解决方案资源管理器中的Show All Files按钮,右键单击该图像,然后单击“包含在项目中”。

如果您的文件可见,请通过右键单击解决方案资源管理器中的图像,选择属性并确保将Copy to Output Directory选项设置为,确保将图像复制到输出目录Copy if newerCopy always

答案 3 :(得分:1)

正如jdehaan所说,图像应该(通常)与可执行文件位于同一目录中。在您的情况下,Thas很可能是bin\Debug

如果这是静态图像,您也可以将其嵌入到程序集中。请看Embedding Image Resources in a Project

答案 4 :(得分:0)

请确保该图像与应用程序可执行文件位于同一目录中。

答案 5 :(得分:0)

如果未指定路径,则使用当前目录。

您可以使用相对路径:

./xxx/yyy/file.ext
../../xxx/yyy/file.ext

或绝对路径:

/xxx/yyy/file.ext

或在启动程序之前或执行期间更改目录(语言/平台相关解决方案)

答案 6 :(得分:0)

即使我有同样的问题。

我这样做是为了使其正常工作:

如果图像文件直接添加到项目中: 1.右键单击图像->“属性”窗口->从“复制”下拉菜单中选择“始终复制”或“如果更新则复制”。

就是这样。