web-dev-qa-db-ja.com

File.Moveが機能しない-ファイルが既に存在する

フォルダーがあります:

c:\ test

私はこのコードを試しています:

File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");

私は例外を受け取ります:

ファイルが既に存在します

出力ディレクトリは間違いなく存在し、入力ファイルはそこにあります。

76
Jack Kada

(フォルダではなく)別のファイルに移動する必要がありますが、これは名前の変更にも使用できます。

移動:

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を作成しようとしますが、同じ名前のフォルダーが既に存在するため作成できないためです。

56
Lee

必要なのは:

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である必要があります。

125

個人的に私はこの方法を好みます。これにより、宛先のファイルが上書きされ、ソースファイルが削除され、コピーが失敗したときにソースファイルが削除されなくなります。

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
}
31
Mitchell

P/Invokeを実行して MoveFileEx() -pass11for flagsMOVEFILE_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を参照として追加した後。

12
mheyman

ファイルが本当に存在し、それを置き換える場合は、以下のコードを使用します。

string file = "c:\test\SomeFile.txt"
string moveTo = "c:\test\test\SomeFile.txt"

if (File.Exists(moveTo))
{
    File.Delete(moveTo);
}

File.Move(file, moveTo);
9
Pawel Czapski

File.Moveのドキュメント によると、「存在する場合は上書き」パラメーターはありません。宛先folderを指定しようとしましたが、完全なファイル仕様を指定する必要があります。

ドキュメントを再度読んで(「新しいファイル名を指定するオプションを提供する」)、Ithink、宛先フォルダー仕様にバックスラッシュを追加すると機能する場合があります。

4
Ekkehard.Horner

Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(Source, Destination, True)を試してください。最後のパラメーターはOverwriteスイッチで、System.IO.File.Moveにはありません。

1
Mark