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())されるに
はどのようにソースを修正したらよろしいでしょうか?
ご教授よろしくお願いします
TryとFinallyを使います。
VB2005以降ならUsingもよいです。
# UsingだとCloseじゃなくてDisposeになりますが。
返信ありがとうございます。
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文の外で宣言すればエラーの解決になると思うのですが、
どう修正してよいかわかりません。
非常に基本的な問題で申し訳ないのですが、どなたかご教授ください。
あっ、すいません(泣
解決しました。
ありがとうございました。