Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

ずっと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++と同様に他のアプリケーションで使用しているファイルもエラーなくオープンできます。

kurasho
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away