C/C++とC#のファイル共有モード
ずっとC/C++を使ってて、このごろC#も使っているのですが、C/C++とC#でファイルのオープンした後の挙動ががなんか違うぞ、という事に気づきました。
C/C++では他のアプリケーションで使用中のファイルを普通に開くことが出来たのに、C#ではオープン時エラーになります。
コード書いて試してみたら、C/C++とC#でデフォルトのファイル共有モードに相違がありました。なんてこったい(・o・)
環境はWindows/VisualStudioです。
試したコード
以下は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);
}
#include <fstream>
void write_cpp(const char* fname)
{
std::ofstream ofs(fname, std::ios::app);
ofs << "this is cpp stream" << std::endl;
}
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");
}
}
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++と同様に他のアプリケーションで使用しているファイルもエラーなくオープンできます。
Author And Source
この問題について(C/C++とC#のファイル共有モード), 我々は、より多くの情報をここで見つけました https://qiita.com/kurasho/items/bda04408d82de80cc6ad著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .