locked
開いているOfficeファイルを読み取りたい RRS feed

  • 質問

  • お世話になっております。

    表題の通り、開いているOfficeファイルを読み取りたいと思っております。

     

     

    FileInfo info;

    FileStream fileStream = info.OpenRead()

    この場合、たいていのファイルは読み取れるのですが、Officeファイルに限り『"別のプロセスで使用されているため、プロセスはファイル '***.docx' にアクセスできません。

     

    FileStream fileStream = info.Open(FileMode.Open, FileAccess.Read, FileShare.Read)

     

    この場合、いかなるファイルでも『ファイル操作は許可されていません。パス '***' へのアクセスは拒否されました。』

     

     

    となります。

    自分としては普通に読み取ってくれさえすればいいのですが。


    2011年7月25日 5:36

回答

  • K.Oumiさん:
     FileMode.Create ですが、truncate されませんか?というか、そう書いてあるのですが。

    FileMode 列挙体

    オペレーティング システムが新しいファイルを作成することを指定します。ファイルが既に存在する場合は上書きされます。この操作には FileIOPermissionAccess.Write が必要です。System.IO.FileMode.Create は、ファイルが存在しない場合は CreateNew を使用した要求、ファイルが存在する場合は Truncate を使用した要求と等価です。ファイルが既に存在していても、隠しファイルの場合は UnauthorizedAccessException がスローされます。


    Tetsu1224さん:
     残念ながら、Office アプリケーションは特殊で、他のプロセスにファイルを開かせないようにして、ファイルを開いています。FileShare 列挙体には None という値があり、これを指定すると、「現在のファイルの共有を解除します。ファイルを閉じるまで、このプロセスまたは別のプロセスがファイルを開く要求をしても失敗します。」これに相当する Win32 での値を見つけられないのですが…あ、いや、違うわ。FILE_SHARE_何とかを探すから見つからなかったのか。CreateFile の dwShareMode の説明に、「0 を指定すると、オブジェクトを共有できません。このハンドルを閉じない限り、それ以降にこのオブジェクトを開こうとしても失敗します。」と書かれています。おそらくこれが使われているので、他のプロセスが開くことは出来ません。


    Jitta@わんくま同盟
    • 回答としてマーク Tetsu1224 2011年8月2日 2:49
    2011年7月27日 12:04

すべての返信

  • こんにちは。

    FileShare.ReadWrite

    でいけると思います。

     

    ってあれ・・・Silverlight でできるんだろうか・・・


    K.Oumi
    • 編集済み K.Oumi 2011年7月26日 4:40 あれ
    2011年7月26日 4:39
  • こんにちは

     

    ちょっとやってみました。

     

    Silverlight 4だとこんな感じでできるみたいですね。

     

            Dim d As New OpenFileDialog
            d.ShowDialog()

            Using fs As FileStream = d.File.Open(FileMode.Create)

                Dim x = fs.CanRead

            End Using

    FileModeがReadだとCanReadはFalseになります。

     

    ※ ブラウザ外実行で権限を昇格してやらないとだめでした。

     


    K.Oumi
    2011年7月26日 5:24
  • ありがとうございます。

     

    >FileShare.ReadWrite

     

    変わりませんでした。『ファイル操作は許可されていません。パス '***' へのアクセスは拒否されました。』

    2011年7月27日 1:39
  • ありがとうございます。

    >File.Open(FileMode.Create)

     

    変わりませんでした。『ファイル操作は許可されていません。パス '***' へのアクセスは拒否されました。』

     

    2011年7月27日 1:43
  • こんにちは。

     

    おかしいですね。

    僕のところでは、開いているWORDのファイルへのアクセスできるんですが。

    ちなみに、どのような環境・状況で起きているでしょうか?


    K.Oumi
    2011年7月27日 10:29
  • K.Oumiさん:
     FileMode.Create ですが、truncate されませんか?というか、そう書いてあるのですが。

    FileMode 列挙体

    オペレーティング システムが新しいファイルを作成することを指定します。ファイルが既に存在する場合は上書きされます。この操作には FileIOPermissionAccess.Write が必要です。System.IO.FileMode.Create は、ファイルが存在しない場合は CreateNew を使用した要求、ファイルが存在する場合は Truncate を使用した要求と等価です。ファイルが既に存在していても、隠しファイルの場合は UnauthorizedAccessException がスローされます。


    Tetsu1224さん:
     残念ながら、Office アプリケーションは特殊で、他のプロセスにファイルを開かせないようにして、ファイルを開いています。FileShare 列挙体には None という値があり、これを指定すると、「現在のファイルの共有を解除します。ファイルを閉じるまで、このプロセスまたは別のプロセスがファイルを開く要求をしても失敗します。」これに相当する Win32 での値を見つけられないのですが…あ、いや、違うわ。FILE_SHARE_何とかを探すから見つからなかったのか。CreateFile の dwShareMode の説明に、「0 を指定すると、オブジェクトを共有できません。このハンドルを閉じない限り、それ以降にこのオブジェクトを開こうとしても失敗します。」と書かれています。おそらくこれが使われているので、他のプロセスが開くことは出来ません。


    Jitta@わんくま同盟
    • 回答としてマーク Tetsu1224 2011年8月2日 2:49
    2011年7月27日 12:04
  • あれ。truncateされますか?

    開けるんだけどなぁ・・・開くとこまでは、まず消えたりしないんですよ。

    その先は、まだ試していませんが、OOXMLだと面倒で・・・

    開いて読むだけなら大丈夫で、更新操作しないかぎり平気だろうという勝手な期待をしていました(^^;

     

     


    K.Oumi
    2011年7月28日 1:29
  • Jittaさん、K.Oumiさん

    ご返答ありがとうございます。

     

    できない、ということが分かりましたのでこのスレッドは終了させていただきます。

    2011年8月2日 2:51