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

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

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

Re[1]: 他プロセスによるアクセスが禁止されたファイルの読み込み


(過去ログ 64 を表示中)

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

■37331 / inTopicNo.1)  他プロセスによるアクセスが禁止されたファイルの読み込み
  
□投稿者/ きょうこ (9回)-(2009/06/17(Wed) 14:17:41)

分類:[VB.NET/VB2005 以降] 

先日、『Excel(XMLスプレッドシート)の読み込み方について』にて、質問させていただきました。
http://bbs.wankuma.com/index.cgi?mode=one&namber=37063
その節は、ありがとうございました。

今回は、前回と同じプログラムの中で、発生したエラーについての質問です。
VB2005にて、Excelの文字を検索するプログラムです。
Excelのバージョンは2003です。

他のプロセスでアクセスが禁止されたファイルの読み込みについてです。
XMLスプレッドシートを、Excelでオープンしている状態で、以下のコードを実行すると、例外が発生します。

Dim doc As XmlDocument = New XmlDocument()
doc.Load(filename)  ←←←←←←ここで例外発生

(エラー内容)
System.IO.IOException がキャッチされました
  Message="別のプロセスで使用されているため、プロセスはファイル 'C:\ABC.xml' にアクセスできません。"

XmlDocumentは、読み書きが可能なので、お互いに掴み合うのがいけないのは分かりました。
今回の処理では、書き込みはありませんので、読み取り専用でも構いませんが、
XmlTextReaderでは、SelectNodesなどが使えないので、なるべく大幅な修正を避けたいところです。

一度、テキストファイルとしてStreamReaderなどで読み込めたら、
その内容をXmlDocumentに渡せるかと思ったのですが、やはり同じ例外が発生しました。

Excelで開かれた状態で、なおかつXMLの内容を読み取る方法はありますでしょうか。
よろしくお願いいたします。

引用返信 編集キー/
■37333 / inTopicNo.2)  Re[1]: 他プロセスによるアクセスが禁止されたファイルの読み込み
□投稿者/ aetos (171回)-(2009/06/17(Wed) 14:31:57)
aetos さんの Web サイト
No37331 (きょうこ さん) に返信
> 一度、テキストファイルとしてStreamReaderなどで読み込めたら、
> その内容をXmlDocumentに渡せるかと思ったのですが、やはり同じ例外が発生しました。

というのは、StreamReader のコンストラクタにファイル名を渡したところで例外が出ていたりします?
ファイル名を受け取る StreamReader のコンストラクタでは、読み取り専用で開くという指定ができないようですね。
File.OpenRead で得た Stream から StreamReader を作ってみてはどうでしょうか。

引用返信 編集キー/
■37334 / inTopicNo.3)  Re[2]: 他プロセスによるアクセスが禁止されたファイルの読み込み
□投稿者/ ぽぴ王子 (440回)-(2009/06/17(Wed) 14:34:36)
ぽぴ王子 さんの Web サイト
XmlDocument.Load メソッドは、ファイル名(String)を引数に取るほかに、ストリーム(Stream)や
TextReader クラスを引数に取るオーバーロードもあります。

XmlDocument.Load メソッド
http://msdn.microsoft.com/ja-jp/library/system.xml.xmldocument.load%28VS.80%29.aspx

なので、読み取り専用の Stream クラスを作成して、その Stream クラスを与えてあげれば読み込める
のではないかと思います。
Excel が開いたときにファイルを読み取りも不可にしていると難しいですが、Excel 2007 では開いた
状態でも読み取り専用であれば他のプロセスから開けるようでした。

と書いていたらaetosさんがもっと詳しく書いてくださっているようですね。


> 一度、テキストファイルとしてStreamReaderなどで読み込めたら、
> その内容をXmlDocumentに渡せるかと思ったのですが、やはり同じ例外が発生しました。

XmlDocument.LoadXml メソッドというものがあります。
詳しくは MSDN などで調べてみてください。

# まあ、Excel が開いてるときに開くんじゃねえよ!というのが正論ではあります。
# 自分もそれを指示します(つまり、Excelと同時に開くという仕様がマズい)
引用返信 編集キー/
■37335 / inTopicNo.4)  Re[1]: 他プロセスによるアクセスが禁止されたファイルの読み込み
□投稿者/ オショウ (237回)-(2009/06/17(Wed) 14:38:16)
> Excelで開かれた状態で、なおかつXMLの内容を読み取る方法はありますでしょうか。

  Excelがロックするので、無理でしょう・・・

  ロジックを変えてみては?
  どのファイルをExcelがロックしているか解らないならば
  エラーしたものがロックされていると仮定して、それをどこかにスタック(覚える)し
  次のファイル処理へ移行してみては?
  全て終わった後、スタックしたファイルがあれば、再度、実行してみるとか・・・

  ファイルの所有者やロック状態を取得するような機能を作っても、結果的には無駄だと
  思いますので・・・エラーしたら次のファイル処理への方が簡単・・・

以上


引用返信 編集キー/
■37336 / inTopicNo.5)  Re[3]: 他プロセスによるアクセスが禁止されたファイルの読み込み
□投稿者/ Hongliang (421回)-(2009/06/17(Wed) 14:39:29)
XmlDocument.Load(String) はそもそも読み取り専用で開きますが。XmlDocument への変更とファイルを同期するわけでもありませんからね。
Excel の場合ファイルは読み書き禁止で開くはずですから、Excel が開いてる間は手出ししようがないかと。
引用返信 編集キー/
■37338 / inTopicNo.6)  Re[1]: 他プロセスによるアクセスが禁止されたファイルの読み込み
□投稿者/ 魔界の仮面弁士 (1132回)-(2009/06/17(Wed) 14:43:38)
No37331 (きょうこ さん) に返信
> doc.Load(filename)  ←←←←←←ここで例外発生

Dim fs As New FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
doc.Load(fs)

としてみるとか。
引用返信 編集キー/
■37344 / inTopicNo.7)  Re[1]: 他プロセスによるアクセスが禁止されたファイルの読み込み
□投稿者/ きょうこ (10回)-(2009/06/17(Wed) 15:50:07)
オショウ様、aetos様、ぽぴ王子様、Hongliang様、魔界の仮面弁士様。
ありがとうございました。

今回は、魔界の仮面弁士様の方法で、無事に解決いたしました。


No37335 (オショウ さん) に返信
>   Excelがロックするので、無理でしょう・・・
私も無理だと思ったのですが、例えばメモ帳(NotePad)は通常通り開けますし、
他のエディタ(秀丸など)では、エラーメッセージの後、読み取り専用で開くなど、
全くアクセス出来ないわけではないことが分かりました。


No37333 (aetos さん) に返信
> というのは、StreamReader のコンストラクタにファイル名を渡したところで例外が出ていたりします?
はい、その通りです。

> ファイル名を受け取る StreamReader のコンストラクタでは、読み取り専用で開くという指定ができないようですね。
> File.OpenRead で得た Stream から StreamReader を作ってみてはどうでしょうか。
ファイルのオープン1つ取っても、様々な方法があるのですね。
大変、勉強になります。


No37334 (ぽぴ王子 さん) に返信
> Excel が開いたときにファイルを読み取りも不可にしていると難しいですが、Excel 2007 では開いた
> 状態でも読み取り専用であれば他のプロセスから開けるようでした。
はい、読み取り専用であれば、Excelで開いていても、他のプロセスから開くということは分かりました。
だったら、何らかの方法があるのだろうと思い、質問させていただきました。

> # まあ、Excel が開いてるときに開くんじゃねえよ!というのが正論ではあります。
> # 自分もそれを指示します(つまり、Excelと同時に開くという仕様がマズい)
は、はい。正直、そう思ったのです。
でも、実際の現場の作業の様子からして、そう言い放つのは厳しいものがありました・・。


No37336 (Hongliang さん) に返信
> XmlDocument.Load(String) はそもそも読み取り専用で開きますが。XmlDocument への変更とファイルを同期するわけでもありませんからね。
そうなのですか。失礼しました。
MSDNで、「XmlReader は、XML データのストリームへの前方向の読み取り専用アクセスを提供します。」
と書かれていたのを、逆に「XmlDocument.Loadは読み取り専用ではない」という解釈をしておりました。


No37338 (魔界の仮面弁士 さん) に返信
> Dim fs As New FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
> doc.Load(fs)
今回は、この方法で、エラーが発生しなくなりました。
Loadメソッドの引数に、Streamなどがあるのは見ていたのですが、コーディング方法が分からずに読み飛ばしておりました。

本当に、ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -