【问题标题】:Unable to move files from a listbox to a newly created folder无法将文件从列表框移动到新创建的文件夹
【发布时间】:2018-12-07 18:04:29
【问题描述】:

我在将文件从列表框移动到新创建的文件夹时遇到问题。我得到:当文件已经存在时无法创建文件。

public void CreateFolders()
    {            
        //create folders
        string folder1 = pattern.Substring(0, 2);
        string folder2 = pattern.Substring(3, 2);
        string folder3 = pattern.Substring(6, 2);
        Directory.CreateDirectory("c:\\destinationfolder" + "\\" + folder1);
        Directory.CreateDirectory("c:\\destinationfolder" + "\\" + folder1 + "\\" + folder2);
        Directory.CreateDirectory("c:\\destinationfolder" + "\\" + folder1 + "\\" + folder2 + "\\" + folder3);
        var destinationDirectoryFinal = Directory.CreateDirectory("c:\\destinationfolder" + "\\" + folder1 + "\\" + folder2 + "\\" + folder3);
        destinationDirectory = destinationDirectoryFinal.FullName.ToString();
    }

    public void MoveFiles()
    {
        try
        {
            //Move files from listbox to newly created folders
            foreach (string files in listBox1.Items)
            {
                File.Move(files, destinationDirectory);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex);
        }

    }

【问题讨论】:

  • 错误信息“当文件已存在时无法创建文件”的哪一部分你不明白?
  • CreateFolders 方法在这里是否相关?此外,CreateDirectory 将在指定路径中创建所有目录(如有必要),因此可以将所有代码替换为一行:destinationDirectory = Directory.CreateDirectory(Path.Combine("c:\\destinationfolder", pattern.Substring(0, 2), pattern.Substring(3, 2), pattern.Substring(6, 2))).FullName;
  • CreateFolders 方法不相关。这只是为了帮助我将每个小任务分开,直到我完成所有工作。我已经把它结合起来了。当我应该使用 File.Copy 时,我使用了 File.Move。谢谢。

标签: c# listbox directory


【解决方案1】:

您在这里遇到的问题是您试图将文件移动到已经包含具有该名称的文件的目录。

您可以选择以下几个选项:

选项一

在尝试Move之前检查文件是否存在

foreach (var file in listBox1.Items)
{
    // Only move the file if it doesn't already exist
    if (!File.Exists(Path.Combine(destinationDirectory, Path.GetFileName(file))))
    {
        File.Move(file, destinationDirectory);
    }
}

选项二

如果文件存在,则始终覆盖该文件。我们可以分两步执行此操作 - 首先调用 File.Copy 并将“覆盖”参数设置为 true,然后调用 File.Delete 删除原始位置的文件:

foreach (var file in listBox1.Items)
{
    // If the destination file already exists, overwrite it. Then delete the original
    File.Copy(file, Path.Combine(destinationDirectory, Path.GetFileName(file)), true);
    File.Delete(file);
}


注意: 您可以做的另一件事来防止错误(在任何一种情况下)是确保源文件存在,并且在尝试任何操作之前源目录与目标目录不同:

foreach (var file in listBox1.Items)
{
    // Ensure that the file exists and that the source 
    // and destination directories are not the same
    if (!(File.Exists(file)) ||
        Path.GetDirectoryName(file).Equals(
            destinationDirectory, StringComparison.OrdinalIgnoreCase))
    {
        continue; // Continue to the next loop iteration without doing anything
    }

    // Rest of loop code here...
}

【讨论】:

  • 我是个白痴。我应该一直在使用 File.Copy。这是一个问题。然后我不得不从列表框中获取没有路径的文件名。它现在正在工作。谢谢大家。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
相关资源
最近更新 更多