【问题标题】:File not found Exception occurs找不到文件 发生异常
【发布时间】:2017-07-21 17:05:45
【问题描述】:

我的项目中有一个图像列表。所以我需要从窗口后面的代码中在图像列表中添加图像。

我的项目中有一个名为 Myimages 的文件夹。在那个文件夹中,我有一些图像。

所以我尝试这样:

imageList1.Images.Add(Image.FromFile(@"Myimages\dog.ico"));

imageList1.Images.Add(Image.FromFile(@"~\Myimages\cat.ico"));

 imageList1.Images.Add(Image.FromFile(@"/Myimages/horse.ico"));

但我不能这样做。它会导致 FileNotFoundException

错误:

“System.IO.FileNotFoundException”类型的未处理异常 发生在 System.Drawing.dll 中

附加信息:/Myimages/horse.ico

如何解决这个错误。帮助赞赏!

当我使用像 C:\MyProject\Myimages\horse.ico 这样的完整路径时。它为我工作。 但是当我给出像“Myimages\horse.ico”这样的路径时,它给出了异常。

【问题讨论】:

  • 它是一个什么样的应用程序?网络还是 Windows?对于windows应用程序,应用程序从bin文件夹运行,因此如果不正确,它将无法根据相关文件找到文件。
  • 您是否将图像构建操作设置为内容并始终复制?之后你能在Debug文件夹中找到它吗?
  • 当前路径是解决方案中的DebugRelease 文件夹。取决于您的定位配置
  • “将图像构建动作作为内容并始终复制”是什么意思?对不起,我无法为您提供信息@user3185569
  • 至少在开始时,最简单可靠的解决方案是使用配置文件作为基础配置。 IE。 app.config 文件。在 下添加一个名为“imagePath”的设置,其值设置为绝对(或相对)路径,然后在您的代码中使用 ConfigurationManager.AppSettings["imagePath"] 代替硬编码路径。这样,您无需重新构建应用即可轻松更改此值。

标签: c# winforms filenotfoundexception imagelist


【解决方案1】:

当我使用像 C:\MyProject\Myimages\horse.ico 这样的完整路径时。它为我工作。但是当我给出像Myimages\horse.ico 这样的路径时,它会给出异常。

因为相对路径是从 *.EXE 文件的位置开始搜索的。这是在C:\MyProject\bin\DebugC:\MyProject\bin\Release 文件夹中。在进入Myimages 之前,您需要向上移动 2 个文件夹。试试这个相对路径:

..\..\Myimages\horse.ico

编辑:

如果您的解决方案文件夹与您的项目文件夹同名,那么您比我想象的要深一层。请在这种情况下再试一级

..\..\..\Myimages\horse.ico

免责声明:一旦您将 *.EXE 相对于 MyImages 文件夹移动,这种方法就会给您带来麻烦。比如进入同一个文件夹,那么这个路径就会出错。

编辑2:请您采用以下格式:

imageList1.Images.Add(Image.FromFile(@"..\..\..\Myimages\horse.ico"));

【讨论】:

  • 虽然这会在 .exe 被移动时搞砸。也许您应该将图像放入项目的嵌入式资源中。
  • 同样的事情发生在 System.Drawing.dll 中发生“System.IO.FileNotFoundException”类型的未处理异常附加信息:..\..\Myimages\horse.ico
  • @user8331467 看看我的编辑。如果MyImages 在解决方案文件夹中?然后尝试:..\..\..\Myimages\horse.ico
  • Additional information: ..\..\..\Myimages\horse.ico.. 再次显示异常
  • @user8331467 你把@放在字符串前面了吗?
【解决方案2】:

当使用 相对路径 例如

 @"/MyImages/horse.ico"

实际的完整路径是

 Path.Combine(Environment.CurrentDirectory, @"/MyImages/horse.ico");

请检查Environment.CurrentDirectory 值,您可以看到系统尝试在哪里寻找/Myimages/horse.ico 文件。您可以根据需要修改Environment.CurrentDirectory

 // When relative path provided look at C:\MyFiles
 Environment.CurrentDirectory = @"C:\MyProject";

编辑:当您不想将绝对路径(例如@"C:\MyProject")设置为默认路径时,您可以尝试从入口点程序集开始计算路径(例如exe文件)

using System.Reflection;

...

// One level down the directory where exe file lies
string path = 
  Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "..");

【讨论】:

  • 感谢您的回答,我只想提及包含文件夹名称和图像名称的项目。这可以做吗?
  • @user8331467:请问您具体想提的是什么以及哪种格式MyProjecthorse.ico? C:\MyProject, /MyImages/horse.ico?
  • /MyImages/horse.ico 像这样
  • 不允许提及目录..包含Myimages文件夹名称和图像名称的解决方案。
  • @user8331467:您可以尝试设置相对于主程序集(exe 文件或类似文件)的默认路径,如下所示:string path = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "..");
【解决方案3】:

如果是 Web 应用程序的话。然后利用Server.MapPath

string fileRelativePath = "~/Content/Gallery/" + Path.GetFileName(path);
image.Save(HttpContext.Current.Server.MapPath(fileRelativePath));

【讨论】:

  • 是winform应用程序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多