2009-06-20 11 views
1

現在、私はXMLファイルを読み込むC#アプリケーションを持っています。しかし、このXMLファイルをwordで開き、アプリケーションが同じXMLファイルを読み込むと、IO例外が発生します。私がする必要があるのはファイルを読むことだけです。ここに小さなコードがあります。C#でWordで開いたXMLファイルを読み取れません

public Object Load() 
{ 
    try 
    { 
    using (FileStream fs = new FileStream(
     filePath, 
     FileMode.Open, 
     FileAccess.Read, 
     FileShare.ReadWrite)) // Also tried, FileShare.Read and gets the same exception 
    { 
     return ((FooObject) new XmlSerializer(typeof(FooObject)) 
       .Deserialize(fs)) as Object; 
    } 
    } 
    catch (Exception ex) 
    { 
    LogException(ex); 
    return null; 
    } 
} 
+0

私はFileShare.Readに変更しようとしていると、それは動作しません。 – arc1880

答えて

1

Wordは確実に書き込み用にファイルをロックするため、FileStreamが開かれません。 ReadWriteアクセスを要求していますが、これは失敗します。

でも、私はあなたが読み取りのためにそれを開くことができると信じて - ちょうどにあなたの行を変更:

using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) 

注FileShare.ReadWrite対FileShare.Read。私は単語が排他的アクセスのためにファイルを開くとは信じませんが、それはロックの書き込みです。

+0

私はこれを試して、私は同じ例外を取得します。 – arc1880

+0

Wordにファイルが排他的にロックされています。これを行うには、Wordで開く前にファイルを開く必要があります。そうでなければそれを読む方法はありません。 –

+0

ファイルがWordによって開かれている場合、ファイルのコピーを作成してからコピーを読み取ることはできますか?または、単語がファイルのコピーを防止しますか? – arc1880

0

wordがファイルを排他的に開いた場合は何もできません。

例外をキャッチし、アプリケーションを正常に動作させるためにWordを終了する必要がある可能性があることをユーザーに通知します。

編集

Wordが排他的にファイルを開けません - 他のコメンターからコードをチェックアウト - あなたはonky読み込むためのファイルを開くことを確認してください。

0

XmlSerializer.Deserialize()のMSDN Docsに基づいて、簡単なWinFormsアプリケーションを作成しました。同じFileStream引数を使用すると、Wordで既に開いていても、ファイルを開くときに問題はありませんでした。あなたは「filePathに」の値が何らかの形で間違っている可能性がありObject_Load()に次のようなものを追加しようとしてIEと思います:

if (!File.Exists(filePath)) 
{ 
    throw new FileNotFoundException("File does not exist", filePath); 
} 
関連する問題