C/C++とC#のファイル共有モード


ずっとC/C++を使ってて、このごろC#も使っているのですが、C/C++とC#でファイルのオープンした後の挙動ががなんか違うぞ、という事に気づきました。
C/C++では他のアプリケーションで使用中のファイルを普通に開くことが出来たのに、C#ではオープン時エラーになります。
コード書いて試してみたら、C/C++とC#でデフォルトのファイル共有モードに相違がありました。なんてこったい(・o・)

環境はWindows/VisualStudioです。

試したコード

以下はC/C++/C#でテキストファイルに追加書き込みする簡単なコードです。
エラーは省略しています。

C
#include <stdio.h>

void write_c(const char* fname)
{
    FILE *fp;
    fopen_s(&fp, fname, "a+");
    fprintf(fp, "this is c file.\n");
    fclose(fp);
}
C++
#include <fstream>

void write_cpp(const char* fname)
{
    std::ofstream ofs(fname, std::ios::app);
    ofs << "this is cpp stream" << std::endl;
}

CとC++では使用中ファイルのオープンに成功して、書き込みも出来ます。

C#
static void write_sc(string fileName)
{
    using (StreamWriter sw = new StreamWriter(fileName, true))
    {
        sw.WriteLine("this is cs");
    }
}

C#では他のアプリケーションで使用しているファイルをオープンすると例外が発生します。

C#で共有モードを設定して、オープン時のエラーを回避する

C#
static void write(string fileName)
{
    using (FileStream fs = new FileStream(fileName, FileMode.Append, FileAccess.Write, FileShare.Write))
    using (StreamWriter sw = new StreamWriter(fs))
    {
        sw.WriteLine("this is cs");
    }
}

FileStreamコンストラクタの最後のパラメータのFileShare.Writeで書き込み共有を設定しています。これでC/C++と同様に他のアプリケーションで使用しているファイルもエラーなくオープンできます。