2012年8月16日木曜日

c#でファイルのコピー(Fileクラス,FileInfoクラス、FileStreamクラス)

今回はファイルのコピー方法を確認。

ファイルをコピーする方法はいくつかあるようで、FileクラスとFileInfoクラスを使ってコピーするのが一般的なのでしょうか?

ネットで探すと大体このふたつの記事に行き着きますね。
そこで、このふたつのクラスを使ったファイルのコピー方法と、
FileStreamを使ったコピー方法のまとめ。

FileStreamを使ってコピーすることは、あまりないのかもしれません。
あくまで、FileStreamの使い方の勉強ってことで。


■ファイルのコピー(Fileクラス)

FileクラスのCopyメソッドを利用したコピー方法は、パラメータで
「コピー元のファイル/コピー先のファイル/上書き可or不可」を指定する。

static void Main(string[] args)
{
    string sourceFileName = @"e:\sample.txt";
    string destFileName = @"e:\sample_copy.txt";
    bool overwrite = true;

    File.Copy(sourceFileName, destFileName, overwrite);
}



■ファイルのコピー(FileInfoクラス)

Fileクラスでのコピー方法と違う部分は、一度インスタンスを生成してからメソッドを利用する点。
コンストラクタのパラメータで「コピー元のファイル」を指定し、
CopyTOメソッドのパラメータで「コピー先ファイル」と「ファイルの上書き可or不可」を指定する。

ちなみに、msdnでFileInfoクラスの解説部分を読むと、
「オブジェクトを使いまわす場合はFileクラスの静的メソッドのかわりにFileInfoのインスタンスメソッドを使用することを検討してください。」と書いてある。

理由は、FileInfoのインスタンスメソッドを使用すると、必ずしもセキュリティチェックが必要でなくなるから。だそうです。

ということは、Fileクラスを利用する場合は毎回チェックされるということなのかな?
処理が重くなるのか?不明です。

static void Main(string[] args)
{
    string sourceFileName = @"e:\sample.txt";            
    string destFileName = @"e:\sample_copy.txt";
    bool overwrite = true;

    FileInfo fileInfo = new FileInfo(sourceFileName);
    fileInfo.CopyTo(destFileName, overwrite);
}


■ファイルのコピー(FileStreamクラス)

最後にFileStreamでコピーする方法。上の二つを見たら、これを使うことはないでしょうね。

ちなみに、msdnでFileStream.Read メソッドのページを見ると。
戻り値の部分の説明文では、「ストリームの末尾に到達した場合は 0 になることがあります。」とあいまいな感じなのに、解説の部分では、「ストリームの末尾に到達した後に必ず 0 を返します。」とキッパリ言ってる。どっちなの?

ちゃんと英語読めるようになれってことですね(笑)

static void Main(string[] args)
{
    string sourceFileName = @"e:\sample.txt";
    string destFileName = @"e:\sample_copy.txt";
    byte[] buffer = new byte[256];
    int readCount = 0;

    using (FileStream fsSource = new FileStream(sourceFileName, FileMode.Open))
    {
        using (FileStream fsDest = new FileStream(destFileName, FileMode.Create))
        {
            while((readCount = fsSource.Read(buffer, 0, buffer.Length)) != 0)
            {
                fsDest.Write(buffer, 0, readCount);
            }
        }
    }
}