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

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

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

Re[2]: PDFファイルコピーの際の例外処理について


(過去ログ 103 を表示中)

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

■61423 / inTopicNo.1)  PDFファイルコピーの際の例外処理について
  
□投稿者/ ウェッチュ (1回)-(2011/08/12(Fri) 11:38:28)

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

Dim sr As System.IO.StreamReader    '例外チェック

            Try
                sr = System.IO.File.OpenText(フルパス)
                sr.Close()
            Catch ex As System.IO.IOException
                MessageBox.Show(System.IO.Path.GetFileName(フルパス) & "は既に別のプロセスで起動しています。" & vbNewLine & "別のプロセスを終了させてから再実行してください。")
                ErrLog(I) = 5
                Exit Function
            Finally
                If Not (sr Is Nothing) Then
                    sr.Close()
                End If
            End Try

◆開発環境:Windows7 64Bit, VisualBasic2008EE

既存のPDFファイルをSystem.IO.File.Copyメゾットを用いて別名でコピーするプログラムを作成しています。
コピーする際、コピー元のファイルが開かれていないかを、上記のコードを用いて例外処理したいのですが上手く行きません。
試しに例外処理のコードを全てコメントアウトし、コピー元ファイルを開きながらデバックしてみましたが、そもそもエラーが検出されません。
同様のコードを用いてExcelファイルをコピーしようとすると、きちんとエラーが検出され、例外処理も上手く行きます。

試しにローカル上で内容に「元」と書かれたPDFを作成し、これを開きながら、内容に「新」と書かれた同名のPDFファイルを上書きコピーしてみました。
エラーは出ず上書き出来、一度、開かれていたPDFファイルを閉じ、開き直すと内容が「新」になってしました。
これはPDFファイルの仕様上、エラーが出ないのでしょうか?
また、PDFファイルが開かれているかを取得する方法はありますでしょうか?

ご存じの方、ご教示ください。

引用返信 編集キー/
■61424 / inTopicNo.2)  Re[1]: PDFファイルコピーの際の例外処理について
□投稿者/ Azulean (820回)-(2011/08/12(Fri) 11:50:51)
2011/08/12(Fri) 11:51:37 編集(投稿者)

No61423 (ウェッチュ さん) に返信
> 既存のPDFファイルをSystem.IO.File.Copyメゾットを用いて別名でコピーするプログラムを作成しています。
> コピーする際、コピー元のファイルが開かれていないかを、上記のコードを用いて例外処理したいのですが上手く行きません。

これはチェックする必要があるのでしょうか?
理由がよくわかりませんでした。

# ちなみに、「メゾット」ではなく「メソッド」(Method)です。

> 試しに例外処理のコードを全てコメントアウトし、コピー元ファイルを開きながらデバックしてみましたが、そもそもエラーが検出されません。
> 同様のコードを用いてExcelファイルをコピーしようとすると、きちんとエラーが検出され、例外処理も上手く行きます。

アプリケーションがファイルを開く際にどのようにして開くかを指定しています。
Excel の場合、読み書き両方ができるモードで、ほかのプロセスからは書き込みができない排他的な方法で開いています。
従って、Excel の場合は上述のコードで開いているかある程度わかるかもしれません。ただ、Excel で読み取り専用で開いている場合は検出できないかもしれませんね。

> これはPDFファイルの仕様上、エラーが出ないのでしょうか?

違います。PDF ファイルの仕様ではなく、その開いているアプリケーションの設計・実装によるものです。
PDF を開けるアプリケーションは大本の Adobe Reader をはじめ、いくつか存在するので、すべてのアプリケーションが等しく同じ動きをするわけではありません。そういう観点からも、PDF ファイルの仕様とはいえません。

> また、PDFファイルが開かれているかを取得する方法はありますでしょうか?

すべてのアプリケーションでという意味合いでは難しくありませんか?
(PDF ファイルではなく、ファイルが開かれているかどうかということになる)

Adobe Acrobat, Adobe Reader などでという風に限定される場合であっても、Adobe に仕様を聞き出すべきでしょう。
たとえ、今正しく動いても、将来にわたって、あるいは過去バージョンでも正しく動く保障はないのですから。
引用返信 編集キー/
■61426 / inTopicNo.3)  Re[2]: PDFファイルコピーの際の例外処理について
□投稿者/ ウェッチュ (3回)-(2011/08/12(Fri) 12:52:38)
No61424 (Azulean さん) に返信

>>既存のPDFファイルをSystem.IO.File.Copyメゾットを用いて別名でコピーするプログラムを作成しています。
>>コピーする際、コピー元のファイルが開かれていないかを、上記のコードを用いて例外処理したいのですが上手く行きません。
>
> これはチェックする必要があるのでしょうか?
> 理由がよくわかりませんでした。
説明が長くなるので省略しましたが、コピー元がネットワーク上で共用するテンプレートである場合を想定している他、
実際にはコピー先に同名のファイルが有り、なおかつそれが開かれている場合の例外処理も致します。

> # ちなみに、「メゾット」ではなく「メソッド」(Method)です。
ずっと勘違いしてました。 お恥ずかしい限りです///

> Excel の場合、読み書き両方ができるモードで、ほかのプロセスからは書き込みができない排他的な方法で開いています。
> 従って、Excel の場合は上述のコードで開いているかある程度わかるかもしれません。ただ、Excel で読み取り専用で開いている場合は検出できないかもしれませんね。
既に作成済みのExcelデータのコピープログラムがあるのですが、こちらについても見直したほうが良さそうですね。 ご指摘ありがとうございます。

> 違います。PDF ファイルの仕様ではなく、その開いているアプリケーションの設計・実装によるものです。
> PDF を開けるアプリケーションは大本の Adobe Reader をはじめ、いくつか存在するので、すべてのアプリケーションが等しく同じ動きをするわけではありません。そういう観点からも、PDF ファイルの仕様とはいえません。
> すべてのアプリケーションでという意味合いでは難しくありませんか?
> (PDF ファイルではなく、ファイルが開かれているかどうかということになる)
> Adobe Acrobat, Adobe Reader などでという風に限定される場合であっても、Adobe に仕様を聞き出すべきでしょう。
> たとえ、今正しく動いても、将来にわたって、あるいは過去バージョンでも正しく動く保障はないのですから。
質問時に記載したコードで『ファイルが開かれているかどうか』を取得しているものと思っていました。大変勉強になしました。
現在、ネットワーク上のPCで使用されているPDF Readerは様々ですので、これの統一化を図ると共に、Adobeに仕様を問い合わせてみたいと思います。
ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -