
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())されるにはどのようにソースを修正したらよろしいでしょうか?
ご教授よろしくお願いします。
No.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
No.1
- 回答日時:
俺自身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文の外で宣言すればエラーの解決になると思うのですが、
どう修正してよいかわかりません。
非常に基本的な問題で申し訳ないのですが、どなたかご教授ください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
大容量のファイルアップロード...
-
ファイルサイズがpost_max_size...
-
「クラウドにアップロード」」...
-
phpのheader("Location:#pos")...
-
PHPのif文でその処理を途中で抜...
-
.htaccessにphp_valueが使用できな
-
mysql→EUC-JP、php→UTF-8の時の...
-
2つの画像ファイルが異なるファ...
-
require_once()でファイルが読...
-
phpの中でphpを書けないか
-
FTPコマンドでディレクトリごと...
-
MkDir関数
-
【file_exists】ファイルが存在...
-
sqlで日付が一番古いデータの月...
-
フォームで戻った際に入力済み...
-
<A href ~ と一緒に値を渡すには
-
テレメールとは?
-
「クラス関数」「メンバ関数」...
-
Makefile.inとMakefile.am
-
現在位置より2つ上のディレク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
onedrive にexcelファイルをア...
-
「クラウドにアップロード」」...
-
BASP21のFTPで日本語ファイル名...
-
ftpでアップロードが出来ない
-
FTPClientで転送結果(OKかFAIL)
-
youtubeに音声のみのmp4ファイ...
-
PHPでxmlをAPIに送信する方法(P...
-
os x serverのアップロードファ...
-
ファイルのアップロードがどう...
-
$_FILES['x']['error']について
-
DUMPした巨大SQLファイルをイン...
-
違法アップロードについて
-
ファイルアップロードの日付に...
-
ファイルアップロードしたもの...
-
PHPで音楽ファイルのアップ...
-
アップロードするとバックスラ...
-
BASP21を利用してリネームファ...
-
ファイルサイズがpost_max_size...
-
ファイルのアップロードを行う...
-
SmartyでHTMLソースの変更が反...
おすすめ情報