From: Masaya TARUI Date: 2013-02-28T16:27:33+09:00 Subject: [ruby-list:49230] Re: PDF ファイルが Adobe Reader などで開かれているかを検知したい たるいです。 どうもflockからは見れない所でロックがかけれてるようで、pdfを開いてても排他ロックとれちゃいますね。 vista 以降ならちゃんと情報がとれる方法もある(http://nyaruru.hatenablog.com/entry/20070426/p1)ようですが、 簡単に調べるだけなら、 movable = open("a.pdf","ab"){true} rescue false という方法で逃げれると思います。 2013年2月28日 14:17 Takeshi Iogawa : > いおがわです。 > > 解決策でなくて申し訳ないのですが。 > これ、Ruby の問題でななくファイルの排他制御(ファイルロック・アンロック) > の問題ですよね? > > 例えばAdobe Reader で開いているファイルは、エクスプローラから > でも、cmd.exe上のmoveコマンドからでも移動に失敗すると思います。 > > UNIX系なら、flock() システムコールでしょうけど、Windowsの場合、 > WIN32API のなかにファイルのロック・アンロックのAPIが用意されて > いるようです(ざざっとぐぐったダケなので詳細はすみません) > > それから、仮にRuby にファイルのロック状態を確認するメソッドが > あったとしても > > (1) PDF ファイルのロック状態を確認 > (2) アンロック状態(mv OK) > (3) <-------- 誰か別のひと(or 別のアプリ)が当該PDFをロック > (4) mv → やっぱり失敗 > > というケースが発生しえます。 > > ということでロジックを見直したほうがよろしいかと。。。 > # 具体的な方法が示せなくてごめんなさい > > > > > > > > (2013/02/28 12:42), 5.5 wrote: >> 5.5 です。お世話になっております。 >> >> PDF ファイルを Adobe Reader で開いている場合,FileUtils.mv >> などで移動することができません。 >> ※Permission Denied と実行時エラーが出る。 >> >> そこで,事前にそういう状態であるかどうかを検知したいのです >> が,できますか? >> >> FileTest.writable? の類いは,パーミションを見ているようで, >> 上記の状態でも true が返ります。 >> >> >> 実際に mv してみて,例外が出たらその場合の処理を行う,とい >> う方法も考えられます。 >> しかし,同時に他のファイル操作も行いたいのです。 >> 複数のファイル操作の一つでも失敗したら全部を元に戻す,とい >> うロジックもあり得るでしょうが,避けたいところです。 >> >> 移動が可能かどうかを,移動を実行せずに知る手段はあるでしょ >> うか? >> >> OS は Windows です。 >> > > > -- > -- > Takeshi Iogawa > -- 樽家昌也(Masaya TARUI) No Tool,No Life.