【问题标题】:Change file address更改文件地址
【发布时间】:2011-01-04 16:00:00
【问题描述】:

假设我们有c:\\d1\\d2\\d3\\...,其中d3 中有许多文件和目录。
我们想将d3 中的所有项目移动到c:\\d1\\new\\

如何做到干净又安全?

c:\\d1\\new 存在!

【问题讨论】:

  • 您是想知道如何物理移动文件,还是想知道如何更改对旧路径的所有引用?

标签: c# .net io


【解决方案1】:

如果c:\d1\new还不存在,并且你不想在之后保留一个空的c:\d1\d2\d3文件夹,你可以使用Directory.Move()方法:

using System.IO;

try {
    Directory.Move(@"c:\d1\d2\d3", @"c:\d1\new");
} catch (UnauthorizedAccessException) {
    // Permission denied, recover...
} catch (IOException) {
    // Other I/O error, recover...
}

如果c:\d1\new 确实存在,您将不得不遍历c:\d1\d2\d3 的内容并一一移动其文件和文件夹:

foreach (string item in Directory.GetFileSystemEntries(@"c:\d1\d2\d3")) {
    string absoluteSource = Path.Combine(@"c:\d1\d2\d3", item);
    string absoluteTarget = Path.Combine(@"c:\d1\new", item);
    if (File.GetAttributes(absoluteSource) & FileAttributes.Directory != 0) {
        Directory.Move(absoluteSource, absoluteTarget);
    } else {
        File.Move(absoluteSource, absoluteTarget);
    }
}

【讨论】:

  • +1 是猴子甚至可以遵循的唯一指令。
  • 如果c:\d1\new 存在,则必须遍历c:\d1\d2\d3 的内容,并使用相同的函数一个一个移动其文件和文件夹。
  • @hamidi:我一直在为这个问题寻找更好的解决方案。
  • @HPT:好吧,就像最初的问题一样,假设了一些上下文,现在你让回答者必须再做一次 - 给出一些上下文,一个可能会说覆盖,另一个重命名存在,我说 to-mato,你说 to-mato!
【解决方案2】:

使用Directory.Move

此外,MSDN 有一个方便的表格,其中列出了 Common I/O Tasks 使用哪些函数,这是解决此类问题的一个很好的参考。

【讨论】:

    【解决方案3】:
    try
    {
        System.IO.Directory.Move(@"c:\d1\d2\d3\", @"c:\d1\new\");
    }
    catch(...)
    {
    }
    

    Move 方法可能会抛出以下任何异常,具体取决于您的使用情况,可能会或可能不会抛出。因此,您需要以适合您的应用程序的方式编写异常处理程序。

    • System.IO.IOExeption
    • System.UnauthorizedAccessException
    • System.ArgumentException
    • System.ArgumentNullException
    • System.IO.PathToLongException
    • System.IO.DirectoryNotFoundException

    作为一般示例(您可能不希望/不需要在错误时显示消息框):

    try
    {
        System.IO.Directory.Move(@"c:\d1\d2\d3\", @"c:\d1\new\");
    }
    catch (System.UnauthorizedAccessException)
    {
        MessageBox.Show("You do not have access to move this files/directories");
    }
    catch(System.IO.DirectoryNotFoundException)
    {
        MessageBox.Show("The directory to move files/directories from was not found")
    }
    catch
    {
        MessageBox.Show("Something blew up!");
    }
    

    最后值得一提的是,调用 Move 会阻塞当前线程,直到 move 完成。因此,如果您从 UI 执行此操作,它将阻止 UI,直到复制完成。这可能需要一些时间,具体取决于正在移动的文件/目录的数量。因此,谨慎的做法是在单独的线程中运行它和/或显示循环进度条。

    【讨论】:

      【解决方案4】:

      使用Directory.Move

      将文件或目录及其内容移动到新位置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-01
        • 1970-01-01
        • 2015-02-16
        • 1970-01-01
        • 1970-01-01
        • 2020-07-27
        • 1970-01-01
        • 2019-01-31
        相关资源
        最近更新 更多