tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル FtpWebRequestでファイル名に「#(シャープ)」が付く場合の対応
投稿日: 2014/09/22(Mon) 13:24
投稿者まつ
VB2010 / Windows7 32bit / Framework4

お世話になります。

FtpWebRequestを使ってWindows7パソコンからSolarisサーバーにファイルを
FTP送信するツールを制作しています。

ファイル名が
AAA@BBB#CCC.DDD
となっていて、FTP送信するとサーバーには
AAA@BBB
と言うファイル名でファイルが送信されてしまいます。
シャープ文字以降のファイル名が反映されません。
文字コードの指定の問題だとは想像しますがよく分かりません
元のファイル名のままで送信するためにはどうコードを書けば良いでしょうか?

一旦文字エンコードして送信後にリネームする方法は試しておりうまくいきます。
パソコン ファイル名変更 AAA@BBB#CCC.DDD → AAA%40BBB%23CCC.DDD
サーバー FTP送信 AAA%40BBB%23CCC.DDD → AAA%40BBB%23CCC.DDD
サーバー FTPリネーム AAA%40BBB%23CCC.DDD → AAA@BBB#CCC.DDD
ただ、サーバー側で1時間おきにファイルをさらに転送するcronが動作しているため
FTP送信中にエンコードしたファイル名のファイルも転送されそうです(未確認)。
なので元のファイル名のまま送信したいです。
なお、ffftpではそのままのファイル名で送信されます。
ファイル名はお客様の仕様のため変更出来ません。

コード
下記ホームページを参考にさせて頂き,ほぼそのままコードを使用しています。
http://dobon.net/vb/dotnet/internet/ftpwebrequest.html

Dim upFile As String = "D:Work\AAA@BBB#CCC.DDD"
Dim u As New Uri("ftp://192.168.XXXX.XXXX/%2fwork/AAA@BBB#CCC.DDD")

Dim ftpReq As System.Net.FtpWebRequest = _
    CType(System.Net.WebRequest.Create(u), System.Net.FtpWebRequest)
ftpReq.Credentials = New System.Net.NetworkCredential("username", "password")
ftpReq.Method = System.Net.WebRequestMethods.Ftp.UploadFile
ftpReq.KeepAlive = True
ftpReq.UseBinary = True
ftpReq.UsePassive = False
ftpReq.Proxy = Nothing
ftpReq.Timeout = 10000

Dim reqStrm As System.IO.Stream = ftpReq.GetRequestStream()
Dim fs As New System.IO.FileStream( _
    upFile, System.IO.FileMode.Open, System.IO.FileAccess.Read)
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()

Dim ftpRes As System.Net.FtpWebResponse = _
    CType(ftpReq.GetResponse(), System.Net.FtpWebResponse)
Console.WriteLine("{0}: {1}", ftpRes.StatusCode, ftpRes.StatusDescription)

ftpRes.Close()

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。