我有一个用 C# 编写的程序,它使用 Image.FromFile 加载图像,并且每次都成功加载图像。但是,当您将另一个文件拖放到可执行文件上时,就像您向程序提供文件的命令行参数,并且该文件与可执行文件不在同一个文件夹中,程序会崩溃,因为它说的是文件不存在,即使它存在。
我认为通过在可执行文件上放置一个文件,它会以某种方式改变它加载图像的路径。我该如何解决这个问题?
我有一个用 C# 编写的程序,它使用 Image.FromFile 加载图像,并且每次都成功加载图像。但是,当您将另一个文件拖放到可执行文件上时,就像您向程序提供文件的命令行参数,并且该文件与可执行文件不在同一个文件夹中,程序会崩溃,因为它说的是文件不存在,即使它存在。
我认为通过在可执行文件上放置一个文件,它会以某种方式改变它加载图像的路径。我该如何解决这个问题?
您的程序将以不同的 Environment.CurrentDirectory 启动。始终确保使用绝对路径名加载文件(即不要使用 Image.FromFile("blah.jpg"))。
要获取与您的 EXE 存储在同一目录中的文件的绝对路径,您可以使用 Application.StartupPath 例如。或者 Assembly.GetEntryAssembly().Location 如果您不使用 Windows 窗体。
这取决于您如何在应用程序之外启动文件拖动。如果从 Windows 资源管理器中单击并拖动文件,则完整的绝对路径名将包含在下拉列表中。在这种情况下,以下代码显示文件名并将文件内容拖放到文本框中:
private void textBox1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.Copy;
}
private void textBox1_DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
var objPaths = (string[])(e.Data.GetData(DataFormats.FileDrop));
if (objPaths != null && objPaths.Length > 0 && File.Exists(objPaths[0]))
{
MessageBox.Show(string.Format("Filename: {0}", objPaths[0]));
using (TextReader tr = new StreamReader(objPaths[0]))
textBox1.Text = tr.ReadToEnd();
}
}
}
因此,让我们更多地了解您的阻力源。很可能您必须修改源以拖动绝对路径,或者以某种方式从拖动数据中的相对路径确定完整路径。
此外,您的程序不应因数据错误而崩溃。要么检查所需的条件,要么在必要的代码周围使用 try/catch 块。