私はフォルダを持っています:
c:\ test
私はこのコードを試しています:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
例外が発生します:
ファイルが既に存在します
出力ディレクトリは確実に存在し、入力ファイルはそこにあります。
私はフォルダを持っています:
c:\ test
私はこのコードを試しています:
File.Move(@"c:\test\SomeFile.txt", @"c:\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番目のパラメータは、あるべき宛先ファイル-ではないフォルダ。2番目のパラメーターを宛先ファイル名ではなく宛先フォルダーとして指定しています。これは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
}
File.Copy , File.Delete以上File.Move?
P / Invokeを実行できますMoveFileEx()- ()の11を渡します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を参照として追加した後。
ファイルが実際に存在し、それを置き換えたい場合は、以下のコードを使用してください。
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のドキュメントによると、「存在する場合は上書き」パラメータはありません。宛先フォルダを指定しようとしましたが、完全なファイル指定を指定する必要があります。
ドキュメントをもう一度読んで(「新しいファイル名を指定するオプションを提供する」)、宛先フォルダーの仕様にバックスラッシュを追加するとうまくいくと思います。
Move(String, String, Boolean)代わりに電話してください。しかし、それは間違いのようですか?
1).Net Core 3.0以降のC#では、3番目のブールパラメーターがあります。
https://docs.microsoft.com/en-us/dotnet/api/system.io.file.move?view=netcore-3.1を参照してください
In .NET Core 3.0 and later versions, you can call Move(String, String, Boolean) setting the parameter overwrite to true, which will replace the file if it exists.
2).Netの他のすべてのバージョンについては、https://stackoverflow.com/a/42224803/887092がベストアンサーです。上書きでコピーしてから、ソースファイルを削除します。これはアトミック操作になるため、より優れています。(私はこれでMSドキュメントを更新しようとしました)
試してみてくださいMicrosoft.VisualBasic.FileIO.FileSystem.MoveFile(Source, Destination, True)。最後のパラメータは上書きスイッチですが、これにSystem.IO.File.Moveはありません。
新しい場所にある既存のファイルを削除するオプションがないが、元の場所から移動して削除する必要がある場合は、次の名前変更のトリックが機能する可能性があります。
string newFileLocation = @"c:\test\Test\SomeFile.txt";
while (File.Exists(newFileLocation)) {
newFileLocation = newFileLocation.Split('.')[0] + "_copy." + newFileLocation.Split('.')[1];
}
File.Move(@"c:\test\SomeFile.txt", newFileLocation);
これは、「。」のみを想定しています。ファイル名のは拡張子の前です。拡張子の前にファイルを2つに分割し、「_ copy」を添付します。間に。これにより、ファイルを移動できますが、ファイルがすでに存在するか、コピーのコピーがすでに存在する場合、またはコピーのコピーのコピーが存在する場合は、コピーが作成されます...;)