Discussion:
C#で ファイルを共有できるように開く法
(too old to reply)
Yukio Kishiue
2006-12-22 08:13:28 UTC
Permalink
$B$=$N8e!"JL$N(BWindows$B%"%W%j$,$3$N%U%!%$%k$r3+$/$H!"(B"Access denied" $B$H$J$C$F$7$^$$$^$9!#(B
$B!!$=$NJL$N%"%W%j$,(B FileShare.None ($B%G%U%)%k%H(B)$B$G%U%!%$%k$r3+(B
$B$3$&$H$7$F$$$k$N$G$O$J$$$G$7$g$&$+!)(B
$B%U%!%$%k$r6&M-$7$F3+$1$k$h$&$K$9$k$K$O$I$&$9$l$P$h$$$N$G$7$g$&$+!)(B
$B!!!VJL$N%"%W%j!W$rJQ99$G$-$k$N$G$"$l$P!$(BFileShare.Read $BEy$r;X(B
$BDj$9$l$P3+$1$k$O$:$G$9!#B?J,!$%I%-%e%a%s%H$N(B"$BDI2C$N%"%/%;%95v(B
$B2D(B"$B$NItJ,$b$3$N$3$H$r8@$C$F$$$k$N$@$H;W$$$^$9!#(B
--
$B4_>e9,@8(B ( ***@mail.gosei.co.jp )
Minori
2006-12-22 09:04:00 UTC
Permalink
岸上幸生 さん、回答ありがとうございます。
 「別のアプリ」を変更できるのであれば,FileShare.Read 等を指
定すれば開けるはずです。多分,ドキュメントの"追加のアクセス許
可"の部分もこのことを言っているのだと思います。
残念ながら、「別のアプリ」を変更することは出来ません。
 その別のアプリが FileShare.None (デフォルト)でファイルを開
こうとしているのではないでしょうか?
先に テキストエディタで、ファイルを読み取りモードで開いてから、「別のアプリ」
で開いてもエラーは 発生しないので、FileShare.None (デフォルト)では
ないと思います。

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

Minori
Takeshi SHIGIHARA
2006-12-22 12:41:48 UTC
Permalink
Post by Minori
先に テキストエディタで、ファイルを読み取りモードで開いてから、「別のアプリ」
で開いてもエラーは 発生しないので、FileShare.None (デフォルト)では
ないと思います。
たとえば、Windows付属のメモ帳をたくさん起動し、それぞれ同じファイルを
開くことができます。それぞれで編集し、保存すれば、最後に書いたもの
だけが有効。つまり、ファイルは読み取るときだけOPENし、即時にファイル
ハンドルを閉じてしまっているようです。

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

ファイルハンドルを開いたままにしてあれば、ファイルの取り扱いは
Win32 APIの配下にあるのですから、共有のフラグ状態は必ず反映される
はずです。
--
----- Takeshi SHIGIHARA
***@tka.att.ne.jp
***@po.jah.ne.jp -----
ブタも投げれば空を飛ぶ--RFC1925.
Minori
2006-12-24 07:27:00 UTC
Permalink
Takeshi SHIGIHARA さんこんにちは
Post by Takeshi SHIGIHARA
そのテキストエディタは、このような動作をしていませんか?
他に納得のいく説明がないので仰るとおりだと思います。

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

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

Minori
Takeshi SHIGIHARA
2006-12-25 01:26:28 UTC
Permalink
Post by Minori
Windows2003にはシャドーコピーという機能があるので、なにか方法が
あるのではと、思うのですが、、、、
えー、と、、邪道コピーなら思いつきます。
a) まず、アプリはファイルのコピーをソフトウェア的に作っておく
b) 元になったファイルの属性はReadOnlyにしてしまう
c) アプリはコピーされたファイルをOPENし、取り扱う
d) その他のプログラムは(ReadOnlyになっている)元のファイルを読み出せる
e) アプリがファイルを書くときにReadOnlyを取り外し、書き込む。
難点
(e)の時点で誰かがOPENの状態にしてあると、アプリは、やっぱり書けない
ことになってしまいます。また、その他のプログラムがReadOnlyファイルにも
書き込むことができてしまうようなプログラムだと(ReadOnlyを一時的に
外して書き込んでReadOnlyを戻すような操作をするプログラムだと)、内容の
同期が取れなくなってしまう問題は付きまといます。
--
----- Takeshi SHIGIHARA
***@tka.att.ne.jp
***@po.jah.ne.jp -----
うまい、早い、安い/2つだけ選べ--RFC1925.
kes
2006-12-25 04:54:04 UTC
Permalink
$B!!(Bkes $B$G$9!#(B

$B!!$^$:!"(BC# $B$G5-=R$7$?%W%m%0%i%`$NL\E*$***@3N$K$9$l$P$I$&$G$7$g$&$+!#(B
$B2?$r$7$?$$$N$+$,J,$+$i$J$$$H!"E*30$l$J2sEz$r$7$F$7$^$&2DG=@-$b$"$j$^$9$N$G!#(B

$B!!$5$F!"(BC# $B$G5-=R$7$?%W%m%0%i%`$,!">o$K%U%!%$%k$r3+$$$F$$$k>uBV$N$h$&$G$9$,!"(B
FileAccess.Read $B$G3+$$$F$$$k$H$$$&$3$H$O!"FI$_<h$k$@$1$H$$$&$3$H$G$9$h$M!#(B
$B$4$/>.$5$$%U%!%$%k$J$i$P!"%a%bD"$N$h$&$KA4$F%a%b%j$KFI$_9~$s$G$7$^$$!"(B
$B$5$C$5$H(B FileStream $B$r(B dispose $B$9$k!J%O%s%I%k$rJD$8$k!K$H$$$$$H;W$$$^$9$,!#(B

$B!!$^$?!"%7%c%I%&%3%T!<$H$$$&$*OC$,=P$F$-$^$7$?$,!"(B
$B$b$7$3$N%1!<%9$G%7%c%I%&%3%T!<$rMxMQ$9$k$H$7$F$b!"(B
$B$=$l$rM-8z$K$7$J$1$l$P$J$i$J$$$N$O62$i$/8eB3$N%W%m%0%i%`$G$9!#(B

$B!!(BC# $B$N%W%m%0%i%`$,=hM}$r$9$kCJ3,$G$"$l$P!"(B
$B3:Ev%U%!%$%k$r%3%T!<$7$F$+$i3+$/$@$1$G!"85$N%U%!%$%k$X$N%m%C%/$O2sHr$G$-$^$9!#(B
$B!J$3$l$NH/E87O$K4X$7$F$O!"(BTakeshi SHIGIHARA $BMM$,%U%)%m!<$5$l$F$$$^$9$M!K(B

$B!!$b$7!"8eB3$N%W%m%0%i%`$,%U%!%$%k$rFI$_<h$k$@$1$G$"$l$P!"(B
C# $B%W%m%0%i%`B&$G(B FileShare.Read $B$G3+$$$F$_$F$O$I$&$G$7$g$&$+!#(B
$B$3$N>l9g!"$$$o$f$k6&M-%m%C%/>uBV$H$J$k$N$G!"(B
$B8eB3%W%m%0%i%`$,(B FileShare.Read $B$r;H$C$F3+$/$J$i$&$^$/9T$/$H;W$$$^$9!#(B
--
kes
Minori
2006-12-28 02:20:01 UTC
Permalink
何をしたいのかが分からないと、的外れな回答をしてしまう可能性もありますので。
今までみなさんから頂いた回答をふまえて、整理してみました。

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

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

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

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

以上、よろしくお願いします。
Takeshi SHIGIHARA
2006-12-28 08:16:06 UTC
Permalink
とりあえず、ファイルが変更されたことを知るためには
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
***@tka.att.ne.jp
***@po.jah.ne.jp -----
うまい、早い、安い/2つだけ選べ--RFC1925.

Yuichiro Ochifuji
2006-12-23 15:21:47 UTC
Permalink
落藤です。
Post by Minori
 その別のアプリが FileShare.None (デフォルト)でファイルを開
こうとしているのではないでしょうか?
先に テキストエディタで、ファイルを読み取りモードで開いてから、「別のアプリ」
で開いてもエラーは 発生しないので、FileShare.None (デフォルト)では
ないと思います。
File.Share.Readなのでは?

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

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

違ってたらツッコミどうぞ。(^^;
--
############################################################
  落藤 勇一郎
############################################################
Loading...