C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: FTP転送について


(過去ログ 12 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■3608 / inTopicNo.1)  FTP転送について
  
□投稿者/ うっちー (1回)-(2007/05/17(Thu) 10:26:32)

分類:[VB.NET (Windows)] 

現在、WindowsApplicationにてFTP転送を行う処理を作成しているのですが、デバッグを
しながらFTP転送を行うと正常に転送できるのですが、Releaseをしたexeで実際にテスト
するとFTP転送が出来ません。 OSは、WindowsXP でVBは、VB.NET 2003です。

以下ソースです。
Dim Writer1 As StreamWriter, Writer2 As StreamWriter
Dim results As String
Dim psi As New System.Diagnostics.ProcessStartInfo
Dim FTPcmd As String = Path.GetTempFileName
Dim myProcess As Process = Process.Start(psi)

Writer1 = New System.IO.StreamWriter(FTPcmd, False, System.Text.Encoding.Default)
Writer1.WriteLine("open 172.XX.X.XXX")
Writer1.WriteLine("ユーザーID")
Writer1.WriteLine("パスワード")
Writer1.WriteLine("bin")
Writer1.WriteLine("put D:\Test\TEST.txt")
Writer1.WriteLine("quit")
Writer1.Close()

psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
psi.RedirectStandardInput = False
psi.RedirectStandardOutput = True
psi.UseShellExecute = False
psi.CreateNoWindow = True
psi.Arguments = "/c ftp -s:" & FTPcmd

results = myProcess.StandardOutput.ReadToEnd

Writer2 = New System.IO.StreamWriter("D:\Test\LOG.txt", True, System.Text.Encoding.Default)
Writer2.WriteLine(results)
Writer2.Close()

myProcess.WaitForExit()
myProcess.Close()
myProcess.Dispose()

File.Delete(FTPcmd)


以下は異常時のコマンドラインの出力ログです。

User (172.XX.X.XXX:(none)): open 172.XX.X.XXX


bin
put C:\TEST.txt
quit

正常時のログも記載しておきます。
ftp> Connected to 172.XX.X.XXX. open 172.XX.X.XXX
220 DPS FTPD Version 2.0 (PrintService Dir : /PS).
User (172.XX.X.XXX:(none)):
331 Password required for ユーザーID.

230 User ユーザーID logged in.
ftp> bin
200 Type set to I.
ftp> put C:\TEST.txt
200 PORT command successful.
150 Opening BINARY mode data connection for 'STOR'.
226 Transfer completed.
ftp: 8506 bytes sent in 0.00Seconds 8506000.00Kbytes/sec. ftp> quit
221 Goodbye.

異常時のログ内容から、すでに相手側に接続されUser名(login名)を要求しているが実際には
接続先のコマンドが当てはまってしまっているようなのですが、テストをしているディレクトリ
に問題があるのでしょうか?
皆様、申し訳ありませんがご助力をお願いします。
引用返信 編集キー/
■3613 / inTopicNo.2)  Re[1]: FTP転送について
□投稿者/ はつね (161回)-(2007/05/17(Thu) 11:45:19)
はつね さんの Web サイト
No3608 (うっちー さん) に返信
> 現在、WindowsApplicationにてFTP転送を行う処理を作成しているのですが、デバッグを
> しながらFTP転送を行うと正常に転送できるのですが、Releaseをしたexeで実際にテスト
> するとFTP転送が出来ません。 OSは、WindowsXP でVBは、VB.NET 2003です。

FTPはコマンドを投げると応答の文字列が返信されてきるときがあります。
つまり、コマンドを投げると応答をまってから次のコマンドを投げるような流れが必要です。
ソースを見ると一方的にコマンドを投げつけているだけですので、デバッグの時は運良く次のコマンドを送ってもFTPサーバが受け取れるタイミングで動作していましたが、exeで行ったときはその限りではなかったという事が考えられます。

引用返信 編集キー/
■3624 / inTopicNo.3)  Re[2]: FTP転送について
□投稿者/ うっちー (2回)-(2007/05/17(Thu) 16:42:45)
私の質問に対する回答ありがとうございます。

回避する為に、色々と試してみたのですが、

その1
バッチファイルを作成して、実行してみる。
psi.FileName = "D:\Test\FTP.bat" バッチファイルを指定する
'psi.Arguments = "/c ftp -s:" & FTPcmd はコメント対応
結果は変わらず、デバッグでは正常・exeではFTP転送が出来ませんでした。

その2
バッチファイルを作成して、シェルにてバッチを実行してみる。
Shell("D:\Test\FTP.bat", AppWinStyle.NormalNoFocus, True)
結果は、デバッグ・exe共に正常に転送できました。

> つまり、コマンドを投げると応答をまってから次のコマンドを投げるような流れが必要です。
しかし、質問させて下さい。「応答をまってから・・・流れ」とはどの様なものなのでしょうか?
申し訳ありませんが、ご助力をお願いします。

引用返信 編集キー/
■3626 / inTopicNo.4)  Re[1]: FTP転送について
□投稿者/ シャノン (161回)-(2007/05/17(Thu) 17:05:06)
No3608 (うっちー さん) に返信
こんなことしなくても、FtpWebRequest…は無いのか、2003だと。
TKFPとか使ってみるとか?
http://uwa.potetihouse.com/library/tkfpdll.html
引用返信 編集キー/
■3627 / inTopicNo.5)  Re[2]: FTP転送について
□投稿者/ 中博俊 (1069回)-(2007/05/17(Thu) 17:14:06)
中博俊 さんの Web サイト
とりあえずrfcみた?
なにみて作ってるの?

引用返信 編集キー/
■3640 / inTopicNo.6)  Re[1]: FTP転送について
□投稿者/ 片桐 (4回)-(2007/05/18(Fri) 00:04:22)
片桐 さんの Web サイト
すなおにバッチファイル作ってShell関数で行っといてええような気がするですね。
というか、自分が作ってきたVBアプリでのFTPも、LinuxのアプリでのFTPも、
だいたい同じやり方でやっぱりFTPコマンドファイル作って流し込んでましたから(汗)
無責任な回答かもしれませんけど、基本、.NETでもそこは無理やり変えなくても良いような気がします。
実際に動いているのを確認できているのですし。

でも、どちらにせよ、中さんのおっしゃるrfcについては目を通しておくことに損はないですですよ。
引用返信 編集キー/
■3654 / inTopicNo.7)  Re[3]: FTP転送について
□投稿者/ はつね (163回)-(2007/05/18(Fri) 10:06:17)
はつね さんの Web サイト
No3624 (うっちー さん) に返信
>>つまり、コマンドを投げると応答をまってから次のコマンドを投げるような流れが必要です。
> しかし、質問させて下さい。「応答をまってから・・・流れ」とはどの様なものなのでしょうか?

※「コマンドを投げると応答を待ってから」は「リクエストを投げるとレスポンスを待ってから」とも言います。

ここが分からないとなると素直に「その2」案でバッチ作ってshell起動が良いですよ。
そうじゃなかったらRFCをちゃんと読んでから現在の方法を改良して実装とかですかね。
引用返信 編集キー/
■3662 / inTopicNo.8)  Re[4]: FTP転送について
□投稿者/ ぽぴ王子 (202回)-(2007/05/18(Fri) 11:25:42)
ぽぴ王子 さんの Web サイト
ちょっと興味を持ったので、思わず TinyFtpDaemon までインストールして調べてみ
た王子が参上!

方式としては FTP.exe にコマンドファイルを与えて自動実行させるという、古来から
使われている方式なわけですが、この場合は「正常なときはこういうコマンドを入力
せよ」と FTP.exe に与えていて、それを勝手に FTP.exe が処理しているだけなので、
コマンドを投げた後の応答を待って…などの処理は不要なはずです。たぶん。

で、何が悪いのか検討してみようとソースを貼り付けて実行してみたわけですが…
動かねえ。

> Dim myProcess As Process = Process.Start(psi)

これ、psi の定義をしたあとの処理だよね?

> Dim myProcess As Process
(中略)
> psi.UseShellExecute = False
> psi.CreateNoWindow = True
> psi.Arguments = "/c ftp -s:" & FTPcmd
> myProcess = Process.Start(psi)

こうだよね?ね?
…ちゃんと動くようなサンプルを置いといてくれよ…(ぶっちゃけモード)

気を取り直して、動くようになったのでテストしてみたわけですが。

> User (172.XX.X.XXX:(none)): open 172.XX.X.XXX
>
>
> bin
> put C:\TEST.txt
> quit

こちらの環境だと、正常時のログもこんな感じで出ましたよ。
Release モードで作成した実行ファイルで動かしてもちゃんと転送できたし。

むしろ、正しくコマンドファイルが作成できて、FTP.exe が正常に起動できているので
あれば、どちらかというとプログラムの問題というよりも FTP サーバ側のログを見た
方がいいと思うのだけど、どうじゃろか。
あとは「FTP転送ができません」のテスト方法の見直しとか。
本当は転送できているのだけど、チェックが甘くてそれを見逃しているとか、そういう
のはよく見ます。FTP に限らずだけど。
まずは FTP サーバのログを見て、サーバ側で転送を受け付けているかを調べてみ
るのが先決だと思います。問題の切り分けは大事だとじゃんぬ先生も言っていたし
ね。

FTP.exe を実行して FTP 転送を行う…というユーザに対して「rfc 見た?」は酷かし
らとか思ったわけですが(笑)、それもまた真実なり。
ただ、いきなり言われても「rfc ってなに?おいしいの?」とかいう話になりそうなの
で、リンクしておきます。

【RFCとは】IT用語辞典
http://e-words.jp/w/RFC.html

【RFCについて】ftp 関係の rfc を日本語訳してくださっている方のサイト
http://hp.vector.co.jp/authors/VA002682/rfc_frame.htm
引用返信 編集キー/
■3670 / inTopicNo.9)  Re[2]: FTP転送について
□投稿者/ うっちー (3回)-(2007/05/18(Fri) 14:14:44)
はつねさん、シャノンさん、 中博俊さん、片桐さん、ぽぴ王子さん、
貴重なご意見、ありがとうございます。

当面は、「その2」案のバッチ作ってshell起動で運用してみます。
皆様から、ご指摘がありました「RFC」を勉強し直してから再度を改良してみます。

また、解らない事がありましたら、利用させて頂きますのでその時は宜しくお願いします。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -