配列&コレクション

[C#] Copyメソッドの使い方 – ファイルをコピーする方法

C#でファイルをコピーするには、System.IO.FileクラスCopyメソッドを使用します。

このメソッドは、指定したソースファイルを指定した宛先にコピーします。

基本的な使い方はFile.Copy(ソースファイルパス, 宛先ファイルパス)です。

既に宛先に同名のファイルが存在する場合、デフォルトでは例外が発生しますが、第三引数にtrueを指定することで上書きコピーが可能です。

File.Copyメソッドとは

C#のFile.Copyメソッドは、指定したファイルを別の場所にコピーするための便利な機能です。

このメソッドを使用することで、簡単にファイルのバックアップや移動を行うことができます。

File.Copyメソッドは、System.IO名前空間に含まれており、ファイルのパスを指定することで、元のファイルを新しい場所に複製します。

このメソッドは、コピー先に同名のファイルが存在する場合の挙動を制御するオプションも提供しています。

デフォルトでは、同名のファイルが存在する場合は例外が発生しますが、オプションを指定することで上書きすることも可能です。

これにより、ファイル操作を行う際の柔軟性が向上します。

File.Copyメソッドは、ファイルシステムを操作する際に非常に役立つツールです。

File.Copyメソッドの基本的な使い方

ファイルをコピーする基本的なコード例

以下のコードは、File.Copyメソッドを使用してファイルをコピーする基本的な例です。

元のファイルのパスとコピー先のパスを指定するだけで、簡単にファイルを複製できます。

using System;
using System.IO;
class Program
{
    static void Main()
    {
        // コピー元のファイルパス
        string sourceFile = @"C:\example\source.txt";
        // コピー先のファイルパス
        string destinationFile = @"C:\example\destination.txt";
        
        // ファイルをコピー
        File.Copy(sourceFile, destinationFile);
        
        Console.WriteLine("ファイルがコピーされました。");
    }
}
ファイルがコピーされました。

上書きコピーを行う方法

File.Copyメソッドでは、コピー先に同名のファイルが存在する場合、デフォルトでは例外が発生します。

しかし、overwrite引数をtrueに設定することで、上書きコピーを行うことができます。

以下のコード例を参照してください。

using System;
using System.IO;
class Program
{
    static void Main()
    {
        string sourceFile = @"C:\example\source.txt";
        string destinationFile = @"C:\example\destination.txt";
        
        // 上書きコピーを行う
        File.Copy(sourceFile, destinationFile, true);
        
        Console.WriteLine("ファイルが上書きコピーされました。");
    }
}
ファイルが上書きコピーされました。

コピー先にファイルが存在する場合の挙動

File.Copyメソッドを使用する際、コピー先に同名のファイルが存在する場合の挙動は以下の通りです。

状況挙動
同名のファイルが存在しないファイルが正常にコピーされる
同名のファイルが存在する例外が発生する(デフォルト)
同名のファイルが存在する(上書きオプションあり)ファイルが上書きされる

例外処理の実装方法

ファイルコピー時に発生する可能性のある例外を適切に処理するためには、try-catchブロックを使用します。

以下のコード例では、ファイルが存在しない場合やアクセス権がない場合の例外を処理しています。

using System;
using System.IO;
class Program
{
    static void Main()
    {
        string sourceFile = @"C:\example\source.txt";
        string destinationFile = @"C:\example\destination.txt";
        
        try
        {
            File.Copy(sourceFile, destinationFile);
            Console.WriteLine("ファイルがコピーされました。");
        }
        catch (FileNotFoundException ex)
        {
            Console.WriteLine("エラー: コピー元のファイルが見つかりません。");
        }
        catch (UnauthorizedAccessException ex)
        {
            Console.WriteLine("エラー: アクセス権がありません。");
        }
        catch (Exception ex)
        {
            Console.WriteLine("エラー: " + ex.Message);
        }
    }
}

出力結果(例外発生時):

エラー: コピー元のファイルが見つかりません。

File.Copyメソッドのオプション

上書きオプションの詳細

File.Copyメソッドには、コピー先に同名のファイルが存在する場合に上書きするかどうかを指定するオプションがあります。

このオプションは、メソッドの第3引数としてbool型の値を受け取ります。

trueを指定すると、同名のファイルが存在する場合に上書きされ、falseを指定すると、例外が発生します。

以下のコード例では、上書きオプションを使用したファイルコピーの実装を示しています。

using System;
using System.IO;
class Program
{
    static void Main()
    {
        string sourceFile = @"C:\example\source.txt";
        string destinationFile = @"C:\example\destination.txt";
        
        // 上書きオプションを指定してファイルをコピー
        File.Copy(sourceFile, destinationFile, true);
        
        Console.WriteLine("ファイルが上書きコピーされました。");
    }
}
ファイルが上書きコピーされました。

コピー時のファイル属性の保持

File.Copyメソッドは、ファイルの内容をコピーするだけでなく、ファイルの属性(例:読み取り専用、隠しファイルなど)を保持することはできません。

ファイル属性を保持したい場合は、File.Copyメソッドの後にFile.SetAttributesメソッドを使用して、元のファイルの属性をコピー先のファイルに適用する必要があります。

以下のコード例では、ファイル属性を保持する方法を示しています。

using System;
using System.IO;
class Program
{
    static void Main()
    {
        string sourceFile = @"C:\example\source.txt";
        string destinationFile = @"C:\example\destination.txt";
        
        // ファイルをコピー
        File.Copy(sourceFile, destinationFile);
        
        // 元のファイルの属性を取得
        FileAttributes attributes = File.GetAttributes(sourceFile);
        
        // コピー先のファイルに属性を設定
        File.SetAttributes(destinationFile, attributes);
        
        Console.WriteLine("ファイルがコピーされ、属性が保持されました。");
    }
}
ファイルがコピーされ、属性が保持されました。

コピー中のエラー処理

ファイルコピー中に発生する可能性のあるエラーを適切に処理することは、プログラムの安定性を保つために重要です。

File.Copyメソッドを使用する際には、try-catchブロックを用いて、さまざまな例外を捕捉することが推奨されます。

以下のコード例では、コピー中に発生する可能性のあるエラーを処理しています。

using System;
using System.IO;
class Program
{
    static void Main()
    {
        string sourceFile = @"C:\example\source.txt";
        string destinationFile = @"C:\example\destination.txt";
        
        try
        {
            // ファイルをコピー
            File.Copy(sourceFile, destinationFile, true);
            Console.WriteLine("ファイルがコピーされました。");
        }
        catch (IOException ex)
        {
            Console.WriteLine("エラー: 入出力エラーが発生しました。");
        }
        catch (UnauthorizedAccessException ex)
        {
            Console.WriteLine("エラー: アクセス権がありません。");
        }
        catch (Exception ex)
        {
            Console.WriteLine("エラー: " + ex.Message);
        }
    }
}

出力結果(例外発生時):

エラー: 入出力エラーが発生しました。

このように、適切なエラー処理を行うことで、ファイルコピーの際の問題を事前に防ぐことができます。

File.Copyメソッドの応用例

ディレクトリ内の複数ファイルをコピーする方法

複数のファイルを一度にコピーするには、Directory.GetFilesメソッドを使用して、指定したディレクトリ内のファイルを取得し、ループを使ってそれぞれのファイルをコピーします。

以下のコード例では、特定のディレクトリ内のすべてのテキストファイルを別のディレクトリにコピーしています。

using System;
using System.IO;
class Program
{
    static void Main()
    {
        string sourceDirectory = @"C:\example\source";
        string destinationDirectory = @"C:\example\destination";
        
        // コピー元のディレクトリ内のすべてのテキストファイルを取得
        string[] files = Directory.GetFiles(sourceDirectory, "*.txt");
        
        foreach (string file in files)
        {
            // ファイル名を取得
            string fileName = Path.GetFileName(file);
            // コピー先のファイルパスを作成
            string destinationFile = Path.Combine(destinationDirectory, fileName);
            
            // ファイルをコピー
            File.Copy(file, destinationFile, true);
        }
        
        Console.WriteLine("すべてのファイルがコピーされました。");
    }
}
すべてのファイルがコピーされました。

非同期でファイルをコピーする方法

C#では、非同期処理を行うためにasyncawaitを使用します。

File.Copyメソッド自体は非同期ではありませんが、FileStreamを使用して非同期にファイルをコピーすることができます。

以下のコード例では、非同期でファイルをコピーする方法を示しています。

using System;
using System.IO;
using System.Threading.Tasks;
class Program
{
    static async Task Main()
    {
        string sourceFile = @"C:\example\source.txt";
        string destinationFile = @"C:\example\destination.txt";
        
        using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open))
        using (FileStream destinationStream = new FileStream(destinationFile, FileMode.Create))
        {
            await sourceStream.CopyToAsync(destinationStream);
        }
        
        Console.WriteLine("ファイルが非同期でコピーされました。");
    }
}
ファイルが非同期でコピーされました。

ファイルのコピー進捗を表示する方法

ファイルをコピーする際に進捗状況を表示するには、FileStreamを使用してバッファを使った手動コピーを行い、コピーしたバイト数をカウントすることで進捗を表示できます。

以下のコード例では、進捗状況を表示しながらファイルをコピーしています。

using System;
using System.IO;
class Program
{
    static void Main()
    {
        string sourceFile = @"C:\example\source.txt";
        string destinationFile = @"C:\example\destination.txt";
        
        using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open))
        using (FileStream destinationStream = new FileStream(destinationFile, FileMode.Create))
        {
            byte[] buffer = new byte[1024]; // 1KBのバッファ
            int bytesRead;
            long totalBytes = sourceStream.Length;
            long totalBytesRead = 0;
            
            while ((bytesRead = sourceStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                destinationStream.Write(buffer, 0, bytesRead);
                totalBytesRead += bytesRead;
                
                // 進捗を表示
                Console.WriteLine($"進捗: {((double)totalBytesRead / totalBytes) * 100:F2}%");
            }
        }
        
        Console.WriteLine("ファイルがコピーされました。");
    }
}

出力結果(進捗表示):

進捗: 25.00%
進捗: 50.00%
進捗: 75.00%
進捗: 100.00%
ファイルがコピーされました。

ファイルのコピー前に確認ダイアログを表示する方法

ファイルをコピーする前にユーザーに確認を求めるダイアログを表示するには、MessageBoxを使用します。

以下のコード例では、ファイルをコピーする前に確認ダイアログを表示し、ユーザーの選択に応じてコピーを実行します。

using System;
using System.IO;
using System.Windows.Forms; // Windows Formsを使用
class Program
{
    [STAThread] // STAThread属性が必要
    static void Main()
    {
        string sourceFile = @"C:\example\source.txt";
        string destinationFile = @"C:\example\destination.txt";
        
        // 確認ダイアログを表示
        DialogResult result = MessageBox.Show("ファイルをコピーしますか?", "確認", MessageBoxButtons.YesNo);
        
        if (result == DialogResult.Yes)
        {
            File.Copy(sourceFile, destinationFile, true);
            Console.WriteLine("ファイルがコピーされました。");
        }
        else
        {
            Console.WriteLine("ファイルのコピーがキャンセルされました。");
        }
    }
}

出力結果(ユーザーの選択による):

ファイルがコピーされました。

または

ファイルのコピーがキャンセルされました。

このように、File.Copyメソッドを応用することで、さまざまなシナリオに対応したファイル操作が可能になります。

File.Copyメソッドと他のメソッドの比較

File.Moveメソッドとの違い

File.CopyメソッドFile.Moveメソッドは、どちらもファイルを操作するためのメソッドですが、主な違いはファイルの移動とコピーの違いにあります。

File.Copyは指定したファイルを新しい場所にコピーし、元のファイルはそのまま残ります。

一方、File.Moveは指定したファイルを新しい場所に移動し、元のファイルは削除されます。

以下のコード例でその違いを示します。

using System;
using System.IO;
class Program
{
    static void Main()
    {
        string sourceFile = @"C:\example\source.txt";
        string destinationFileCopy = @"C:\example\destination_copy.txt";
        string destinationFileMove = @"C:\example\destination_move.txt";
        
        // ファイルをコピー
        File.Copy(sourceFile, destinationFileCopy);
        Console.WriteLine("ファイルがコピーされました。");
        
        // ファイルを移動
        File.Move(sourceFile, destinationFileMove);
        Console.WriteLine("ファイルが移動されました。");
    }
}
ファイルがコピーされました。
ファイルが移動されました。

FileStreamを使った手動コピーとの違い

File.Copyメソッドは、ファイルを簡単にコピーするための高レベルのメソッドですが、FileStreamを使用した手動コピーは、より細かい制御が可能です。

FileStreamを使うことで、バッファサイズや進捗表示、エラー処理などをカスタマイズできます。

以下のコード例では、File.CopyFileStreamを使った手動コピーの違いを示します。

using System;
using System.IO;
class Program
{
    static void Main()
    {
        string sourceFile = @"C:\example\source.txt";
        string destinationFileCopy = @"C:\example\destination_copy.txt";
        string destinationFileStream = @"C:\example\destination_stream.txt";
        
        // File.Copyを使用したコピー
        File.Copy(sourceFile, destinationFileCopy);
        Console.WriteLine("File.Copyを使用してファイルがコピーされました。");
        
        // FileStreamを使用した手動コピー
        using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open))
        using (FileStream destinationStream = new FileStream(destinationFileStream, FileMode.Create))
        {
            sourceStream.CopyTo(destinationStream);
        }
        Console.WriteLine("FileStreamを使用してファイルがコピーされました。");
    }
}
File.Copyを使用してファイルがコピーされました。
FileStreamを使用してファイルがコピーされました。

File.CopyとDirectory.Copyの違い

File.Copyメソッドは単一のファイルをコピーするためのメソッドですが、Directory.Copyメソッドはディレクトリ全体をコピーするためのメソッドです。

Directory.Copyは、指定したディレクトリ内のすべてのファイルとサブディレクトリを再帰的にコピーします。

C#の標準ライブラリにはDirectory.Copyメソッドは存在しないため、独自に実装する必要があります。

以下のコード例では、File.Copyと独自に実装したDirectory.Copyの違いを示します。

using System;
using System.IO;
class Program
{
    static void Main()
    {
        string sourceDirectory = @"C:\example\sourceDir";
        string destinationDirectory = @"C:\example\destinationDir";
        
        // File.Copyを使用して単一ファイルをコピー
        string sourceFile = @"C:\example\sourceDir\file.txt";
        string destinationFile = @"C:\example\destinationDir\file.txt";
        File.Copy(sourceFile, destinationFile);
        Console.WriteLine("File.Copyを使用してファイルがコピーされました。");
        
        // Directory.Copyを使用してディレクトリをコピーする独自メソッド
        DirectoryCopy(sourceDirectory, destinationDirectory);
        Console.WriteLine("Directory.Copyを使用してディレクトリがコピーされました。");
    }
    static void DirectoryCopy(string sourceDir, string destDir)
    {
        Directory.CreateDirectory(destDir);
        foreach (string file in Directory.GetFiles(sourceDir))
        {
            string destFile = Path.Combine(destDir, Path.GetFileName(file));
            File.Copy(file, destFile, true);
        }
        foreach (string directory in Directory.GetDirectories(sourceDir))
        {
            string destDirectory = Path.Combine(destDir, Path.GetFileName(directory));
            DirectoryCopy(directory, destDirectory);
        }
    }
}
File.Copyを使用してファイルがコピーされました。
Directory.Copyを使用してディレクトリがコピーされました。

このように、File.Copyメソッドは単一ファイルのコピーに特化しており、他のメソッドと組み合わせることで、さまざまなファイル操作を実現できます。

まとめ

この記事では、C#のFile.Copyメソッドを中心に、ファイルコピーの基本的な使い方やオプション、応用例、他のメソッドとの比較について詳しく解説しました。

特に、上書きコピーやエラー処理、非同期コピーの方法など、実践的なテクニックを紹介しました。

これらの知識を活用することで、ファイル操作をより効率的に行うことができるでしょう。

ぜひ、実際のプロジェクトでこれらのテクニックを試してみてください。

関連記事

Back to top button