我想使用C#.NET将目录从一个位置移动到另一个位置。我以这种简单的方式使用Directory.Move
甚至DirectoryInfo(使用MoveTo):
// source is: "C:\Songs\Elvis my Man"
// newLocation is: "C:\Songs\Elvis"
try
{
// Previous command was: Directory.Move(source, newLocation);
DirectoryInfo dir = new DirectoryInfo(source);
dir.MoveTo(newLocation);
}
catch (Exception e)
{
Console.WriteLine("Error: "+ e.Message);
}
但是正在进行的操作(对于这两种情况)都是将文件夹名称从“source”重命名为“newLocation”
我的期望是什么? 该文件夹“Elvis my man”现在将出现在“Elvis”文件夹中。
发生了什么事? “Elvis my man”改为“Elvis”(已重命名)。如果目录“Elvis”已经存在,则无法将其更改为“Elvis”(因为他不能创建重复的名称),因此我得到一个例外说明。
我做错了什么?
非常感谢!!!
答案 0 :(得分:6)
我建议围绕Move命令进行验证,以确保源位置确实存在且目标位置不存在。
我总是发现避免异常比处理异常更容易。
您可能也希望包含异常处理,以防访问权限出现问题或文件已打开且无法移动...
以下是一些示例代码:
string sourceDir = @"c:\test";
string destinationDir = @"c:\test1";
try
{
// Ensure the source directory exists
if (Directory.Exists(sourceDir) == true )
{
// Ensure the destination directory doesn't already exist
if (Directory.Exists(destinationDir) == false)
{
// Perform the move
Directory.Move(sourceDir, destinationDir);
}
else
{
// Could provide the user the option to delete the existing directory
// before moving the source directory
}
}
else
{
// Do something about the source directory not existing
}
}
catch (Exception)
{
// TODO: Handle the exception that has been thrown
}
答案 1 :(得分:3)
即使这在命令行中可以移动文件,但在编程时需要提供全新的名称。
因此,您需要将newLocation更改为“C:\ Songs \ Elvis \ Elvis my Man”才能使其正常工作。
答案 2 :(得分:2)
来自MSDN,
例如,如果您尝试将c:\ mydir移动到c:\ public,并且c:\ public已存在,则此方法将抛出IOException。您必须将“c:\ public \ mydir”指定为destDirName参数,或指定新目录名称,例如“c:\ newdir”。
看起来你需要将newLocation
设置为C:\ Songs \ Elvis \ Elvis my man
答案 3 :(得分:0)
private void moveDirectory(string fuente,string destino)
{
if (!System.IO.Directory.Exists(destino))
{
System.IO.Directory.CreateDirectory(destino);
}
String[] files = Directory.GetFiles(fuente);
String[] directories = Directory.GetDirectories(fuente);
foreach (string s in files)
{
System.IO.File.Copy(s, Path.Combine(destino,Path.GetFileName(s)), true);
}
foreach(string d in directories)
{
moveDirectory(Path.Combine(fuente, Path.GetFileName(d)), Path.Combine(destino, Path.GetFileName(d)));
}
}