2011-01-04 6 views
1

c:\\d1\\d2\\d3\\...があり、多くのファイルとディレクトリがd3にあるとします。
d3のすべての商品をc:\\d1\\new\\に移動します。ファイルのアドレスを変更する

清潔で安全な方法は?

c:\\d1\\newが存在します!

+0

ファイルを物理的に移動する方法、または古いパスへのすべての参照を変更する方法を知りたいということを知りたいのですか? –

答えて

2

c:\d1\newがまだ存在していない、とあなたはその後、空c:\d1\d2\d3フォルダを維持したくない場合は、Directory.Move()メソッドを使用することができますc:\d1\newが存在しない場合は、あなたが持っているでしょう

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\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); 
    } 
} 
+0

とそれがあれば? –

+0

+1唯一の指示では、猿がたどることさえできるかもしれない。 –

+0

'c:\ d1 \ new'が存在する場合は、' c:\ d1 \ d2 \ d3'の内容を繰り返し処理し、同じ機能を使用してファイルとフォルダを1つずつ移動する必要があります。 –

2

使用Directory.Move

また、MSDNの機能は、このような質問のための良い参考となるCommon I/O Tasksのために使用するものの便利なテーブルを持っています。

0

Directory.Moveを使用してください。

ファイルまたはディレクトリとその内容を新しい場所に移動します。

1
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!"); 
} 

最後に、移動が完了するまで、移動するための呼び出しは、現在のスレッドをブロックすることを言及する価値があります。したがって、UIからこれを行う場合、コピーが完了するまでUIがブロックされます。移動するファイル/ディレクトリの数に応じて、これには時間がかかることがあります。したがって、これを別のスレッドで実行したり、サイクリング進行状況バーを表示したりすることは賢明かもしれません。

+0

これはまともな答えです。なぜそれがdownvoteを受け取ったのか分かりません... – Kendrick

関連する問題