【问题标题】:Move all files in a directory to a new directory将目录中的所有文件移动到新目录
【发布时间】:2018-08-15 04:34:23
【问题描述】:

我有一个 C# Windows 窗体应用程序,我想将桌面上的所有文件移动到另一个目录。出于测试目的,我刚刚在桌面上创建了一个名为“Test”的文件夹,我希望将文件移动到该文件夹​​中。当第一个表单打开时,我让这段代码正确运行:

try
        {
            string dest = @"C:\Users\Billeh\Desktop\Test\";
            string[] files = Directory.GetFiles(@"C:\Users\Billeh\Desktop\");
            foreach (var file in files)
            {
                File.Move(file, dest);
            }
        } catch (Exception e)
        {
            MessageBox.Show(e.ToString());
        }

但是,这似乎没有任何作用。它只是继续并打开表单,就像它被跳过一样。没有消息框弹出,我知道它没有被跳过,因为如果我让它在 try 语句中显示一个随机消息框,它就会出现。不知道怎么回事,感谢大家的帮助。

【问题讨论】:

  • dest 不能只是目标文件夹的名称。它还需要具有文件的名称。这里需要 Path.GetFilename
  • 如果目标文件夹中当前没有文件怎么办? “它还需要有文件名”是指目标文件夹中的一个吗?
  • 不,仅仅给出目标文件夹是不够的。 File.Move 需要移动目标的名称。实际上,此方法也用于重命名同一文件夹中的文件。

标签: c# winforms directory


【解决方案1】:

File.Move 需要一个目标文件,而不仅仅是一个目标文件夹。 您需要决定如何命名目标文件夹中移动的文件。它可以是源文件的相同名称或您选择的其他名称。如果您想保留旧名称,Path.GetFilename 可能会有所帮助。

还要注意EnumerateFiles 比 GetFiles 更好,因为它允许您开始移动操作而无需先将所有文件名加载到内存中。

try
{
    string dest = @"C:\Users\Billeh\Desktop\Test";
    foreach (var file in Directory.EnumerateFiles(@"C:\Users\Billeh\Desktop\")
    {
        string destFile = Path.Combine(dest, Path.GetFileName(file))
        if(!File.Exists(destFile))
            File.Move(file, destFile);

    }
} 
catch (Exception e)
{
    MessageBox.Show(e.ToString());
}

还要考虑 File.Move 不能覆盖目标文件夹中的现有文件。如果文件存在,则会引发 IOException。因此,如果要覆盖,则需要先删除目标文件,但无论如何,您都需要使用File.Exists添加检查

【讨论】:

  • 谢谢,这是为我完成的解决方案。
【解决方案2】:

您可以使用Directory.Move(string, string)方法,而不是逐个文件移动。

语法

   Directory.Move(sourceDirPath, DestinationDirPath)

欲了解更多信息:Directory.Move Method (String, String)

【讨论】:

    猜你喜欢
    • 2017-05-27
    • 2014-06-21
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多