C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: WinIOErrorが発生する


(過去ログ 106 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■63072 / inTopicNo.1)  WinIOErrorが発生する
  
□投稿者/ ケント (1回)-(2011/11/18(Fri) 14:26:30)

分類:[C#] 

環境は Windows Server 2003 + .NET Framework 3.5 + C#です。

ふたつのプロセスから同じファイルにアクセスするプログラムを作成しています。
片方のプロセスは頻繁に書き込みを行います。
もう片方のプロセスは頻繁に読み込みを行います。
非同期です。
当然、ファイルロックの問題があるので、FileShareの指定をしています。

簡単なサンプルを作ってみて、同時アクセスによるExceptionが発生しないことは確認しています。

しかし、実際にふたつのプロセスからアクセスしてみると、以下のエラーが発生します。

「別のプロセスで使用されているため、プロセスはファイル 'path\to\hoge.txt' にアクセスできません。」

何か、FileShareの設定の間違いがあるでしょうか。
また、他の原因でこのようなエラーが発生することがあるでしょうか。


【Stack Traceの一部(書き込み側)】
場所 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
場所 System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
場所 System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)

【書き込み側】
FileStream fs = new FileStream(filepath, FileMode.Create, FileAccess.ReadWrite, FileShare.Read);
StreamWriter sw = new StreamWriter(fs, Encoding.GetEncoding("Shift_JIS"));

【読み込み側】
FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader sr = new StreamReader(fs, Encoding.GetEncoding("Shift_JIS"));

引用返信 編集キー/
■63073 / inTopicNo.2)  Re[1]: WinIOErrorが発生する
□投稿者/ Hongliang (816回)-(2011/11/18(Fri) 14:34:44)
書き込み側は後続のアクセスに対し FileShare.Read、つまり読み込みのみ認めています。
書き込み側がこの状態でファイル使用中に読み込み側が開こうとします。
読み込み側は自分は FileAccess.Read ですから書き込み側の FileShare.Read には矛盾しませんが、自身は読み取りのみ認められているのにも関わらず後続のアクセスに対し FileShare.ReadWrite を認めようとしています。
書き込みできる権限は持たないので失敗します。
引用返信 編集キー/
■63075 / inTopicNo.3)  Re[2]: WinIOErrorが発生する
□投稿者/ Hongliang (817回)-(2011/11/18(Fri) 15:00:26)
あ、すいませんさっきのは無しで。
// どうも FileShare の動きが掴めない……。
引用返信 編集キー/
■63076 / inTopicNo.4)  Re[1]: WinIOErrorが発生する
□投稿者/ shu (1097回)-(2011/11/18(Fri) 15:18:01)
No63072 (ケント さん) に返信

> FileStream fs = new FileStream(filepath, FileMode.Create, FileAccess.ReadWrite, FileShare.Read);

FileMode.Createはファイルサイズを0にするから読んでいたら無理なんじゃないかな。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -