System.IO.File
または別の.NET
クラスを使用して、ファイルの名前を変更する最良の方法は何ですか?
ローカルドライブまたはネットワーク上の場所にあるファイルの名前を変更できるようにしたい。
System.IO.File
を使用している場合、Move
が最善の方法ですか?
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.Rename
とSystem.IO.File.Move
はどちらも同等であり、kernel32
から MoveFile
の周りのパラメーターチェック、権限チェック、エラー処理を行います。
Microsoft.VisualBasic.FileIO.FileSystem.RenameFile
に関しては、フルパスと新しい名前を指定して同じフォルダー内のファイルの名前を変更し(宛先パスを作成するために上記で示したものと同様)、kernel32
からMoveFile
にフォールバックします。
同様に、System.IO.FileInfo.MoveTo
はkernel32
からMoveFile
を呼び出します。
注2:MonoからMicrosoft.VisualBasic
が見つからないことにも注意する必要があります。つまり、System.IO.File.Move
とSystem.IO.FileInfo.MoveTo
のみが移植可能なオプションです。
上記のように、これらのメソッドはすべてkernel32
からMoveFile
にフォールバックします。 MoveFile
は、システムにマウントされたドライブ(ネットワークドライブを含む)に対して機能しますが、ボリュームから別のドライブへの移動には使用しないでください。その場合、ファイルを宛先にコピーし、古いファイルを削除する必要があります。
Microsoft.VisualBasic.FileSystem.Rename
とMicrosoft.VisualBasic.FileIO.FileSystem.RenameFile
は、Monoによって移植されていないため、他のオペレーティングシステムでは使用できない可能性があるため、それらを破棄します。
したがって、System.IO.File.Move
とSystem.IO.FileInfo.MoveTo
が残っています。それらの間のSystem.IO.File.Move
は、FileInfo
オブジェクトの状態を維持する必要がないため、オーバーヘッドが少なくなります。それ以外は同じように機能します...そのため、すでにFileInfo
を使用している場合はSystem.IO.FileInfo.MoveTo
を使用し、そうでない場合はSystem.IO.File.Move
を使用します。
そして、System.IO.File.Move
は.NET!でファイルの名前を変更するための最良のオプションです(彼らは私たちに奇抜なAPIを提供しませんでした)。
お祝い!