2

ディレクトリ 1 とディレクトリ 2 があり、それぞれにファイルまたはサブディレクトリを含めることができるとします。これまでのところ、「Directory 2」の名前を「Directory 3」に変更したい場合は、次を実行できます。

Directory.Move("path\Directory 2", "path\Directory 3");

これは正常に動作します - ディレクトリの名前が変更され、そのディレクトリ内のすべてのサブディレクトリとファイルは新しい名前で正常に動作し、コピーを処理する必要はありません。

ただし、これを実行しようとすると:

Directory.Move("path\Directory 2", "path\Directory 1");

ディレクトリ 1 が既に存在するため、エラーが発生します。その場合、ディレクトリ 2 の名前をディレクトリ 1 に変更できない場合は、ディレクトリ 2 のすべてのコンテンツ (ファイルとサブディレクトリ) をディレクトリ 1 に移動する必要があります。これを行う最も簡単な方法は何ですか? ファイルが存在する場合、すべてのサブディレクトリを移動するための foreach、およびすべてのファイルを移動するための foreach が必要ですか? .Move 関数をオーバーロードして、存在エラーに関係なくファイルを移動する簡単な方法はありますか?

4

3 に答える 3

3

いいえ、MOVE はファイル システム レベルで動作するため、フォルダの名前を効果的に変更したり、フォルダの「ポインタ」を別の場所に移動したりします。前者は親ディレクトリが同じ場合、後者は親ディレクトリが異なる場合です。

したがって、直接の質問への回答として、ターゲットが存在し、その中に何かがある場合に備えて、各子ディレクトリを foreach する必要があります。そうでない場合は、いつでも消去して MOVE を実行できます。

ここを見てください: Directory.Move が機能しません (ファイルが既に存在します)

于 2012-06-15T16:44:27.073 に答える
0

私はこのようにします:

if(Directory.Exists(destinationPath))
{
    Directory.Delete(destionatPath, true /* recusively nuke everything */ );
}

Directory.Move(sourcePath, destinationPath);
于 2012-06-15T16:48:24.330 に答える
0

Directory.Move メソッドを使用してファイルを既存のフォルダーに移動することはできません。この場合、たとえばファイル レベルで foreach ループを使用して、ファイルを手動で移動する必要があります。Directory.Move は、宛先ディレクトリが存在しない場合にのみ機能します。ただし、ディレクトリが既に存在するかどうかを確認するか、それを試して IOException 例外を処理し、必要な場合にのみ foreach を実行することができます。

于 2012-06-15T16:49:40.210 に答える