Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
ftp転送時のファイルの競合回避について
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=10885#CommentId23715
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
nin
 (社会人)
投稿日時
2012/6/2 18:24:51
毎度お世話になります
ftpサーバから、10秒おきにデータをgetして、内容を読み出す部分を作成しておりますが、周期が早すぎるのか、ファイルのアクセスが競合エラーになります
パターン1
'FtpWebRequestの作成
Dim ftpReq As System.Net.FtpWebRequest = _
CType(System.Net.WebRequest.Create(u), System.Net.FtpWebRequest)
'ログインユーザー名とパスワードを設定
ftpReq.Credentials = New System.Net.NetworkCredential(UserName, UserPass)
'MethodにWebRequestMethods.Ftp.DownloadFile("RETR")を設定
ftpReq.Method = System.Net.WebRequestMethods.Ftp.DownloadFile
'要求の完了後に接続を閉じる
ftpReq.KeepAlive = False
'ASCIIモードで転送する
ftpReq.UseBinary = False
'PASSIVEモードを無効にする
ftpReq.UsePassive = False
'FtpWebResponseを取得
Dim ftpRes As System.Net.FtpWebResponse = _
CType(ftpReq.GetResponse(), System.Net.FtpWebResponse)
'ファイルをダウンロードするためのStreamを取得
Dim resStrm As System.IO.Stream = ftpRes.GetResponseStream()
'ダウンロードしたファイルを書き込むためのFileStreamを作成
Dim fs As New System.IO.FileStream( _
downFile, System.IO.FileMode.Create, System.IO.FileAccess.Write)
'ダウンロードしたデータを書き込む
Dim buffer(1023) As Byte
While True
Dim readSize As Integer = resStrm.Read(buffer, 0, buffer.Length)
If readSize = 0 Then
Exit While
End If
fs.Write(buffer, 0, readSize)
End While
fs.Close()
resStrm.Close()
ftpRes.Close()
上記処理の後
'データを配列Ataiに読み込む
Dim Reader As New IO.StreamReader(Application.StartupPath + "\ichi.csv", _
System.Text.Encoding.GetEncoding("Shift-JIS"))
・
・
・
IO.StreamReaderで、読み出しています
時々処理が帰ってこなくなります(ハング)エラーは出ません
サーバ側では、abortingのエラーになります
20秒周期にしてみましたが、結果同じでした
切り分けの為、ダウンロードのファイルと、読出ファイルを別のファイルで実行しましたが
結果同じでした。PCに書き込まないように書込部をコメントアウトしましたが、同じでした
パターン2
昔ながらの、SHELLコマンドで、FTPコマンドを使ってファイルをDLしたところ、時々
IO.StreamReader処理で、競合エラーで停止します
SHELLの実行で、処理が終了するまで、次の処理にいかないように、変更してみましたが
結果同じでした
Dim procId As Long 'プロセスID
Dim hProc As Object 'プロセスハンドル
Dim strPNAME As String
strPNAME = """" + Application.StartupPath + "\ftpftp.txt" + """"
procId = Shell("ftp -s:" + strPNAME, vbHide)
hProc = OpenProcess(PROCESS_ALL_ACCESS, False, procId) 'プロセスハンドルを取得します。
If hProc > 0 Then 'プロセスハンドルを取得できた場合
Call WaitForSingleObject(hProc, INFINITE) 'プロセスがシグナル状態になるまで待ちます。
CloseHandle(hProc) 'プロセスハンドルを解放します。
切り分けの為、ダウンロードのファイルと、読出ファイルを別のファイルしたところ、競合しませんでした
読出中に、FTPコマンドで書き込もうとして競合しているように見えます(FTPがプロセスで残る)
なにか、いい解決方法ないでしょうか?
試しに、Reader中でも書込みを許可してみたいのですが、記述方法が判りません
長々と申し訳ありませんが、よろしくお願いします