DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ファイル読み込みで

環境/言語:[WinXPPRO/VS2003PRO/C#]
分類:[.NET]

皆様はじめまして

Winアプリでファイルを読み込んで表示させるだけのプログラムを作って、
表示させるまではできました。
しかし、表示させたいと思っているファイルなのですが、
「そのファイルは別のプロセスが使用中です」となり、
表示させることができません。

ロックされているファイルを表示させるには、
どのようにしたらよいでしょうか?

現在は、StreamReaderだけを使って読み込んでいます。

よろしくお願いします。
ロックと一言でいっても、完全にロック・読み取りは許す共有ロックとか
色々種類があります。
そのファイルが、「完全に読み書き許さないモード」で別のプロセス
が使っていたら、その間はどうやっても読み出しはできないです。
それができたらOSのバグってことです。(^^;
読みたいファイルはIISのログなんですが、
当日のログをメモ帳でも開けるし、秀丸やTeraPADでも開けるので
プログラムからでも、開けるかなと思いました。
秀丸で開けているIISのログなら開けそうですねぇ。

なら、こちら(読み出し側)の開き方が悪い?
開くとき(=Stremをnewする時)の指定か何かでは?
string logFile = @"C:\WINDOWS\system32\Logfiles\W3SVC1\ex040226.log";
StreamReader sr = new StreamReader(logFile);
textBox1.Text = sr.ReadToEnd().Replace("\0","");
sr.Close();

と、記述していて、StreamReaderのぶぶんで、エラーになります。
まず問題を切り分けないと。

そのフォルダにファイルおいてそれが読めるか。
 失敗の場合→アカウントのアクセス権とかはOK?
       アセンブリの信頼はOK?
読める場合はIISに関係しているってことになるかな。
で、どういうエラーが出るんでしょう?

ゴメン、もう帰るわ。即レスできんので。。。
(丁寧に書いたら、きっと誰か教えてくれると思う)
一応、同じディレクトリにあるファイルは、開けます

すいませんが、「アセンブリの信頼」とは何でしょうか?

エラーメッセージは
「プロセスはファイル "C:\WINDOWS\system32\Logfiles\W3SVC1\ex040226.log" にアクセスできません。このファイルは別のプロセスが使用中です。」と表示されます。
同じディレクトリにあるファイルが開けるなら、権限とかは関係なさそうだね。

> Winアプリでファイルを読み込んで表示させるだけのプログラムを作って、
> 表示させるまではできました。
> しかし、表示させたいと思っているファイルなのですが、
> 「そのファイルは別のプロセスが使用中です」となり、
> 表示させることができません。

これってなんか日本語おかしくない?
表示できる、できてないが矛盾してるような。。。

別のプロセスってもしかして他ならぬ自プロセスって感じがするんだけど。
mainだけに先のコード書いて、それでもダメ?
それとも一日たって再起動したら再現しなくなったとか?
もっとイージーミスなら秀丸でずっと排他で開いていたとか。(^^;あるよねタマに。
で、ダメならIISのサービス停止の状態でもやっぱり開けない?
開きたいファイルは、どのエディタでも開かないで、やってみました。
あと、書き方ですがわかりづらくてすいません。

IISのログで毎日できるので、当日のファイルを開くときに
開けないというエラーがでてしまいました。

一応、エラーがでるファイルは、IISを止めると開けます。
■No2775に返信(k3nさんの記事)

> 開きたいファイルは、どのエディタでも開かないで、やってみました。
> あと、書き方ですがわかりづらくてすいません。
>
> IISのログで毎日できるので、当日のファイルを開くときに
> 開けないというエラーがでてしまいました。
>
> 一応、エラーがでるファイルは、IISを止めると開けます。
>

IIS上で他の誰かが使っているとか、
IIS経由で他のアプリケーションが使っている、
といったことはないのでしょうか?
毎日開いていて、その日だけ開けないというのは、
どういう意味ですか? 開ける日もあるということでしょうか?
  • 題名: Re[11]: ファイル読み込みで
  • 著者: 通りすがり
  • 日時: 2004/02/28 18:56:20
  • ID: 2784
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No2777に返信(少し暇な人さんの記事)
ヘルプより。最下行に注目。関係ないかな?

---------
ResourceManager クラスを使用すると、実行時に、適切なカルチャのリソースへ簡単にアクセスできます。ResourceManager は、特定のルート名を持つ共通のソースからの複数のリソースを管理します。複数のクラス コンストラクタによって、さまざまなシナリオがサポートされます。たとえば、アセンブリからリソースを取得したり、リソース ファイルからリソースを取得したりできます。また、別の静的メソッドを使用することにより、イメージのようなスタンドアロンのリソース ファイルからリソースを取得することもできます。既定の実装は、すべてのリソース名を読み込んだ後、要求に応じて値を読み込み、それらを後で使用できるように格納します。この方法では、すべてのリソースが読み込まれるわけではないため、ResourceSet クラス (このセクションで後述) よりもメモリ消費量が少なくてすみます。ただし、特定のリソースを最初に取得するときには時間がかかることがあります。さらに、既定の ResourceManager 実装では、オブジェクトのシリアル化がサポートされます。最後に、ResourceManager オブジェクトには、ローカライズされた特定のリソースが用意されていない場合に、地域に依存しないニュートラル カルチャのフォールバック リソースを検索する機能が用意されています。

ResourceReader を使用してリソースを列挙する単純な機構については、既に説明しました。今度は、ほぼ同じことを強力な ResourceManager を使用して行います。

リスト 4a.ResourceManager による名前付きリソースの処理 (ResWrite.cs)

...
ResourceManager rm = ResourceManager.
CreateFileBasedResourceManager("foo", ".", null);
Console.WriteLine(rm.GetString("test1"));
Console.WriteLine(rm.GetString("test2"));
Console.WriteLine(rm.GetString("test3"));
Console.WriteLine(rm.GetString("test4"));
Console.WriteLine(rm.GetObject("test5").ToString());
...
リスト 4b.ResourceManager による名前付きリソースの処理 (ResWrite.vb)

...
Dim rm As ResourceManager = ResourceManager.
CreateFileBasedResourceManager ("foo", ".", Nothing)
Console.WriteLine(rm.GetString("test1"))
Console.WriteLine(rm.GetString("test2"))
Console.WriteLine(rm.GetString("test3"))
Console.WriteLine(rm.GetString("test4"))
Console.WriteLine(rm.GetObject("test5").ToString())
...
まず、静的な CreateFileBasedResourceManager メソッドが使われていることに気付きます。このメソッドは、ファイル、場所、および既定以外の ResourceSet を使用するかどうかを指定する 3 つの引数を受け取ります。このコードは、場所がアプリケーションの基本ディレクトリ (AppBase) であることを想定しています。次に気付くのは、ResourceManager クラスの GetString メソッドを使用して文字列リソースを簡単に取得できることです。

GetObject メソッドを使用すると、イメージ リソースを取得することもできます。前の例はリソースの名前の値を書き込むだけでしたが、次の 2 行のコード (Graphic.cs サンプル ファイルから引用) では、GetObject メソッドを使用してグラフィック イメージを取得および表示する方法を示します。

rm = new ResourceManager("Images", this.GetType().Assembly);
pictureBox1.Image = (System.Drawing.Image)rm.GetObject("flag");
Graphic.vb サンプル ファイルから、Visual Basic で同じ処理を行うコードを次に示します。

rm = New ResourceManager("Images", Me.GetType().Assembly)
pictureBox1.Image = CType(rm.GetObject("flag"), System.Drawing.Image)
この 2 つのステートメントは、Images リソース ファイルから flag という名前のオブジェクトを読み込み、それを Image 型にキャストし、結果をピクチャ ボックスの Image プロパティに割り当てます。もちろん、実際に読み込まれるイメージは使用中のカルチャによって異なります。ニュートラル カルチャ リソースの場合は、コンパイル オプションで指定された場所からリソースが取得されます。リソースを指定するコンパイラ オプションを次に示します。

.../res:Images.resources,Images.resources...
この特定のサンプルでは、コンパイラ オプションによって Un.jpg ファイルが埋め込まれます。ほかのカルチャの場合は、ビルド処理の実行中に、ビットマップが対応するサテライト アセンブリに埋め込まれます。

ResourceManager は、シリアル化できる任意のデータに対して使用できます。言い換えると、Serializable 属性でマークされ、ISerializable インターフェイスをサポートするクラスに対して機能します。組み込み型には、Image 型 (および Bitmap、Icon、Cursor、Metafile の各派生型) と文字列型があります。ResourceManager では文字列パラメータの大文字と小文字が区別されるため、リソース ファイル名とリソース キーもすべて大文字と小文字が区別されます。

ファイルは、サブディレクトリまたは .resources ファイルに格納するか、アセンブリにパッケージ化できます。アセンブリ内のリソースを見つけるため、ResourceManager は、実行中のアセンブリの名前を受け取り、".resources" およびアセンブリの "メジャー.マイナ" バージョン番号を追加し、現在のロケールを追加し、現在実行中のアセンブリの署名キー ハッシュを追加して、このアセンブリを見つけるようにアセンブリ キャッシュに指示します。アセンブリ キャッシュのバインド要求をトレースする便利なツールについては、「付録 B : リソース ツール」のアセンブリ バインディング ログ ビューア (FusLogVW) に関するドキュメントを参照してください。

メモ 個々のファイルとして存在するスタンドアロンのリソースを実装すると、Web アプリケーションの実行中に Microsoft Internet Information Services (IIS) にるファイルのロックが発生することがあります。この場合、アプリケーションの実行中はリソース ファイルを更新できなくなります。この問題への対策として、アプリケーションの \bin サブディレクトリ内のサテライト アセンブリにリソースを格納すると、以降の Web 要求を処理するために新しいアプリケーション ドメインが作成されるとき、IIS のシャドウ コピー機構によって新しいリソースが自動的に読み込まれます。

DOBON.NET | プログラミング道 | プログラミング掲示板