プロが教える店舗&オフィスのセキュリティ対策術

vb.netで開発しています。
以下のソースはFTPでtxtファイルを外部ホスティングサーバーにアップロードしている箇所です。

Private Function UpRoad(ByVal Flnm As String) As Boolean
Dim s As Integer
'Err数
Dim Int_Err As Integer = 0

For s = 0 To 2
' アップロードするファイル()
Dim upFile As String = "C:\HighwayMail\SendData\Data\" & Flnm
'アップロード先のURI
Dim u As New Uri(ftpad & "/data/" & Flnm)

'FtpWebRequestの作成
Dim ftpReq As System.Net.FtpWebRequest = _
CType(System.Net.WebRequest.Create(u), System.Net.FtpWebRequest)
'ログインユーザー名とパスワードを設定
ftpReq.Credentials = New System.Net.NetworkCredential(usernm, pass)
'MethodにWebRequestMethods.Ftp.UploadFile("STOR")を設定
ftpReq.Method = System.Net.WebRequestMethods.Ftp.UploadFile
'要求の完了後に接続を閉じる
ftpReq.KeepAlive = False
'ASCIIモードで転送する
ftpReq.UseBinary = False
'PASVモードを無効にする
ftpReq.UsePassive = False
Try
'ファイルをアップロードするためのStreamを取得
Dim reqStrm As System.IO.Stream = ftpReq.GetRequestStream()
'アップロードするファイルを開く
Dim fs As New System.IO.FileStream( _
upFile, System.IO.FileMode.Open, System.IO.FileAccess.Read)
'アップロードStreamに書き込む
Dim buffer(1023) As Byte
While True
Dim readSize As Integer = fs.Read(buffer, 0, buffer.Length)
If readSize = 0 Then
Exit While
End If
reqStrm.Write(buffer, 0, readSize)
End While
fs.Close()
reqStrm.Close()
UpRoad = False
Exit For

Catch wex As System.Net.WebException
Dim Err As String = wex.Status
If Err = "2" Then
UpRoad = True
Exit For
Else
Int_Err = Int_Err + 1
If Int_Err = 3 Then
System.IO.File.WriteAllText("C:\UL.log", wex.ToString)
UpRoad = True
Exit For
Else
Exit Try
'10秒間(10000ミリ秒)停止する
System.Threading.Thread.Sleep(10000)
End If
End If
End Try
Next
End Function

「Streamを取得」=>「ファイルを開く」=>「Streamに書き込む」
のような手順でアップロードが行われています。
「Streamを取得」したあとに、サーバー側で接続を切断された場合reqStrm.Close() が実行されないまま、例外処理にはいります。
(つまり接続しっぱなしの状態になってしまいます)
このような例外的なことが起こった場合でも、確実に切断(reqStrm.Close())されるにはどのようにソースを修正したらよろしいでしょうか?
ご教授よろしくお願いします。

A 回答 (2件)

>この部分をTry文の外で宣言すればエラーの解決になる


すりゃいいじゃん(笑)

Private Function UpRoad(ByVal Flnm As String) As Boolean
Dim reqStrm As System.IO.Stream 
Dim fs As System.IO.FileStream
Try
      'ファイルをアップロードするためのStreamを取得
      reqStrm = ftpReq.GetRequestStream()
      'アップロードするファイルを開く
      fs = New System.IO.FileStream( _
      upFile, System.IO.FileMode.Open, System.IO.FileAccess.Read)

catch

Finally

End Try
End Sub
    • good
    • 0
この回答へのお礼

ホントデス(泣
すればいいだけの問題でした・・・。

忙しい中答えてくださってありがとう。
とても助かりました。

お礼日時:2008/01/18 16:07

俺自身FTPとかの処理に詳しくないんで,見当違いの事いうかもしれないけど,



質問見て思ったのがTry~Catch~Finally~End Try構文の最後のFinally

http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6to …

この回答への補足

返信ありがとうございます。
Try~EndTryの内容を以下のように修正しました。

 Try
      'ファイルをアップロードするためのStreamを取得
      Dim reqStrm As System.IO.Stream = ftpReq.GetRequestStream()
      'アップロードするファイルを開く
      Dim fs As New System.IO.FileStream( _
      upFile, System.IO.FileMode.Open, System.IO.FileAccess.Read)
      'アップロードStreamに書き込む
      Dim buffer(1023) As Byte
      While True
        Dim readSize As Integer = fs.Read(buffer, 0, buffer.Length)
        If readSize = 0 Then
          Exit While
        End If
        reqStrm.Write(buffer, 0, readSize)
      End While
'**削除ここから
      'fs.Close()
      'reqStrm.Close()
     '**削除ここまで
      UpRoad = False
      Exit For

   Catch wex As System.Net.WebException
      Dim Err As String = wex.Status
      If Err = "2" Then
        UpRoad = True
        Exit For
      Else
        Int_Err = Int_Err + 1
        If Int_Err = 3 Then
          System.IO.File.WriteAllText("C:\UL.log", wex.ToString)
          UpRoad = True
          Exit For
        Else
          Exit Try
          '10秒間(10000ミリ秒)停止する
          System.Threading.Thread.Sleep(10000)
        End If
      End If
'**追加ここから
   Finally
     fs.Close()
reqStrm.Close()
   '**追加ここまで
   End Try

このように修正した場合
fs,reqStrmが宣言されていませんというエラーが出てしまいます。
Tryの頭部分で宣言した
'ファイルをアップロードするためのStreamを取得
Dim reqStrm As System.IO.Stream = ftpReq.GetRequestStream()
'アップロードするファイルを開く
Dim fs As New System.IO.FileStream( _
upFile, System.IO.FileMode.Open, System.IO.FileAccess.Read)
が変数の有効範囲を超えてしまったのだと理解しています。
この部分をTry文の外で宣言すればエラーの解決になると思うのですが、
どう修正してよいかわかりません。
非常に基本的な問題で申し訳ないのですが、どなたかご教授ください。

補足日時:2008/01/18 10:54
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!