- PR -

FTP転送でファイルが存在しない場合

1
投稿者投稿内容
はた
会議室デビュー日: 2005/07/07
投稿数: 13
投稿日時: 2005-11-21 20:27
FTPコマンドのGETにてファイルを取得しようとしているのですが、
取得しようとしているファイルが存在しない時、空ファイルが作成
される場合と何も作成されない場合があります。
違いといえばWindowsXPよりコマンドを発行した時は作成され、
WindowsServer2003より発行した時は作成されないということぐらいしか
思い当たらないです。
これはOSの違いによるものなのでしょうか、もしくは何か設定
があるのでしょうか?
ご存知の方、ご教授のほどお願いします。
Uchikoshi
@ITエディタ
会議室デビュー日: 2001/07/27
投稿数: 197
投稿日時: 2005-11-21 22:09
引用:

はたさんの書き込み (2005-11-21 20:27) より:

これはOSの違いによるものなのでしょうか、もしくは何か設定
があるのでしょうか?
ご存知の方、ご教授のほどお願いします。



 そうなるのは、どうもFTPクライアントプログラムの
バージョンの違いによるからだと思われます。

 最近気が付いたのですが、Windows XP以前のFTPと
Windows Server 2003以降のFTPではGET時の動作が少し
異なっているように見えます。次のような感じです。

■Windows XPのFTP
 GETコマンドを入力すると、まずファイルの書き込み先(ローカル側)
のファイルを作成します。
 そして、GETで取得したデータを、転送しながら書き込み、最後に
クローズしているようです。
 が、プログラムのデキがまずく(?)、ファイルが存在しなかった
場合に、最初に作成したローカル側のファイルを削除しないようです。
理由は不明ですが。
 ひょっとして、GET前にそのファイルが存在した場合、
削除してしまうと、まずいからかもしれません(なくなるよりは、まし、という考え方)。

■Windows Server 2003の場合
 GETコマンドを入力すると、まずローカル側に、一時ファイル(〜.TMP
みたいな名前のファイル)を作成します。そしてGETしたデータをその
ファイルに書き込み、最後に、ファイル名をリネーム(ムーブ)して完了します。
 GETするファイルが存在しない場合、単に一時ファイルを削除するだけで、
GET先の(ローカルの)ファイルが作成されたり、変更されたりすることは
ないようです。
 一時ファイルの作成は、C言語でいうところのCreateTemp(だっけ?)みたい
な関数で実現しているので、FTPを終了すると、一時ファイルはプロセス終了
に伴って自動的にクリーンアップされ、跡が残らない。
 というわけなのではないでしょうか?(中を追ったわけじゃないので、推測ですが)


 以上のような違いにより、結果が異なっているのではないでしょうか。
Windows Server 2003のFTPクライアントの方が進化しているように見えます。
が、最後のリネームの段階でエラーになると、変な(内部)エラーメッセージが
出るところを見ると、まだまだツメが甘いのかも。

[ メッセージ編集済み 編集者: Uchikoshi 編集日時 2005-11-21 22:12 ]
はた
会議室デビュー日: 2005/07/07
投稿数: 13
投稿日時: 2005-11-22 09:01
Uchikoshiさんありがとうございます。
やはりOS(というかFTPのバージョンですね)によって動作がちがうのですか...
始めXPで作成していたので、ファイルが存在しない場合に空ファイルが作成され、
仕様的にも空ファイルを作成したかったので、問題ないなーと思ってたのですが...
2003Serverでやったら作成されず、FTP後の別処理にてファイルがありません
って事になったんです。(記述してませんでしたがバッチ処理で行っています)
うーむ、共通の動作にするためには何か策を講じなければならないようですね。
FTP側の処理で回避することってできないでしょうか?
ファイルが存在しない場合は、どちらの場合も空ファイル作成(もしくは作成しない)
はた
会議室デビュー日: 2005/07/07
投稿数: 13
投稿日時: 2005-11-22 14:59
getはOSによって動作が違うようなので、recvでどうかな?と思いやってみたら
recvでは空ファイルが作成されるようですが、たとえば3台PC(A,B,C)があって
AからBのファイルをCに転送って時はrecvだとエラーになるようです。
(自分のPCに送る時しか使えない)
具体的には、操作PCがAで接続したFTPサーバがBの時
get sample.txt \\C_PC\sp_data.txt はOK
recv sample.txt \\C_PC\sp_data.txt はNG
(Windowsのrecvのヘルプではgetと同じと書いてあったが...)
で結局、FTP転送が終了した後でファイルが存在するか確認し、存在しなかったら
空ファイルを作成することにしました。

ただ、ここで思ったのがFTPのエラーの取得というか判断ってできるのだろうか?
って事です。FTPの起動は他の書込みにもありましたが、ftp -s:ファイル名
でコマンドプロンプトより実行してるのですが、ERRORLEVELでも取得できない
ようだし...このやり方では取得できないのでしょうか?
詳しくはわからないけどWSH等から実行すれば取得できるのでしょうか?
1

スキルアップ/キャリアアップ(JOB@IT)