Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

C#で ファイルを共有できるように開く法

977 views
Skip to first unread message

Minori

unread,
Dec 22, 2006, 12:56:03 AM12/22/06
to
C#で記述したプログラムから次の形でファイルを開いています。
FileStream fs = File.Open(fnm, FileMode.Open, FileAccess.Read,
FileShare.ReadWrite);

その後、別のWindowsアプリがこのファイルを開くと、"Access denied" となってしまいます。

ファイルを共有して開けるようにするにはどうすればよいのでしょうか?

また、ReadWrite の説明に "追加のアクセス許可" のことが書いてあります。
#ただし、このフラグが指定されていても、ファイルにアクセスするために追加のアクセス許可が
必要になることがあります。

"追加のアクセス許可" とはどの様なことなのでしょうか?

以上、よろしくお願いします。

環境
Visual Studio.Net 2003
MICROSOFT.NET FRAMEWORK 1.1
Windows2003

Yukio Kishiue

unread,
Dec 22, 2006, 3:13:28 AM12/22/06
to
"Minori" <Min...@discussions.microsoft.com> wrote in
message news:DE57F72B-49F8-409B...@microsoft.com ...

> その後、別のWindowsアプリがこのファイルを開くと、"Access denied" となってしまいます。

 その別のアプリが FileShare.None (デフォルト)でファイルを開
こうとしているのではないでしょうか?

> ファイルを共有して開けるようにするにはどうすればよいのでしょうか?

 「別のアプリ」を変更できるのであれば,FileShare.Read 等を指
定すれば開けるはずです。多分,ドキュメントの"追加のアクセス許
可"の部分もこのことを言っているのだと思います。
--
岸上幸生 ( ykis...@mail.gosei.co.jp )

Minori

unread,
Dec 22, 2006, 4:04:00 AM12/22/06
to
岸上幸生 さん、回答ありがとうございます。

>  「別のアプリ」を変更できるのであれば,FileShare.Read 等を指
> 定すれば開けるはずです。多分,ドキュメントの"追加のアクセス許
> 可"の部分もこのことを言っているのだと思います。

残念ながら、「別のアプリ」を変更することは出来ません。


>  その別のアプリが FileShare.None (デフォルト)でファイルを開
> こうとしているのではないでしょうか?
先に テキストエディタで、ファイルを読み取りモードで開いてから、「別のアプリ」
で開いてもエラーは 発生しないので、FileShare.None (デフォルト)では
ないと思います。

C#で開くときに、何か設定があるのでは?と思うのですが。

Minori

Takeshi SHIGIHARA

unread,
Dec 22, 2006, 7:41:48 AM12/22/06
to
Minori wrote:
> 先に テキストエディタで、ファイルを読み取りモードで開いてから、「別のアプリ」
> で開いてもエラーは 発生しないので、FileShare.None (デフォルト)では
> ないと思います。

たとえば、Windows付属のメモ帳をたくさん起動し、それぞれ同じファイルを
開くことができます。それぞれで編集し、保存すれば、最後に書いたもの
だけが有効。つまり、ファイルは読み取るときだけOPENし、即時にファイル
ハンドルを閉じてしまっているようです。

そのテキストエディタは、このような動作をしていませんか?

ファイルハンドルを開いたままにしてあれば、ファイルの取り扱いは
Win32 APIの配下にあるのですから、共有のフラグ状態は必ず反映される
はずです。

--
----- Takeshi SHIGIHARA
cyg...@tka.att.ne.jp
cyg...@po.jah.ne.jp -----
ブタも投げれば空を飛ぶ--RFC1925.

Yuichiro Ochifuji

unread,
Dec 23, 2006, 10:21:47 AM12/23/06
to
落藤です。

"Minori" wrote in message
news:4C9DC3B7-47BB-49C8...@microsoft.com

>>  その別のアプリが FileShare.None (デフォルト)でファイルを開
>> こうとしているのではないでしょうか?
> 先に テキストエディタで、ファイルを読み取りモードで開いてから、「別のアプリ」
>
> で開いてもエラーは 発生しないので、FileShare.None (デフォルト)では
> ないと思います。

File.Share.Readなのでは?

先にIO.FileAccess.ReadWriteで開いているアプリがあると
して、後のアプリがFile.Share.Readで開けてしまったら
破綻するのでは?

ヘルプには「後続の」と書いてあるが、どう読めばよいのか。。。

違ってたらツッコミどうぞ。(^^;

--
############################################################
  落藤 勇一郎
############################################################

Minori

unread,
Dec 24, 2006, 2:27:00 AM12/24/06
to
Takeshi SHIGIHARA さんこんにちは

> そのテキストエディタは、このような動作をしていませんか?
他に納得のいく説明がないので仰るとおりだと思います。

後続のWindowsアプリがファイルを開くときに、エラーを発生させないで
ファイルの中身を読み出すような方法は、無いでしょうか?

Windows2003にはシャドーコピーという機能があるので、なにか方法が
あるのではと、思うのですが、、、、

Minori

Takeshi SHIGIHARA

unread,
Dec 24, 2006, 8:26:28 PM12/24/06
to
Minori wrote:
> Windows2003にはシャドーコピーという機能があるので、なにか方法が
> あるのではと、思うのですが、、、、

えー、と、、邪道コピーなら思いつきます。
a) まず、アプリはファイルのコピーをソフトウェア的に作っておく
b) 元になったファイルの属性はReadOnlyにしてしまう
c) アプリはコピーされたファイルをOPENし、取り扱う
d) その他のプログラムは(ReadOnlyになっている)元のファイルを読み出せる
e) アプリがファイルを書くときにReadOnlyを取り外し、書き込む。
難点
(e)の時点で誰かがOPENの状態にしてあると、アプリは、やっぱり書けない
ことになってしまいます。また、その他のプログラムがReadOnlyファイルにも
書き込むことができてしまうようなプログラムだと(ReadOnlyを一時的に
外して書き込んでReadOnlyを戻すような操作をするプログラムだと)、内容の
同期が取れなくなってしまう問題は付きまといます。

--
----- Takeshi SHIGIHARA
cyg...@tka.att.ne.jp
cyg...@po.jah.ne.jp -----

うまい、早い、安い/2つだけ選べ--RFC1925.

kes

unread,
Dec 24, 2006, 11:54:04 PM12/24/06
to
 kes です。

 まず、C# で記述したプログラムの目的を明確にすればどうでしょうか。
何をしたいのかが分からないと、的外れな回答をしてしまう可能性もありますので。

 さて、C# で記述したプログラムが、常にファイルを開いている状態のようですが、
FileAccess.Read で開いているということは、読み取るだけということですよね。
ごく小さいファイルならば、メモ帳のように全てメモリに読み込んでしまい、
さっさと FileStream を dispose する(ハンドルを閉じる)といいと思いますが。

 また、シャドウコピーというお話が出てきましたが、
もしこのケースでシャドウコピーを利用するとしても、
それを有効にしなければならないのは恐らく後続のプログラムです。

 C# のプログラムが処理をする段階であれば、
該当ファイルをコピーしてから開くだけで、元のファイルへのロックは回避できます。
(これの発展系に関しては、Takeshi SHIGIHARA 様がフォローされていますね)

 もし、後続のプログラムがファイルを読み取るだけであれば、
C# プログラム側で FileShare.Read で開いてみてはどうでしょうか。
この場合、いわゆる共有ロック状態となるので、
後続プログラムが FileShare.Read を使って開くならうまく行くと思います。

--
kes

Minori

unread,
Dec 27, 2006, 9:20:01 PM12/27/06
to
> 何をしたいのかが分からないと、的外れな回答をしてしまう可能性もありますので。

今までみなさんから頂いた回答をふまえて、整理してみました。

市販のパッケージソフト: A があります。
Aは、任意のタイミングで 制御ファイル: F を "FileShare.None" で開き、更新します。
Aの動作を変更することは出来ません。

C#で作成中のソフト: C があります。
Cは、一定間隔で 制御ファイル: F の 内容が更新されていないか調べ変更された内容を別の場所に保存します。

Aがどのタイミングでファイルを開いても、エラーが発生しないように Cから ファイルの中身を知る方法は無いでしょうか?

コピー中に A がファイルを開いてもエラーが発生しないのなら F の複製でも構いません。

以上、よろしくお願いします。

Takeshi SHIGIHARA

unread,
Dec 28, 2006, 3:16:06 AM12/28/06
to
とりあえず、ファイルが変更されたことを知るためには
System.IO.FileSystemWatcher クラス
があります。
http://www.google.co.jp/search?hl=ja&q=FileSystemWatcher&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
などをご参考にしてください )
なお、このクラスが使用可能なプラットフォーム(OS)は限定されます。

また、これはファイルが変更された、ということだけが分かりますので
どのように内容が変更されたのかを知るには、やはり変更されたファイルを
コピーでもして、以前に取っておいたコピーと比べてみることになります
から、どうしても一瞬競合が生じる可能性はあります。
つまり根本的には解決できていませんが、何かのご参考になれば。

----- Takeshi SHIGIHARA
cyg...@tka.att.ne.jp
cyg...@po.jah.ne.jp -----

うまい、早い、安い/2つだけ選べ--RFC1925.

Minori

unread,
Jan 9, 2007, 8:23:01 PM1/9/07
to
回答ありがとうございました。

その後、いろいろな方法を調査、テストしてみましたが
どれも何かしら問題があり、すっきりした解決に至っていません。
元々の要望に無理があるので、致し方なしと言ったところです。

0 new messages