人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

●質問者: hokuto0127
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● うぃんど
ベストアンサー

(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そのものが損傷を受ける可能性だって無いとは言えませんので、
言語の基礎学習レベルの現状においてはテキストファイルへの保存からはじめたほうが安全だと思います


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

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ