web-dev-qa-db-ja.com

.NETでファイルの名前を変更する方法は?

System.IO.Fileまたは別の.NETクラスを使用して、ファイルの名前を変更する最良の方法は何ですか?

ローカルドライブまたはネットワーク上の場所にあるファイルの名前を変更できるようにしたい。

System.IO.Fileを使用している場合、Moveが最善の方法ですか?

38
CJ7

代替案

System.IO.File.Move

次のようにSystem.IO.File.Moveを使用してファイルの名前を変更できます。

var sourcePath = @"C:\folder\oldname.txt";
var destinationPath = @"C:\folder\newname.txt";
File.Move(sourcePath, destinationPath);

同じ場所を保持し、ファイルの名前を変更することに関心があるかもしれません。確かにできること:

var sourcePath = @"C:\folder\oldname.txt";
var newName = "newname.txt";
var directory = Path.GetDirectoryName(sourcePath);
var destinationPath = Path.Combine(directory, newName);
File.Move(sourcePath, destinationPath);

System.IO.FileInfo.MoveTo

System.IO.FileInfo.MoveToを使用することもできます。

var sourcePath = @"C:\folder\oldname.txt";
var destinationPath = @"C:\folder\newname.txt";
FileInfo info = new FileInfo(sourcePath);
info.MoveTo(destinationPath);

:上記のように宛先パスを作成することもできます。


「ハンドムーブ」

明らかに、いつでも既存のファイルを開いて、目的の名前で新しいファイルを作成できます。コンテストを古いものから新しいものにコピーし、最後に古いものを削除します。書き込みアクセス権がある場合、これは機能しますが、日付とセキュリティ情報(ファイルの所有者など)は保持されません。

その例は、受け入れられる解決策で、あるファイルの内容を別のファイルに書き込む方法? で見ることができます。


メモ

注1:その他の代替には、Microsoft.VisualBasic.FileSystem.RenameおよびMicrosoft.VisualBasic.FileIO.FileSystem.RenameFileが含まれます。

Microsoft.VisualBasic.FileSystem.RenameSystem.IO.File.Moveはどちらも同等であり、kernel32から MoveFile の周りのパラメーターチェック、権限チェック、エラー処理を行います。

Microsoft.VisualBasic.FileIO.FileSystem.RenameFileに関しては、フルパスと新しい名前を指定して同じフォルダー内のファイルの名前を変更し(宛先パスを作成するために上記で示したものと同様)、kernel32からMoveFileにフォールバックします。

同様に、System.IO.FileInfo.MoveTokernel32からMoveFileを呼び出します。

注2:MonoからMicrosoft.VisualBasicが見つからないことにも注意する必要があります。つまり、System.IO.File.MoveSystem.IO.FileInfo.MoveToのみが移植可能なオプションです。


それはすべてMoveFileです。

上記のように、これらのメソッドはすべてkernel32からMoveFileにフォールバックします。 MoveFileは、システムにマウントされたドライブ(ネットワークドライブを含む)に対して機能しますが、ボリュームから別のドライブへの移動には使用しないでください。その場合、ファイルを宛先にコピーし、古いファイルを削除する必要があります。


最良の代替

Microsoft.VisualBasic.FileSystem.RenameMicrosoft.VisualBasic.FileIO.FileSystem.RenameFileは、Monoによって移植されていないため、他のオペレーティングシステムでは使用できない可能性があるため、それらを破棄します。

したがって、System.IO.File.MoveSystem.IO.FileInfo.MoveToが残っています。それらの間のSystem.IO.File.Moveは、FileInfoオブジェクトの状態を維持する必要がないため、オーバーヘッドが少なくなります。それ以外は同じように機能します...そのため、すでにFileInfoを使用している場合はSystem.IO.FileInfo.MoveToを使用し、そうでない場合はSystem.IO.File.Moveを使用します。

そして、System.IO.File.Moveは.NET!でファイルの名前を変更するための最良のオプションです(彼らは私たちに奇抜なAPIを提供しませんでした)。

お祝い!

76
Theraot