FTP接続の例外処理 – プログラミング – Home

通知
すべてクリア

[解決済] FTP接続の例外処理


美咲
 美咲
(@美咲)
ゲスト
結合: 17年前
投稿: 3
Topic starter  

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())されるに
はどのようにソースを修正したらよろしいでしょうか?
ご教授よろしくお願いします


引用未解決
トピックタグ
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

TryとFinallyを使います。
VB2005以降ならUsingもよいです。
# UsingだとCloseじゃなくてDisposeになりますが。


返信引用
美咲
 美咲
(@美咲)
ゲスト
結合: 17年前
投稿: 3
Topic starter  

返信ありがとうございます。
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文の外で宣言すればエラーの解決になると思うのですが、
どう修正してよいかわかりません。
非常に基本的な問題で申し訳ないのですが、どなたかご教授ください。


返信引用
美咲
 美咲
(@美咲)
ゲスト
結合: 17年前
投稿: 3
Topic starter  

あっ、すいません(泣
解決しました。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました