tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルFtpWebRequestでファイル名に「#(シャープ)」が付く場合の対応
記事No11323
投稿日: 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()

[ツリー表示へ]
タイトルRe: FtpWebRequestでファイル名に「#(シャープ)」が付く場合の対応
記事No11324
投稿日: 2014/09/22(Mon) 17:02
投稿者魔界の仮面弁士
> 元のファイル名のままで送信するためにはどうコードを書けば良いでしょうか?

FtpWebRequest だと、Uri クラスが邪魔をして、どうにもならないと思います。
Socketクラスや TcpClient クラスなど、より低レベルな実装から作りこまないといけないかも。


あるいは、FTP.EXE を Process.Start で呼び出すことで代用するとか。

[ツリー表示へ]
タイトルRe^2: FtpWebRequestでファイル名に「#(シャープ)」が付く場合の対応
記事No11325
投稿日: 2014/09/23(Tue) 10:14
投稿者まつ
魔界の仮面弁士様

ご教示ありがとうございます。
了解しました。踏ん切りがつきました。FtpWebRequestは諦めます。

話が面倒になるので書いていませんでしたが
この作業の前にWindowsXP装置から自パソコンにファイルをFTP受信し
さらにそのファイルをSolarisサーバーに送信しています。
WindowsXP→自パソコンも文字デコードしないと受信出来なくてはまっていました。

当初FtpWebRequestの転送速度が遅くて(ftpReq.Proxy = Nothing追加でOK)
実は一端,.NET用FTPクラスライブラリ(TKFP.DLL)に乗り換え制作していました。
しかしリスト,送信受信のコードは動作OKでしたが削除のコードが動作せず
途中で投げていました。

TKFPがファイル名をどう扱えたか覚えていませんが,コードを見ると
「ファイル名の文字コードを指定」みたいな注釈がありますので希望に沿った
動作をしてくれるかも知れません。送信のコードだけ持ってきて試してみます。

Socketは私には荷が重く最初から投げていましたが,どうしてもTKFPでも
ダメな場合は頑張って挑戦してみます。

ありがとうございました。

[ツリー表示へ]