【问题标题】:Directory could not be found找不到目录
【发布时间】:2015-08-14 01:42:08
【问题描述】:

我最近开始收到一个错误,指出找不到我的目录。我尝试了多种方法来解决这个问题,但还没有找到解决方案。

该方法应允许用户为其计算机选择一个图像并将其添加到应用程序文件夹结构内的一个名为 images 的文件夹中。问题是当使用 File.copy(imageFilename, path);它抛出错误。我试过改变路径,你会从代码中看到它。当程序本身已经传递了应用程序的文件路径并且仍然向我抛出错误时,它甚至会这样做。

这就是方法。

    private void btnImageUpload_Click(object sender, RoutedEventArgs e)
    {
        OpenFileDialog imageFile = new OpenFileDialog();
        imageFile.InitialDirectory = @"C:\";
        imageFile.Filter = "Image Files (*.jpg)|*.jpg|All Files(*.*)|*.*";
        imageFile.FilterIndex = 1;

        if (imageFile.ShowDialog() == true)
        {
            if(imageFile.CheckFileExists)
            {
                string path = AppDomain.CurrentDomain.BaseDirectory;
                System.IO.File.Copy(imageFile.FileName, path);
            }
        }
    }

我使用的是 VS2013 并包含了 using Microsoft.win32

如果需要任何进一步的信息,请询问。

谢谢

【问题讨论】:

  • DeanOC 你编辑了什么?哈哈。不是问题只是一个查询哈
  • 一般来说,将 OpenFileDialog.RestoreDirectory 设置为 true 是个好主意。

标签: c# wpf openfiledialog


【解决方案1】:

有两点需要注意

private void btnImageUpload_Click(object sender, RoutedEventArgs e)
{
    OpenFileDialog imageFile = new OpenFileDialog();
    imageFile.InitialDirectory = @"C:\";
    imageFile.Filter = "Image Files (*.jpg)|*.jpg|All Files(*.*)|*.*";
    imageFile.FilterIndex = 1;

    if (imageFile.ShowDialog() == true)
    {
        if(imageFile.CheckFileExists)
        {
            string path = AppDomain.CurrentDomain.BaseDirectory; // You wont need it 
            System.IO.File.Copy(imageFile.FileName, path); // Copy Needs Source File Name and Destination File Name
        }
    }
}

string path = AppDomain.CurrentDomain.BaseDirectory; 您将需要这个,因为默认目录是您当前运行程序的目录。 第二 System.IO.File.Copy(imageFile.FileName, path); Copy 需要源文件名和目标文件名,所以你只需要给出文件名而不是路径

所以你更新的代码将是

private void btnImageUpload_Click(object sender, RoutedEventArgs e)
{
    OpenFileDialog imageFile = new OpenFileDialog();
    imageFile.InitialDirectory = @"C:\";
    imageFile.Filter = "Image Files (*.jpg)|*.jpg|All Files(*.*)|*.*";
    imageFile.FilterIndex = 1;

    if (imageFile.ShowDialog() == true)
    {
        if(imageFile.CheckFileExists)
        {
            System.IO.File.Copy(imageFile.FileName, SomeName + ".jpg"); // SomeName Must change everytime like ID or something 
        }
    }
}

【讨论】:

  • 感谢 mohit 我已经解决了这个问题,代码是帮助更好地理解问题的基本代码。我并不依赖我不需要这样做,但是我将选定的图像存储在一个名为 Images 的文件夹中(作为应用程序结构的一部分存储)。我曾希望直接使用该路径作为应用程序根目录或图像文件夹的方向,但感谢您提供的信息。
  • 亲爱的。解决问题很有趣。您只需在路径后添加/images/ 即可实现您的目标。
  • 解决它们可能会很有趣,但拥有它们肯定不好玩,哈哈,只是一点点旁注。我知道此刻的路径进入 bin\\debug 但是如果我要发布此应用程序,如果要向其添加 substring() 并删除 bin\\debug,这仍然可以在查找图像文件夹中工作吗?抱歉,我知道这可能是一个单独的问题。
  • AppDomain.CurrentDomain.BaseDirectory; 实际上指向您的可执行文件的位置,所以现在即使您发布应用程序,它也会指向您的应用程序可执行文件所在的同一目录。因此,如果您的图像文件夹位于 Application Folder/Images 中,那么是的,相同的代码将起作用
  • 再次感谢所有的帮助,这让我更容易理解这一点。很难想象我也即将开始我在软件开发领域的荣誉年了。
【解决方案2】:

我不确定这是否是问题所在,但 File.Copy 方法需要源文件名和目标文件名,而不是源文件名和目录:https://msdn.microsoft.com/en-us/library/c6cfw35a(v=vs.110).aspx

因此,要使这项工作正常进行,在您的情况下,您必须执行以下操作(省略命名空间):

File.Copy(imageFile.FileName, Path.Combine(path, Path.GetFileName(imageFile.FileName));

请注意,如果目标文件存在,这将失败,要覆盖它,您需要在Copy 方法中添加一个额外的参数(true)。

编辑: 请注意,OpenFileDialog.CheckFileExists 不会返回指示所选文件是否存在的值。相反,它是一个值,指示如果用户指定的文件名不存在,文件对话框是否显示警告。因此,不要在对话框关闭后检查此属性,而应在打开它之前将其设置为true (https://msdn.microsoft.com/en-us/library/microsoft.win32.filedialog.checkfileexists(v=vs.110).aspx)

【讨论】:

  • 嗨 vesan 感谢您的快速响应目录,但会查看并尝试添加文件名。
  • Np,我不确定这是否能解决问题,但文档说明第二个参数不能是目录,所以它肯定需要在你的代码中进行更改。
  • 感谢 vesan 似乎有效。你是个明星,我不敢相信我这么愚蠢以至于把文件名留在外面,我只是以为它会把它作为文件副本复制过来..
猜你喜欢
  • 2021-02-22
  • 2020-05-10
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 2017-05-03
  • 2021-03-24
相关资源
最近更新 更多