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

ネットワーク越しのファイル存在調べ

環境/言語:[Windows2000, Xp/VB.NET]
分類:[.NET]

はじめして。sitoraといいます。
いつもTips、掲示板で勉強させてもらってます。
お世話になってます。

いまネットワークでつないだPCに、とあるファイルが存在するか調べてから
ローカルにコピーするものを作っています。
存在するか調べるのに6、7秒ほど時間がかかることがありますが、ここはできれば
3秒前後であってほしいんです。

時間がかかるというのはネットワークの環境に依存するものなのでしょうか、
それとも何かべつの方法があるのでしょうか?
教えてください><

ネットワークはあまり詳しくないのですがドメインに参加しています。
ファイルの存在確認をするコードの一部は以下のとおりです。

(strFileName(String型)にファイルパスが入っているものとして、)
(ret(Boolean型)に存在するかしないかをTrue/Falseをいれています)
-------------------------------------------------------------
        If IO.File.Exists(strFileName) Then
            ret = True
        Else
            ret = False
        End If
-------------------------------------------------------------
(どこに時間がかかったか調べようとステップ実行していたところ、)
(はじめのIf文から次の行に行くまでに時間がかかっていました。)

よろしくお願いします。
■No4334に返信(sitoraさんの記事)
sitoraさん、こんにちは。
> (どこに時間がかかったか調べようとステップ実行していたところ、)
> (はじめのIf文から次の行に行くまでに時間がかかっていました。)
デバッガでの動作時間はあてにしないほうがいいです。

方法はあってると思いますので、Existの開始前のTickTimeを取得しておき
終了後にどれだけかかったかを表示したほうが正確な時間がわかるかと思います。
(C#でごめんなさい)

bool ret=false;
int s_sec = Environment.TickCount;
if(System.IO.File.Exists(@"\\xxx\xxx.txt")
ret = true;
else
ret = false;

MessageBox.Show(string.Format("{0}",Environment.TickCount - s_sec));

これでも遅いようならネット環境、PCスペックのせいですかね。
ゆさん、返答ありがとうございます。

時間を計ってみたところ、6800[msec]程度かかっていました。

今、一度の実行で立て続けに3箇所、ファイルを探しに(Existしに)いっているのですが、探す先のPCは同じ所のせいか1回目だけ時間がかかって2回目以降は 0[msec]だったりしています。
なんとも不思議です。<ネットワークわからないもので。。。

やはり環境のせいみたいです;;
■No4344に返信(sitoraさんの記事)
> ゆさん、返答ありがとうございます。
>
> 時間を計ってみたところ、6800[msec]程度かかっていました。
> …
> 今、一度の実行で立て続けに3箇所、ファイルを探しに(Existしに)いっているのですが、探す先のPCは同じ所のせいか1回目だけ時間がかかって2回目以降は 0[msec]だったりしています。
> なんとも不思議です。<ネットワークわからないもので。。。
> …
> やはり環境のせいみたいです;;

  ネットワークの問題もありますが、1回目が長く2回目以降は
  極端に早い・・・それはキャッシュにのった為でしょう。
  相手のマシンもディレクトリ参照しますし、自分の方も情報を
  受け取りますので、双方にバッファリングが発生しますので。

  逆に更新されたものが見えないような場合もあります。
  ネットワーク越は、トラブルも抱えていますので、注意が必要
  だとは思います。

  要はうまく使う・・・と言うことになってしまいますが。

以上。
■No4334に返信(sitoraさんの記事)
> -------------------------------------------------------------
> If IO.File.Exists(strFileName) Then
> ret = True
> Else
> ret = False
> End If
> -------------------------------------------------------------

  この部分で・・・

  Dim fi as FileInfo
fi = New FileInfo( strFileName )
If fi.Exists Then
ret = True
Else
ret = False
End If

  では、時間に変化が発生しますか?

以上。
> 時間を計ってみたところ、6800[msec]程度かかっていました。
> …
> 今、一度の実行で立て続けに3箇所、ファイルを探しに(Existしに)いっているのですが、探す先のPCは同じ所のせいか1回目だけ時間がかかって2回目以降は 0[msec]だったりしています。
> なんとも不思議です。<ネットワークわからないもので。。。
> …
> やはり環境のせいみたいです;;
もし、相手側のマシンが固定的に決まるのであれば、起動時にスプラッシュ
表示などしながら、ダミーアクセスをしておくという手も使えますね^^
それで一度キャッシュされてしまえば次回からはすんなりいけるかと・・・
岡田さん、ゆさん、返答ありがとうございます。

アクセス先のPCは今は1〜2台ですが、増えることもありえます(TT)

FileInfo>一度試してみていたのですが時間に変わりはありませんでした。
"File"と"FileInfo"の違いは微妙にわかりません。どんな違いがでてくるんですか?

…ちょっと質問なのですが、
一度アクセスしてキャッシュされるアクセス先っていうのは1ヵ所だけなのでしょうか?
無知ですみません。
> …ちょっと質問なのですが、
> 一度アクセスしてキャッシュされるアクセス先っていうのは1ヵ所だけなのでしょうか?
レジストリのパスキャッシュサイズ次第かと思います。
Win2000,XPでは、どうなってるのかよくしりません^^;

こちらで3つのPCに相手に定周期でダミーアクセスして常に高速検索
できるのは確認できましたよー
応答が遅い原因が名前解決だとすれば、サーバー名ではなくIPアドレスで
アクセスすれば速くなるかもしれません。

例)
\\ServerName\Share\file

\\192.168.0.1\Share\file
デバッグビルドでも良いのでビルドされたEXEを直接起動した場合動作速度に差はありますか?
もしEXEを直接実行して問題なければ気にしないほうが良いかもしれません。
当方でも開始ボタンから実行した場合色々な処理の最初の1回がなぜか遅いです。
その後作成されたEXEから実行するとすんなりいきます。

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