ファイルをクローズしたい

このQ&Aのポイント
  • Visual Studio 2010 VB.NETでファイルを書き込む際に、ファイルをクローズする方法を教えてください。
  • OpenTextFileWriterを使用してファイルにデータを書き込んだ後、ファイルを確実にクローズするにはどうすればいいですか?
  • Try, Catch, FinallyのFinallyブロックでファイルをクローズする方法について教えてください。
回答を見る
  • ベストアンサー

ファイルをクローズしたい

visual studio 2010 vb.netでの質問です。OpenTextFileWriter での書き込み処理時、エラーが発生した場合、Try,Catch ,FinallyのFinallyの部分でファイルをクローズしたいと思い以下のコードを書きましたが警告 「変数 'tw' は、値が割り当てられる前に使用されています。Null 参照の例外が実行時に発生する可能性があります。」が発生してしまいます。ファイルを必ずクローズしたい(エラーが発生しても、しなくても)と思うのですが、どのようにコードを書けばうまくいくのでしょうか。お教えいただけるとありがたいです。 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim wfileNamePath As String Dim data As String Dim tw As System.IO.TextWriter wfileNamePath = "C:\test\test.txt" Try data = "abcd" tw = My.Computer.FileSystem.OpenTextFileWriter(wfileNamePath, True, System.Text.Encoding.Default) tw.WriteLine(data) Catch ex As Exception MsgBox("エラー発生") Finally tw.Close() End Try End Sub End Class

質問者が選んだベストアンサー

  • ベストアンサー
noname#178500
noname#178500
回答No.3

オブジェクトの初期化をtryの中で記述すると、警告が出ますよ。

goldengolds
質問者

お礼

なるほど、警告のでる原因はそれだったのですね。先程試したら、警告とれました。ありがとうございました。

その他の回答 (3)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.4

> Dim tw As System.IO.TextWriter Dim tw As System.IO.TextWriter = Nothing > tw.Close() If tw IsNot Nothing Then tw.Close() とすればよい。 それよりUsing文で書くと簡単です。 Try   data = "abcd"   Using tw As TextWriter = My.Computer.FileSystem.OpenTextFileWriter(wfileNamePath, True, System.Text.Encoding.Default)     tw.WriteLine(data)   End Using Catch ex As Exception   MsgBox("エラー発生") End Try ※ End Usingで確実にDisposeが呼ばれるので、明示的にCloseする必要がない。 Usingステートメントで簡単、確実にファイルをクローズ http://www.atmarkit.co.jp/fdotnet/vb2005/vb2005_05/vb2005_05_01.html

goldengolds
質問者

お礼

usingの具体的使用方法、参考HPを教えていただきまして本当にありがとうございました。

回答No.2

通常はTry-Finallyの代わりにUsingを使えば事足ります。 Using tw As TextWriter = My.Computer.FileSystem.OpenTextFileWriter(wfileNamePath, True, System.Text.Encoding.Default) tw.WriteLine(data) End Using ただし,Catch節に相当するコードは書けないので,今回の場合は,Finally節を Finally If tw IsNot Nothing Then tw.Close() End Try とするのがよいでしょう。 # Try-CatchのTry節にUsingを入れてもよいですが。

  • 11zep
  • ベストアンサー率36% (48/133)
回答No.1

tw = My.Computer.FileSystem.OpenTextFileWriter(wfileNamePath, True, System.Text.Encoding.Default) をTryの前(上)に移動すればいいのでは?

関連するQ&A

  • VB6で作成した自作DLLをVB.NETで呼び出し例外発生時に参照渡しの引数に値を設定する方法

    VB6で作成した自作のDLLをVB.NET2005で作成したEXEから呼び出した際に、DLLメソッドの正常・異常終了に関わらず第2引数の戻り値に第1引数の値を設定したいと考えていますが旨くいきません。 何かよい方法はないでしょうか? 以下、簡単なサンプルです。 =========================== VB6 DLL =========================== Public Sub getDataForTest(ByVal strIn As String, ByRef strOut As String) Dim intData As Integer 'strInの値をstrOutに代入 strOut = strIn 'strInの値を1で割り算 intData = CInt(strIn) / 1 End Sub =============================================================== =================== DLL呼び出し正常パターン =================== Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim objCom As New Project1.Class1 Dim strRet As String = "" Try Call objCom.getDataForTest("1", strRet) Catch ex As Exception MsgBox(ex.Message) Finally MsgBox(strRet) ←←← 1が表示される  End Try End Sub =============================================================== =================== DLL呼び出し異常パターン =================== Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim objCom As New Project1.Class1 Dim strRet As String = "" Try Call objCom.getDataForTest("A", strRet) Catch ex As Exception MsgBox(ex.Message) Finally MsgBox(strRet) ←←← この時にAを表示したいがstrRetが空  End Try End Sub ===============================================================

  • VB ファイル保存

    XMLファイルに設定情報を保存仕様としているのですが,ある所でエラーが出てうまく走りません. 下記がそのプログラムになりますが,XMLファイルに保存のコメント下の所でエラーになります. エラーの内容は「保護レベルの設定が原因で'windowsApplication1.Form2'にアクセスできません」 です. どなたかご教示のほどよろしくお願いいたします. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 'ファイルが存在しない場合に新規にブランクファイルを作成する 'XMLファイルパス Dim xmlFile1 As String = "C:\OBS_Setting.xml" Dim hStream As System.IO.FileStream 'XMLファイルが存在するか確認 If Dir(xmlFile1) = "" Then ' 指定したパスのファイルを作成する hStream = System.IO.File.Create(xmlFile1) ' hStream が破棄されることを保証するために Try ~ Finally を使用する Try ' hStream が閉じられることを保証するために Try ~ Finally を使用する Try Finally ' 作成時に返される FileStream を利用して閉じる If Not hStream Is Nothing Then hStream.Close() End If End Try Finally ' hStream を破棄する If Not hStream Is Nothing Then Dim cDisposable As System.IDisposable = hStream cDisposable.Dispose() End If End Try End If 'XMLファイルに設定データを保存する Dim Area As String = ComboBox1.Text Dim State As String = ComboBox2.Text Dim City As String = ComboBox3.Text Dim BefY As String = ComboBox4.SelectedIndex Dim AftY As String = ComboBox5.SelectedIndex Dim BefM As String = ComboBox6.SelectedIndex Dim AftM As String = ComboBox7.SelectedIndex '保存するオブジェクトの配列を作成 '保存するオブジェクトの配列を作成 Dim myClasses(6) As SampleClass myClasses(0) = New SampleClass() myClasses(0).Number = 0 myClasses(0).Message = Area myClasses(1) = New SampleClass() myClasses(1).Number = 1 myClasses(1).Message = State myClasses(2) = New SampleClass() myClasses(2).Number = 2 myClasses(2).Message = City myClasses(3) = New SampleClass() myClasses(3).Number = 3 myClasses(3).Message = BefY myClasses(4) = New SampleClass() myClasses(4).Number = 4 myClasses(4).Message = AftY myClasses(5) = New SampleClass() myClasses(5).Number = 5 myClasses(5).Message = BefM myClasses(6) = New SampleClass() myClasses(6).Number = 6 myClasses(6).Message = AftM 'XMLファイルに保存 Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(SampleClass())) Dim fs1 As New IO.FileStream(xmlFile1, IO.FileMode.Create) serializer.Serialize(fs1, myClasses) fs1.Close() End Sub 'XMLファイルに保存するオブジェクトのためのクラス Public Class SampleClass Public Number As Integer Public Message As String End Class

  • VB TEXT読み取りについて

    このコードでのデバックは成功したのですが、TEXTBOX1にファイルネーム C:\Users\???\Documents\???と入力しても’パスが拒否されました’と出てしまいます。 どう解決したらよいのでしょうか、宜しくお願いします。 Public Class Form1 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim sr As System.IO.StreamReader = Nothing Try Dim file As String = TextBox1.Text sr = New System.IO.StreamReader(file, System.Text.Encoding.GetEncoding("shift_jis")) Dim doc As String = "" Do Until sr.EndOfStream doc &= sr.ReadLine & vdcrlf() Loop TextBox2.Text = doc Catch ex As Exception MessageBox.Show(ex.Message, "read") Finally If sr IsNot Nothing Then sr.Close() sr.Dispose() End If End Try End Sub Private Function vdcrlf() As String Throw New NotImplementedException End Function End Class

  • [VB.NET]クラスのシリアライズでエラーが発生

    プログラムを作っていて設定を保存するためのクラスを作ったのですが原因不明のエラーが出てきてしまいます。 Public Class cde_config Const CONFIG_FILE As String = "config.xml" Public FolderName As String Public exex As New ArrayList Public Sub New() If File.Exists(CONFIG_FILE) Then Dim serializer As XmlSerializer = New XmlSerializer(GetType(cde_config)) Dim stream As FileStream = New FileStream(CONFIG_FILE, FileMode.Open) Try Me.FolderName = CType(serializer.Deserialize(stream), cde_config).FolderName 'ここでエラーが発生 Me.exex = CType(serializer.Deserialize(stream), cde_config).exex Finally stream.Close() End Try Else FolderName = "略" exex.Add(New String("略")) End If End Sub Public Sub save() Dim serializer As XmlSerializer = New XmlSerializer(GetType(cde_config)) Dim stream As FileStream = New FileStream(CONFIG_FILE, FileMode.Create) Try serializer.Serialize(stream, Me) Finally stream.Close() End Try End Sub End Class エラーの内容は 'System.InvalidOperationException' のハンドルされていない例外が system.xml.dll で発生しました。 追加情報 : XML ドキュメント (2,2) でエラーが発生しました。 です。 どこに問題があるのでしょうか。

  • HTTP接続すると文字化けがおこってしまいます

    VB2005です。 HTTPサーバーに接続してデータをテキストボックスに書き出す処理なのですが、どうしても文字化けしてしまい困っています。どうしたらよいでしょうか? Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click ' HTTPサーバーへ接続する Dim client As New WebClient Try ' HTTPサーバーへ接続しストリームを取得する Dim stream As System.IO.Stream = _ client.OpenRead(TextBox1.Text) ' テキストボックスへ結果を書き出す Dim reader As New System.IO.StreamReader(stream) TextBox2.Text = reader.ReadToEnd() reader.Close() stream.Close() Catch ex As WebException ' URLが不正の場合は例外が発生する MessageBox.Show(ex.Message) End Try End Sub

  • Try~Catch、Finallyについて。

    下記のように、DataSetをXML出力するメソッドを作りました。 Public Sub WriteXml(ByVal xmlDs As DataSet) Try Dim fileStream As New System.IO.FileStream(holdFilePath, System.IO.FileMode.Create) Dim setting As New System.Xml.XmlWriterSettings '文字コード設定 With setting .Encoding = System.Text.Encoding.UTF8 .Indent = True End With Dim writer As System.Xml.XmlWriter = Xml.XmlWriter.Create(fileStream, setting) 'XMLへの書き込みを行い、FileStreamを閉じる xmlDs.WriteXml(writer) writer.Close() fileStream.Close() Catch ex As Exception MsgBox(ex.message) End Try End Sub メソッドは以上です。 writer.Close()、fileStream.Close()については、確実に 処理を行いたいので、Finallyで行おうかと思ったのですが、 その場合、Dim fileStream~、Dim writer~はTryの外に出さないと、 宣言されていないと言われてしまいます。 そうなると今度は、NewやXml.XmlWriter.Create(fileStream, setting) でコケた場合にCatchが出来ません…。 Usingを使うのが近いかなと思ったんですが、複数Newしている場合 でも使えるのでしょうか? 確実にClose処理を行うための改修箇所、アドバイスいただけ ないでしょうか? よろしくお願いします。

  • VB2013でVB6でのDBは利用可能?

    VB4.0で作成してましたMicrosoft.Jet.OLEDB.4.0のDBをSQLSERVER2012で作成したDBに移行したいのですが VB2013では読み込めないのでしょうか? データーベースエクスプローラーでは中身の確認はできるのですが プログラムで走らせるとSqlDataAdapter(sql, cnStr)のところでエラー下記[エラー結果]とになります Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Dim cnStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\SERVER\DB名.mdb" Dim sql As String sql = "SELECT * FROM テーブル名" Dim dt1 As New DataTable Dim da1 As New SqlDataAdapter(sql, cnStr) Try da1.Fill(dt1) DataGridView1.DataSource = dt1 Catch ex As Exception End Try End Sub [エラー結果] 型 'System.ArgumentException' のハンドルされていない例外が System.Data.dll で発生しました 追加情報:キーワードはサポートされていません : 'provider' 以前のmdbファイルが読み込める方法はないのでしょうか?

  • DBへのOPENについて

    DBへのOPENについて 無限ループの処理の中でDBへ取得、更新をします。 無限ループの中で毎回Openするのはいけてないと思うので、例外などに入ったときのみCloseしてあとはOpenのままでいたいと思っています。 つまりCloseされていたらOpenするという処理をしたいのですがどうやったらいいのでしょうか。 ↓無限ループしている箇所からの呼び出し Public Sub AA () Dim cn As System.Data.SqlClient.SqlConnection Dim ServerName As String = "AA" Dim DBName As String = "BB" try cn = New System.Data.SqlClient.SqlConnection If cn.State = Data.ConnectionState.Closed Then cn.ConnectionString = "Data Source = " & ServerName & _ ";Initial Catalog = " & DBName & _ ";Integrated Security = SSPI" cn.Open() End if Catch ex As Exception cn.close() End try End Sub こんな感じかなと思いましたが、これだと毎回Newしているのでなにかおかしい気がしてしまいます。 環境 SQL Server2008 ADO.net VB.net

  • VB TEXTデータについて

    下記のコードでTEXTを読み取りできましたが、読み取ったデータを使用して座標計算したいのですが 例えば、6列6行あるとします、1列目(X)、2列目(y)、3列目(X1)、4列目(y2)、5列目(角度)、6列目(予備)、となっているものが6行あります、1列目・1行の値から、6列目・6行の値まで指定するとき どのようなコードがあるのでしょうか、宜しくお願いします。 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim sr As System.IO.StreamReader = Nothing ' Try Dim file As String = TextBox1.Text 'SRとは New System.IO.StreamReaderの略 sr = New System.IO.StreamReader(file, System.Text.Encoding.GetEncoding("shift_jis")) Dim doc As String = "" '1行ずつテキストを読み取る Do Until sr.EndOfStream '改行コードが取り除かれてしまうのでVBnewlineで改行を付け直し doc &= sr.ReadLine & vbNewLine Loop 'TEXTBOX.2にdocを代入 TextBox2.Text = doc Catch ex As Exception MessageBox.Show(ex.Message, "read") Finally If sr IsNot Nothing Then sr.Close() sr.Dispose() End If End Try End Sub

  • 'Button1を押したらポートオープン

    'Button1を押したらポートオープン Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'シリアルポートを設定。 SerialPort1.PortName = SerialPortComboBox.Text SerialPort1.BaudRate = SerialBpsComboBox.Text Select Case SerialParityComboBox.Text Form3.SerialPort1.Parity = IO.Ports.Parity.None 'データ長 SerialPort1.DataBits = SerialDataBitsComboBox.Text 'RTSラインを有効にする SerialPort1.RtsEnable = True '送信タイムアウト SerialPort1.WriteTimeout = 3000 Try 'ポートをオープン SerialPort1.Open() 'いざ送信 'SerialPort1.Write(Chr(&HC)) 'ケーブルが外れた場合などのタイムアウトエラーなら、 Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical, "シリアル通信エラー") SerialPort1.Close() Exit Sub End Try '送信バッファが空になるまで待って、 While SerialPort1.BytesToWrite > 0 My.Application.DoEvents() End While ''''''''''''文字送信 'シリアルポート送信データをSJISに指定 SerialPort1.Encoding = System.Text.Encoding.GetEncoding(932) Dim Settei As String '送信文字代入 Settei = "A.1=" & vbCrLf 'いざ送信 SerialPort1.Write(Settei) '送信バッファが空になるまで待って、 While SerialPort1.BytesToWrite > 0 My.Application.DoEvents() End While End Sub '文字受信 Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Dim strDataReceived As String Dim add As New AddDataDelegate(AddressOf AddData) Try strDataReceived = SerialPort1.ReadLine Catch ex As Exception strDataReceived = ex.Message End Try TextBox1.Invoke(add, strDataReceived) End Sub ///////// 文字を送信した後に相手から帰ってきます。 送信した後の受信の部分ですが、これで正しいか教えて頂きたいです。

専門家に質問してみよう