気になった事を自由に書いてます。
      
そのファイルオープン大丈夫ですか?
ここ数年で次々と新しいプログラミング言語が生まれ、それに伴い開発環境も非常に
使いやすくなりました。ホント、昔と比べてずいぶん簡単になったと思います。
昔はハードやOSよりの言語でしたが、現在は抽象化が進みハードやOSの知識が浅くても
割と簡単にアプリケーションの作成ができるようになりました。

さて、OSの機能の1つであるファイル管理の中に排他制御というものがあります。
これはあるプログラムがファイルを使っている間、他のプログラムからファイル
アクセスできないようにする仕組みのことです。

当然ですが、今でもこの仕組みは存在します。
C#ではStreamReaderやStreamWriter、FileStreamを使ってファイル操作します。そのときの排他制御は・・・
・StreamReaderは「読み込み許可」
・StreamWriterは「書き込み許可」
・FileStreamは以下から選ぶことができます。
  「読み込み、書き込み許可」
  「読み込み許可」
  「書き込み許可」
  「読み込み、書き込み禁止」
  「削除許可」
  「子プロセスで継承」

この辺まで言うと、ピンとくる方がいらっしゃると思いますが^^;

排他制御関連でよく見かけるパターン(問題??)を2つほどご紹介します。
1)排他制御の指定を行わずにFileStreamを使う。
  排他制御を指定しない場合、直感的に読み書き許可と思ってしまいがちですが、
実はデフォルトは読み書き禁止です。
このことを知らずにいると、たまにファイルオープンに失敗する、なぜだろう?
ユーザがエディタ(排他機能ON)でファイルを操作してたのでは?と
実装ミスなのにユーザに疑いをかける事になるかもしれません。オソロシヤ

2)StreamReader 読み込みだけだから大丈夫!
  これはStreamReaderとStreamWriterが絡むときに見かけます。
たとえば、プログラムAはログをファイル出力。
プログラムBはファイルを読み込み画面に表示するビューアだったとします。
プログラムAはファイル出力するだけなのでStreamWriterを使用
プログラムBは読み込みだけだからStreamReaderを使用します。

このときログファイルを出力中にStreamReaderでオープンしようとすると例外が
発生します。その逆で、ファイルを読み込み画面へ反映している最中に、
ログファイルを出力しようとしても例外となります。
ビューアのせいでログが出力できない。となったら困りものですね。
サンプルプログラム
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace tp
{
    public partial class Form054 : Form
    {
        public Form054()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            using (StreamReader sr = new StreamReader(@"c:\tmp.txt"))
            {
                System.Threading.Thread.Sleep(2000);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            using (StreamWriter sr = new StreamWriter(@"c:\tmp.txt"))
            {
                System.Threading.Thread.Sleep(2000);
            }
        }
    }
}

      






Copyright (C) 2011 - 2017 猫の気ままなC#日記