ボタンをクリックしてファイルを開き、ファイルがとじられたらファイルを削除するには?

解決


ナナ  2004-06-17 04:01:57  No: 113959  IP: [192.*.*.*]

お世話になります。

現在VB.NETでwinアプリを作成しております。

フォーム上にボタンとテキストボックスがあり、
ボタンを押したらテキストファイルが作成され
テキストボックス上の内容がテキストファイルに
書き込まれるようにし、そのテキストファイルを
開いて表示させるようにし、ユーザーがテキストファイルを
閉じたらファイルも削除されるようにしたいと考えてますが
よい方法が見つかりません。

現在考えたのが下記の方法です。

Dim fs1 As New StreamWriter("c:\test.txt", True, System.Text.Encoding.Default)

fs1.WriteLine(TextBox1.Text)
fs1.Close()

Dim p As System.Diagnostics.Process = _
 System.Diagnostics.Process.Start("c:\test.txt")
p.WaitForExit()

Kill("c:\test.txt")

これですと最後にファイルを削除するところで
エラーになります。

何かよい方法はありますでしょうか。

編集    削除
特攻隊長まるるう  2004-06-17 18:12:33  No: 113960  IP: [192.*.*.*]

ボクの環境では何度やってもエラー出ませんが?
[Win2000(sp4) VB.NET2002]
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim wFilePath As String = "c:\data\コピー 〜 test.txt"
        Dim fs1 As New StreamWriter(wFilePath, True, System.Text.Encoding.Default)

        fs1.WriteLine(TextBox1.Text)
        fs1.Close()

        Dim p As System.Diagnostics.Process = _
         System.Diagnostics.Process.Start(wFilePath)
        p.WaitForExit()

        Kill(wFilePath)
    End Sub

ちなみにエラーの内容は?質問するならそれが重要だと思う
んですけど(^^;)

編集    削除
ナナ  2004-06-18 19:44:14  No: 113961  IP: [192.*.*.*]

特攻隊長まるるう様

ご助言ありがとうございます。
エラーメッセージを入れるのを忘れていました、申し訳ありません。
エラーは以下のとおりです。

'System.NullReferenceException' のハンドルされていない例外が showtext.exe で発生しました。

追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。

アドバイスいただいたようなソースにしても
同じエラーになりました。
またエラーの場所が表示されないので
どこでおかしいのかもわからず困っております。

何かアドバイスがございましたらお願いいたします。

編集    削除
ナナ  2004-06-18 19:51:40  No: 113962  IP: [192.*.*.*]

連続ですみません。
無事実行できました。
(ただ先ほど実行したプログラムから
何も修正していないのに急に動くように
なったので少々すっきりしてませんが・・・)

また、先ほど作成したのはtxtファイルですが
今度はhtmlファイルにすると上記と同じ
エラーが発生してしまいました。
txtのようにファイルを開くまではいくのですが
開いてからすぐにエラーのポップアップが
表示されてしまいます。
(ファイルは開かれたままです)

何かご存知の方、どうぞアドバイスお願いします。

編集    削除
特攻隊長まるるう  2004-06-18 20:37:15  No: 113963  IP: [192.*.*.*]

>またエラーの場所が表示されないので
>'System.NullReferenceException' のハンドルされていない例外が showtext.exe で発生しました。

表示されましたよ?EXE のダブルクリックから実行してるんですか?

>(ただ先ほど実行したプログラムから
>何も修正していないのに急に動くように
>なったので少々すっきりしてませんが・・・)
実行の仕方が悪いような気がします…
VB.NETのメニューバーで[ビルド]-[構成マネージャ]はすべて
Debug 指定(Release は最終的に納品する時に選んでください)。
[デバッグ]-[開始]で実行して下さい。

System.Diagnostics.Process.Start が完全に成功しなかった
時に出るようですね。
その場合、p が作成されず、Nothing のままなので、
        p.WaitForExit()
を実行した時点でオブジェクトが実体化していないという意味の
>追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。
となります。
Process.Start でなんとかファイルの起動だけは成功してたり
するので
>txtのようにファイルを開くまではいくのですが
>開いてからすぐにエラーのポップアップが
>表示されてしまいます。
となるようです。
詳しいことはまだ分かりませんが、html ファイルの
場合は
[VB.NET]
' 省略
        Dim p As System.Diagnostics.Process = _
         System.Diagnostics.Process.Start("IExplore.exe", wFilePath)
        If p Is Nothing Then
            MessageBox.Show("オブジェクトの生成と取得に失敗しました。")
            Exit Sub
        End If
        p.WaitForExit()
' 省略
でどうでしょう?

編集    削除
特攻隊長まるるう  2004-06-18 20:57:31  No: 113964  IP: [192.*.*.*]

あー。Process.Start メソッドのヘルプに書いてありますね。
多分これでしょう。

>プロセスが既に実行されている場合、追加のプロセス リソースは
>起動されません。代わりに、既存のプロセス リソースが再利用され、
>新しい Process コンポーネントは作成されません。この場合、
>新しい Process コンポーネントが返される代わりに、 
>Start は呼び出し元のプロシージャに null 参照 
>(Visual Basic では Nothing) を返します。

とりあえず、他に同じ拡張子のファイルを開かずに、最初の
質問のコードで実行してみて下さい。
        If p Is Nothing Then
            MessageBox.Show("なんかファイル開いてます?")
            Exit Sub
        End If
くらいは付けておいてもいいかも?。

編集    削除
ナナ  2004-06-18 22:04:18  No: 113965  IP: [192.*.*.*]

特攻隊長まるるう様

詳細にご説明くださり本当にありがとうございます。
アドバイスのおかげで無事成功することが
できました。
またエラーの原因も理解できましたので
本当に助かりました。

今回は本当にお世話になりました。
ありがとうございました。

編集    削除