File.Moveが機能しない-ファイルが既に存在する
フォルダーがあります:
c:\ test
私はこのコードを試しています:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
私は例外を受け取ります:
ファイルが既に存在します
出力ディレクトリは間違いなく存在し、入力ファイルはそこにあります。
(フォルダではなく)別のファイルに移動する必要がありますが、これは名前の変更にも使用できます。
移動:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
リネーム:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\SomeFile2.txt");
あなたの例で「ファイルは既に存在します」と表示される理由は、C:\test\Test
が拡張子なしでファイルTest
を作成しようとしますが、同じ名前のフォルダーが既に存在するため作成できないためです。
必要なのは:
if (!File.Exists(@"c:\test\Test\SomeFile.txt")) {
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
}
または
if (File.Exists(@"c:\test\Test\SomeFile.txt")) {
File.Delete(@"c:\test\Test\SomeFile.txt");
}
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
これは次のいずれかです。
- 目的の場所にファイルが存在しない場合は、ファイルを正常に移動するか、または
- 目的の場所にファイルが存在する場合は、削除してからファイルを移動します。
編集:私は答えが最も賛成であるにもかかわらず、明確にする必要があります! File.Moveの2番目のパラメーターは、宛先ファイル-notフォルダーでなければなりません。 2番目のパラメーターを宛先フォルダーとして指定しています。not宛先ファイル名-File.Moveに必要なものです。したがって、2番目のパラメーターはc:\test\Test\SomeFile.txt
である必要があります。
個人的に私はこの方法を好みます。これにより、宛先のファイルが上書きされ、ソースファイルが削除され、コピーが失敗したときにソースファイルが削除されなくなります。
string source = @"c:\test\SomeFile.txt";
string destination = @"c:\test\test\SomeFile.txt";
try
{
File.Copy(source, destination, true);
File.Delete(source);
}
catch
{
//some error handling
}
P/Invokeを実行して MoveFileEx()
-pass11for flags
(MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH
)
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
static extern bool MoveFileEx(string existingFileName, string newFileName, int flags);
または、あなたはただ電話することができます
Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(existingFileName, newFileName, true);
microsoft.VisualBasicを参照として追加した後。
ファイルが本当に存在し、それを置き換える場合は、以下のコードを使用します。
string file = "c:\test\SomeFile.txt"
string moveTo = "c:\test\test\SomeFile.txt"
if (File.Exists(moveTo))
{
File.Delete(moveTo);
}
File.Move(file, moveTo);
File.Moveのドキュメント によると、「存在する場合は上書き」パラメーターはありません。宛先folderを指定しようとしましたが、完全なファイル仕様を指定する必要があります。
ドキュメントを再度読んで(「新しいファイル名を指定するオプションを提供する」)、Ithink、宛先フォルダー仕様にバックスラッシュを追加すると機能する場合があります。
Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(Source, Destination, True)
を試してください。最後のパラメーターはOverwriteスイッチで、System.IO.File.Move
にはありません。