VB.NETでSaveFileDialogに関する質問です。

簡単に指定のディレクトリのレジストリを消せるプログラムを作成中です。
そこで、一応バックアップが取れるようにとShell関数を使ってレジストリのバックアップファイル(REG)の作成まではできました。
そして、一時ファイルにとりあえず保存しておき、ユーザーが指定したフォルダ、ファイル名で保存できるようにしようと、SaveFileDialogも組み合わせてはみたのですか・・
確かに指定した場所、名前でコピーできるのですが、そのあともう一度(再度)開かれてしまいます。
なぜ二回も開かれてしまうのでしょうか。

現状のコード
http://utf-up.org/hatena/registry_delete-sample.vb

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/12/11 10:58:50

ベストアンサー

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

(1)原因
ShowDialog()を2回行ってますから、ダイアログは二回現れます

If sfd.ShowDialog() = DialogResult.OK Then   ←1回目
    System.IO.File.Copy(".\temp\BACKUP.REG", sfd.FileName, True)
    sfd.Dispose()
End If
If sfd.ShowDialog() = DialogResult.Cancel Then   ←2回目
    System.IO.File.Delete(".\temp\BACKUP.REG")
    sfd.Dispose()
End If

(2)対処例

If sfd.ShowDialog() = DialogResult.OK Then
    System.IO.File.Copy(".\temp\BACKUP.REG", sfd.FileName, True)
ELSE
    System.IO.File.Delete(".\temp\BACKUP.REG")
End If
sfd.Dispose()

(3)その他問題点
・SHELLの実行はダイアログでDialogResult.OKの時だけ実行すればいい
 あらかじめ作成しておいて、OKならコピーして、
 CANCELなら削除するなどは無駄な手順
・If ElseIf Else End IF の使い方がおかしい
 下記2箇所は常にNoあるいはCancelであるため実行されることはない
 ElseIf Windows.Forms.DialogResult.No Then ←式の結果は常にNo
 ElseIf Windows.Forms.DialogResult.Cancel Then ←式の結果は常にCancel
動作確認はしておりませんが、対応例としてはおおよそ以下のような具合です

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    My.Application.DoEvents()
    Dim result As Windows.Forms.DialogResult
    Try
        result = MessageBox.Show("レジストリのバックアップをしますか?", "レジストリバックアップ", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation)
        If result = Windows.Forms.DialogResult.Yes Then
            Dim sfd As New SaveFileDialog()
            sfd.Title = "保存先のファイルを選択してください"
            sfd.FileName = Now.ToString("yyyy.MM.dd.HHmm.ss")
            sfd.Filter = "REG - Windows レジストリ登録エントリ (*.REG)|*.REG;*.reg"
            sfd.RestoreDirectory = True
            If sfd.ShowDialog() = DialogResult.OK Then
                Shell("REGEDIT.EXE /E " & sfd.FileName & """HKEY_CURRENT_USER\Software\VB and VBA Program Settings\Sample\""")
                sfd.Dispose()
            End If
        Endif
        If result = Windows.Forms.DialogResult.Yes Or result = Windows.Forms.DialogResult.No Then
            Microsoft.Win32.Registry.CurrentUser.DeleteSubKeyTree("Software\VB and VBA Program Settings\GChyde", False)
            MessageBox.Show("レジストリを削除しました。")
            Application.Exit()
        End If
    Catch ex As System.IO.DirectoryNotFoundException
        MessageBox.Show("レジストリの削除に失敗しました")
        Application.Exit()
    End Try
End Sub

(4)余談
適当に回答されてしまってレジストリに保存することにしてしまったのかもしれませんが、
本当にレジストリに保存する必要はあるのでしょうか?
レジストリの操作に失敗するとWindowsそのものが損傷を受ける可能性だって無いとは言えませんので、
言語の基礎学習レベルの現状においてはテキストファイルへの保存からはじめたほうが安全だと思います

id:hokuto0127

サンプルコードまで有難うございます。もともと、設定情報をレジストリで保存する方法(GetSetting,SaveSetting)でアプリケーションの大元を作ってしまったため、レジストリ(設定情報)を簡単に消せるようにしたかったのです。Or値はまだ使い方がわかりませんでした。このサンプルコードの意味を調べてみます。次回またわからないじゃ困るので・・。テキストファイル(INI,XML?)への保存が調べたときになかなか出なかったため手っ取り早いレジストリにしてしまいました・・。

2011/12/11 10:56:28

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません