• ベストアンサー

FTPで中途半端なファイルをGETしてしまう。

相手先にてFTPサーバーを構築しファイルをセットして頂き、こちら側よりFTPでGETしていくような形での情報連携を考えています。 数キロバイトレベルのファイルであれば何ら問題無いのですが、数メガレベルになってくると、セット途中のファイルをGETしてしまい、正しいファイルを取得することができません。 (配置途中のファイルがFTP上に見えてしまう) 相手先はLINUXにて構築、こちら側はWIN2012SERVERになります。 FTPでの方式を変更しない形での解決策ってございますでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

同期の問題です。 ファイルサイズが大きくなれば、当然起こりうる問題です。 解決案1) 転送の開始を許可するトリガ用のダミーファイル(サイズが0でも構わない)をFTPのフォルダに置いてもらう。 こちら側では、トリガ用のダミーファイルの有無を監視し、存在したらデータファイルの転送を行い、トリガ用のダミーファイルを削除する。

takepan_toki
質問者

お礼

ご回答ありがとうございます。 現在、この方式(フラグファイルと呼んでいますが)を前提に相手先と調整しています。

その他の回答 (3)

  • weavaest
  • ベストアンサー率15% (157/1020)
回答No.4

ダウロード可能になるまで、ファイル名に何かしたのパターンを決めておくとかはどうですか。 例えばダウンロード可能になるまでは、ドットファイルにしておくとか、プレフィックスで何か記号をつけておくとか。 FTPクライアント側が、フォルダ上にあるファイルは何でもダウンロードするのであれば、ダメかもしれないですね。ただ、FTPサーバーの設定でドットファイルが不可視になっていれば大丈夫かもしれませんね。

takepan_toki
質問者

お礼

ご回答ありがとうございます。 基本的にはMOVEする方式の派生形のような形ですね。検討してみたいと思います。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

同期の概念が抜け落ちた設計になっています。 ファイルを送る方が、何らかの形で受ける方に連絡を取るべきでしょう。 mvコマンドによる方法が提案されていますが、ディレクトリが同じ ボリューム上にあれば瞬間移動なので、企図した通りに動作すると 思いますが、異なるボリュームにマウントされたものではコピーと 同じ動作になるため、同様の障害が発生しますし、時間もかかります。 最も簡単な方法は「こちら側」でもFTPサーバが立ち上がっているはず なので、相手側からファイルを送るようにしたら如何でしょう。 これだと間違いなく同期します。 これがダメな場合は、サーバサイド(送り側)で転送可能ファイルの リストファイルを作り、ファイルが準備できる度に、リストファイルに 名前を追加します。クライアントサイド(受け側)はリストファイルを 取り出し、前回と差のある分のファイルを転送(GET)します。 リストファイルでも非同期問題が発生しますが、名前の終わりに必ず 改行を入れておけば、名前の途中で切れているものを除外することで、 間違いを防げます。ついでに容量も記録しておけば安全でしょう。 このようなポーリング方式はWindowsの基本アーキテクチャに違反 しているので、本来は採用すべきではないのですが、仕様によっては 考えられる範囲でもあるので、一つの方法として提案してみました。

takepan_toki
質問者

お礼

ご回答ありがとうございます。 「こちら側」にFTPサーバーは立ち上がっていないのです(セキュリティ上不可)。 リストファイル方式、検討してみたいと思います。

  • t_ohta
  • ベストアンサー率38% (5241/13712)
回答No.1

Linuxサーバ上で配置途中(コピー中?)のファイルがFTPのファイルリストに出てくる事が問題なのであれば、Linux上で一旦別のディレクトリにファイルを置き、Linuxのファイルシステムへコピーが終わった時点で mv コマンドでFTP用のディレクトリに移動させるとタイムラグが無くなります。

takepan_toki
質問者

お礼

早速のご回答ありがとうございます。 正に仰られる通り、配置途中のファイルがリストに表示されることが原因でした(Windowsでは起こらないのですが、、、)。 ワンクッション入れてのmv試してみます。

関連するQ&A