DOBON.NET DOBON.NETプログラミング掲示板過去ログ

FTP接続時、サーバー側の時刻を知るには?

環境/言語:[OS : Windows Vista / 言語 : Visual Basic .NET / .NET Framework : 3.5]
分類:[.NET]

VB2008EEでFTP接続およびアップロードのプログラムを錯視する際に参考にさせていただきました。
ありがとうございます。

アップロードを実施する際に、サーバー側とローカル(パソコン)側のタイムスタンプを比較して、ローカル側が新しければ上書きする。
というプログラムを書きました。

処理自体は正常にできています。

ただ、ローカル側と時刻とサーバー側の時刻に5分ほどずれがあるのです。

そのためアップロード後にちょっと修正してすぐアップロードすると、タイムスタンプの比較ではサーバー側の方が新しいファイルと判断されてしまいます。

アップロード時に時刻差を記録しておく…手もありますが、できればアップロード前に時刻差を知りたいと思っています。

つまりは「サーバー側の現在時刻を取得する」ということなのですが、方法が判りません。

http://msdn.microsoft.com/ja-jp/library/system.net.webrequestmethods.ftp%28VS.80%29.aspx
をみても、サーバー側の時刻を知るクラス、フィールド、メソッドは発見できませんでした。


「サーバー側の現在時刻を取得する」方法、もしくはそれに変わる方法がありましたら、よろしくお願いします。
> 「サーバー側の現在時刻を取得する」方法、もしくはそれに変わる方法がありましたら、よろしくお願いします。

ちなみにサーバー側のOSは何ですか?
時刻同期機能を使用する手法もあるかと思いますが、それだけ
では、今回の場合不十分かと。

http://www.atmarkit.co.jp/fwin2k/operation/winntp01/winntp01_01.html

FTPにてファイル同期を行うケースは、私も過去経験があります。

Windosサーバーと、IBMホストとで行いましたが、ファイルの更新日時
が、やはりどうしても必要になったので・・・

FTPサーバー上のやりとりするファイルの中身に、そのファイルを生成
する時点での日時情報を書いてもらい、クライアント側は、とりあえず、
そのファイルをダウンロードしてその日時を確認することで回避しました。

ただし、生成する側のサーバーのカレンダータイマーとクライアント側の
カレンダータイマーに差異が無い(例えば5秒以内とか)と言う前提でな
いと、その差異内でのファイルのやりとりを行うと、当然、新しいはずの
ファイルに古いファイルを上書きしてしまうことになります。

よって、ファイルの更新日時情報を信用するやりとりには、別の何等かの
安全を保障する仕掛けが必要です。

あとFTPサーバー側でインデックスファイルが設置されているならば、
それを利用する手もありますが、IISのFTPサーバーは無かったと思
います。最近そのインデックスファイルのお世話になることが無いので、
必要な情報があったかについては、未確認です・・・あしからず。

以上。参考まで
■No25601に返信(ひらぽんさんの記事)
>>「サーバー側の現在時刻を取得する」方法、もしくはそれに変わる方法がありましたら、よろしくお願いします。
>
> ちなみにサーバー側のOSは何ですか?

最終的にフリー配布予定のものです。
そのため特定のOSに絞ることができません。
もっとも多いのはLinuxではないかと思います。
■No25602に返信(オショウさんの記事)
> 時刻同期機能を使用する手法もあるかと思いますが、それだけ
> では、今回の場合不十分かと。
>
> http://www.atmarkit.co.jp/fwin2k/operation/winntp01/winntp01_01.html

テストしたものはサーバー側の方が時刻がずれていましたので、同期はちょっと。

> FTPサーバー上のやりとりするファイルの中身に、そのファイルを生成
> する時点での日時情報を書いてもらい、クライアント側は、とりあえず、
> そのファイルをダウンロードしてその日時を確認することで回避しました。

ダミーのファイルを書込みして、そのタイムスタンプの差異を見る。
というのが現実的な方法かも知れません。

サーバー側ファイルの方が新しい場合に限って実行すれば、回数が抑えられそうです。
> 最終的にフリー配布予定のものです。
> そのため特定のOSに絞ることができません。
> もっとも多いのはLinuxではないかと思います。

不特定多数のサーバーが相手となると・・・

http://social.msdn.microsoft.com/Forums/ja-JP/vbgeneralja/thread/0fda3e41-0b16-4e43-b02a-e7fb553b508a

こちらで Azuleanさんが回答してますが

> ダミーのファイルをアップロードして、すぐさまに時刻を取得してみて(おおよその)時差を測る。
> そんな実装をしているFTPクライアントがあったような気がします。
> 今回の場合に適用できるかどうかは分かりませんが…。

これが一番無難な対応な気がします。

と書いたところで・・・

> ダミーのファイルを書込みして、そのタイムスタンプの差異を見る。
> というのが現実的な方法かも知れません。

かぶってしまいましたね。(^ω^;
2009/10/21(Wed) 10:07:02 編集(投稿者)
2009/10/20(Tue) 13:01:33 編集(投稿者)

> http://social.msdn.microsoft.com/Forums/ja-JP/vbgeneralja/thread/0fda3e41-0b16-4e43-b02a-e7fb553b508a
>
> こちらで Azuleanさんが回答してますが
>
>>ダミーのファイルをアップロードして、すぐさまに時刻を取得してみて(おおよその)時差を測る。
>>そんな実装をしているFTPクライアントがあったような気がします。
>>今回の場合に適用できるかどうかは分かりませんが…。

やはり、これでしょうか。


http://social.msdn.microsoft.com/Forums/ja-JP/vbgeneralja/thread/0fda3e41-0b16-4e43-b02a-e7fb553b508a
> ですので、海外のサーバーであろうとなかろうと、
> RFC3659に準拠したFTPサーバーであれば、
> 実行したPCのシステムローカルな時刻が取得されます。

というのは勉強になりました。
テストで使ったサーバーは準拠していないってことですね。
新しい仕様だけに仕方がないと言えますね。


まずはダミーファイルを書き込むという方法で解決しようと思います。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板