【发布时间】:2011-01-04 16:00:00
【问题描述】:
假设我们有c:\\d1\\d2\\d3\\...,其中d3 中有许多文件和目录。
我们想将d3 中的所有项目移动到c:\\d1\\new\\。
如何做到干净又安全?
c:\\d1\\new 存在!
【问题讨论】:
-
您是想知道如何物理移动文件,还是想知道如何更改对旧路径的所有引用?
假设我们有c:\\d1\\d2\\d3\\...,其中d3 中有许多文件和目录。
我们想将d3 中的所有项目移动到c:\\d1\\new\\。
如何做到干净又安全?
c:\\d1\\new 存在!
【问题讨论】:
如果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);
}
}
【讨论】:
c:\d1\new 存在,则必须遍历c:\d1\d2\d3 的内容,并使用相同的函数一个一个移动其文件和文件夹。
此外,MSDN 有一个方便的表格,其中列出了 Common I/O Tasks 使用哪些函数,这是解决此类问题的一个很好的参考。
【讨论】:
try
{
System.IO.Directory.Move(@"c:\d1\d2\d3\", @"c:\d1\new\");
}
catch(...)
{
}
Move 方法可能会抛出以下任何异常,具体取决于您的使用情况,可能会或可能不会抛出。因此,您需要以适合您的应用程序的方式编写异常处理程序。
作为一般示例(您可能不希望/不需要在错误时显示消息框):
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,直到复制完成。这可能需要一些时间,具体取决于正在移动的文件/目录的数量。因此,谨慎的做法是在单独的线程中运行它和/或显示循环进度条。
【讨论】:
将文件或目录及其内容移动到新位置。
【讨论】: