概要
指定のファイルを特定の場所にコピーする際のサンプルコードを記載しました。
コード
/// <summary>
/// 指定されたファイルを特定の場所にコピーする
/// </summary>
/// <param name="srcFilePath">コピーするファイルのパス</param>
/// <param name="outputDirPath">コピー先のフォルダまでのパス</param>
private void CopyFileToDirectory(string srcFilePath, string outputDirPath)
{
try
{
string fileName = Path.GetFileName(srcFilePath);
string outputPath = Path.Combine(outputDirPath, fileName); // ファイル名はコピー元と同様にする
while (true)
{
if (File.Exists(outputPath))
{
// 既にファイル名がある場合はリネームして再チェック
string extension = Path.GetExtension(fileName);
fileName = Path.GetFileNameWithoutExtension(fileName);
fileName += "_Copy" + extension;
outputPath = Path.Combine(outputDirPath, fileName);
continue;
}
break;
}
CopyFile(srcFilePath, outputPath);
}
catch (UnauthorizedAccessException)
{
// ログ出力等のエラーハンドル処理 (省略)
}
catch(Exception)
{
// ログ出力等のエラーハンドル処理 (省略)
}
}
/// <summary>
/// ファイルをコピーする
/// </summary>
/// <param name="fromPath">コピー元パス</param>
/// <param name="toPath">コピー先パス</param>
private void CopyFile(string fromPath, string toPath)
{
var file = new FileInfo(fromPath);
file.CopyTo(toPath, true);
}
補足
本コードでは、コピー先に同じファイル名がある場合にリネームする対応を行っています。
※同じファイル名が無くなるまで、ファイル名の末尾に「_Copy」という文字列を加えます。
注意点
UnauthorizedAccessException
はファイルやディレクトリへのアクセス権限がない場合や、ファイルが読み取り専用モードになっている場合などに発生します。
特定のフォルダのアクセス権が有効かどうか、アクセスする前にあらかじめプログラムで計算するのはいろいろな考慮点が必要で、またアクセス権自体ももしかしたらアクセスの計算時に変わってしまう可能性もあります。そのため、上記のコードのような場合でアクセス権を調べる方法は実際にアクションを実行して、UnauthorizedAccessException
がスローされた状況を処理する方法が安全らしいです。
終わりに
ファイルをコピーするだけでも同名ファイルやフォルダへのアクセス権など、注意すべきことがいくつかあることをしっかりと把握しておきたいと思いました。