パソコン間のDir関数について

このQ&Aのポイント
  • Visual Basicを使用して他のパソコンのディスク上のファイルの有無をチェックするために、Dir関数が使用されています。
  • 指定したIPアドレスのパソコンとの接続状態によってDir関数の終了時間が異なります。
  • Dir関数の前に繋がっているかを判断する方法やタイムアウト設定、または別の関数を使用して即座にファイルの有無をチェックする方法についての解決策を知りたいです。
回答を見る
  • ベストアンサー

複数のパソコン間のDir関数について

Visual Basic を用いてネットワーク上の他のパソコンのディスク上にあるファイルの有無をチェックするのにDir関数を用いています。 If Dir("\\192.168.24.50\共有データ\aaa.csv") <> "" Then 指定したIPアドレスのパソコンと繋がっていればDir関数はすぐに終了するのですが、繋がっていなければDir関数は約30秒終了しません。 指定したIPアドレスのパソコンと繋がっていなくてもDir関数をすぐに終了したいのですが、何か方法はないでしょうか。 下記方法が可能であれば、ファイルの有無チェックが即座にできそうに思えますが、小生には方法がわかりません。 ・Dir関数の前に繋がっているかを即座に判断できる方法。 ・Dir関数のタイムアウト設定を行う方法。 ・Dir関数を用いずにファイルの有無チェックが即座にできる方法(関数) 何か良い解決案があれば教えて下さい。お願いします。

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

  • ベストアンサー
  • BellBell
  • ベストアンサー率54% (327/598)
回答No.2

少々検索など調べてみましたが、DirやGetAttrに対するタイムアウトは存在しないようですね。 推測混じりですが、共有フォルダをマウント(厳密には違う意味ですが、イメージが伝わるかと造語的に使っています)するまでの、タイムアウトが影響しているのだと思われます。 簡単に検索してみた限りでは情報が見つからなかったので、それが変更できるか否か簡単か否かも不明ですが、それが簡単に変更できるとして、OS全体に影響を与えることや、反映されるまで時間が掛かるなど(OS再起動後に有効など)がかなり高い確率で予想されるため、調査に時間を掛ける必要はないと感じました。 SMB/CIFSプロトコルを自前で実装することで、もしかすると若干早く対象PCにアクセス可能か否か判断できる可能性はあります。 http://www.atmarkit.co.jp/fwin2k/serial/index/index.html http://www.atmarkit.co.jp/fwin2k/network/baswinlan022/baswinlan022_01.html 膨大な労力が予測される割に、得るものは少ないと予測されるため、小生であれば選択しません。(暇なときに、趣味のプログラムの延長でなら楽しめるかも知れません、というレベルですね) 実現可能性が若干高いのは、pingコマンドを発行して対象PCの存在チェックぐらいです。 とは言えこれも、ファイアウォールなどのセキュリティ対策によって応答が返らない可能性や、作成するソフトがウィルスと誤認される可能性などを考えると実現不可能ですね。 上にだらだらと、できないことばかり並べたのは、ここまで調査したので実現不可能だと判明しましたと、業務のプログラム作成の際にクライアントに説明する際の小生の癖です(クライアントもプログラムについて判る人なので)。 で、代替え案としては、 1)カーソルを砂時計にしてアプリ画面は操作不能にして、『待つしかないです、待たないためには対象PCの電源は入れっぱなしにしてください』、あるいは『(サーバーなどの)必ず起動しているマシンにデータを入れましょう』と説明します。 魔法の呪文『仕様です』ですね。 2)待つのは仕方ないとして、アプリケーションが固まってしまうのがフリーズしたかと勘違いされるを避けるために、プログレスウィンドウを表示します。 VBで普通に作るとマルチスレッドではないため、プログレスの表示も固まってしまいます。 プログレス表示専用の別EXEを作成して、起動して最前面表示、Dirの応答が返ったあと(ファイルを開いてから)そのEXEを終了させます。 『困ったときのプログレス』ですね。 3)アプリケーション起動時に一度チェックします。 アプリ起動時には、少々時間が掛かるものです。ユーザーさんの納得も得られやすい。 もちろん、アプリケーション起動後、対象のファイルが必要になるまでに、対象のPCの電源を落とされることもあるでしょうが、待たなければならない可能性は減らせます。 プログレス代わりのスプラッシュを表示します。 4)必ず時間がかかるようにします。 早い時、遅い時があれば、遅い時にはイライラします。ファイルが存在し即次の処理に移れる場合でもタイマーなどで時間を調節して、わざと時間が掛かるようにします。 早い時、遅い時の時間差を調節する目的です。感覚的に言えば、遅い時が30秒としたら、早い時は20秒とかですね。 5)『データを保存してあるパソコンが起動していることを確認してください。対象のパソコンが起動していない場合、応答までに時間が掛かります』と、注意書きを表示する。 対象ファイルを開く処理が頻繁でなければ、メッセージボックスでOKキャンセルでも良いですね。 頻繁で、ボタンクリックで開く場合などは、ボタンの横に赤字で大きいフォントで入れるなど。 『ちゃんと説明書いてるじゃないですか』と逃げます。 逃げや欺瞞の案ばかりですね。 理想で言えば、対象ファイル(CSV)をDB化して、データベースサーバーへの接続ですね。SQLサーバーも無料のものがありますし。 次善はTCP/IPで通信するアプリで、ファイルのデータを読み取り送受信するサーバープログラムが対象PCに常駐していて、データを使用するプログラムはクライアントとしてそのサーバープログラムに接続するって形ですかね。

nori79
質問者

お礼

とても親切な回答、ありがとうございます。 又、タイムアウトの有無の調査&代替案の検討等、感謝致します。 今回、開発しているシステム構成ですが、データ収集用パソコンのCSVファイルをデータ表示用パソコンが取得(5秒周期)し、表示するという仕組みです。 他のパソコンは接続は接続せず、2台のパソコンだけがローカルでLANケーブルに接続している状態です。(セキュリティソフト等も動作していません。) 基本的に2台のパソコンは常に接続しているはずですが、エラー処理として未接続時の確認で表示用パソコンのDir関数が終了しない為に画面がしばらくロック状態に陥りました。 データ表示用パソコンもデータ収集を行っている為、データ収集用パソコンと未接続の場合でも、画面をロックするわけにはいきません。 そこで、いくつか教えていただいた案の中で「Dir関数の前にpingコマンドの発行」が有効だと思いました。 pingコマンドのサンプルプログラムを用いて自宅パソコンで試したのですが、繋がっている/繋がってないに関わらず、pingコマンドはすぐに完了しました。休み明けに会社のシステムでpingコマンドが有効か試してみようと思います。 本当に親切なアドバイス、ありがとうございました。

その他の回答 (1)

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.1

VB6の頃であれば、Win32APIのGetFileAttributeを利用して、ファイルの有無チェックをしていましたね。 ネットワークに対しては行っていませんが、フロッピー(当時は現役でした)に対しては、Dirよりも速度が速かった記憶があります。 VB6標準のGetAttrを使用しなかった理由は、エラー処理の簡単さだったと思います。 .Net以降にも使えるワザかどうか、ネットワークに対して有効かどうかは不明です。

nori79
質問者

お礼

早速の回答、ありがとうございます。 小生のWindows アプリケーションの知識が乏しく、Win32APIのGetFileAttributeの使用方法がわからなかった為、GetAttrを使用して試しましたが、Dir関数と同様に繋がってないパソコンに対しては30~40秒位、GetAttr関数が終了するのに時間を要しました。 (使用しているバージョンはVB6です。)

関連するQ&A

  • DIR関数

    VB6で、あるフォルダ(A)に存在するCSVファイル(複数ファイル)が、別のフォルダ(B)に存在しているかチェックを行いたいのでうが、DIR関数を2重に使用すると、フォルダAの次への読み込み時にエラーになってしまいます。 何か別の方法はあるのでしょうか?

  • EXCEL VBAのDir関数について

    ファイルサーバー上にあるEXCELファイルのVBAで 新規にファイルを作成する際にDIR関数で 同名ファイルの有無チェックを作成したいと考えています。 しかし以下のような処理で行うとチェックするフォルダが My documentsになってしまいファイルの有無チェックが うまくいきません。どのように書けば良いのでしょうか? ご教授ください。よろしくお願いします。 (情報不足でしたらご指摘ください。補足いたします) ChDir "\\サーバー\フォルダ\サブフォルダ" If(""=Dir(ファイル名))then '同名ファイル無 ファイルを保存する処理 Else msgbox "同名ファイルがあります" Endif 環境: サーバー  :WinNT4.0 クライアント:Win98SE or WinNT4.0 EXCEL2000 LAN接続(同一ドメイン)

  • ExcelVBAのDir関数について。

    下記の処理の流れで、「dir_check = Dir(f_name2)」の処理があります。ここで、Excelのファイル名を取得して変数として登録し、 きちんとファイル名が取得出来ていれば、結果抽出の処理を呼び出す 流れに持って行きたいのですが、値を代入できません。 ファイル名は、Excelの施設ファイル名シートのC列から取得して、 同じものを「f_name2」で取得したパスから探し出す仕組みです。 ファイルの有無は、文字数をカウントして結果が0以上ならファイルありの処理です。上手く流す処理の仕方を教えてください。 ご教示頂けますようお願い致します。 For nendo = 1 To 2 path = Worksheets("スタート").Cells(11, 4) path = path & Worksheets("スタート").Cells(8 + nendo - 1, 4) & "\" For shisetsu = 1 To 188 f_name1 = Worksheets("施設ファイル名").Cells(shisetsu + 1, 3) f_name2 = path & Worksheets("施設ファイル名").Cells(shisetsu + 1, 1) & "\" & f_name1 dir_check = Dir(f_name2) If Len(dir_check) > 0 Then dir_err(shisetsu, nendo) = 1 Workbooks.Open Filename:=f_name2 Call 結果抽出 Workbooks(f_name1).Close End If Next shisetsu Next nendo

  • エクセルのVBAからDOSコマンドのDIRを実行したい

    DOSコマンドのDIRコマンドを、エクセルのVBAから実行したいのですがうまくいきません。助けてください。 DOSプロンプト上で、たとえば「DIR c:\*.mdb /s/b > c:\aaa.txt」を実行すると、Cドライブ上の拡張子(MDB)のファイルの一覧を、aaa.txt上に出力できるのですが、それをエクセルのVBAから実行したいのです。 Shell関数で、COMMAND.COMを実行することはできるのですが、それ以降の指定がわかりません。COMMAND.COMを実行した後、DOSプロンプトをアクティブにし、「DIR c:\*.mdb /s/b > c:\aaa.txt」をsendkeyで送れば・・・とアドバイスをうけたりもしたのですが、sendkeyでなくてもできた記憶があります。 よい方法があれば教えてください。 よろしくお願いします。

  • UNIXで2つのdir内のファイルのチェック

    UNIXで2つのdir内に存在するファイルのチェックをやりたいのですが なさけないことにいい方法が思いつきません。 具体的にはDIR-A内に存在するファイルが全てDIR-B内に存在するか どうかをチェックして存在してないものを出力といったことです。 方法はUNIX上で実行できればとくに問いません。

  • Excel for mac 2011でDir関数?

    Excel for mac 2011でDir関数を使用したファイルサーチが出来ません。なぜなのでしょうか? 使用環境は、Excel for mac 2011 ver. 14.1.0, MacOS X 10.6.7, MacBook Airです。 働いている研究室がMac onlyのため、Mac版のExcelにvbaを移植しようと考えているのですが、以下のプログラムが上手く動きません。 ------------------vbaプログラム Private Sub CommandButton1_Click() Dim strPATHNAME As String ' 指定フォルダ名 Dim strFILENAME As String ' 検出したファイル名 Dim ExistFILE As Boolean ' "*.TXT"ファイルの判定 ' 「フォルダの参照」よりフォルダ名の取得 strPATHNAME = MacScript("choose folder") strPATHNAME = Mid(strPATHNAME, 7) 'aliasを削る If strPATHNAME = "" Then Exit Sub ' 指定フォルダ内のTEXTのファイル名を参照する strFILENAME = Dir(strPATHNAME, vbNormal) '<------ここでファイルを検出しない。 ExistFILE = strFILENAME Like "*.TXT" If strFILENAME = "" Then MsgBox "このフォルダにはTXTファイルは存在しません。" Exit Sub End If End Sub ------------------ 上記プログラムは、コマンドボタンを押すとフォルダを指定して、その中の”.TXT”という拡張子のついたファイルを見つけるプログラムです。(実際には何もしないダミープログラムですが) しかしこれを実行すると、Dir関数の所で何も検出してくれません。 ローカル変数を追って、フォルダまでのパスにカタカナが入ったらダメだとか、”alias”が邪魔だとかは解決したのですが、肝心のDir関数が上手く動いていないことに気づきました。 どなたか詳しい方にお願い致します。 どうすれば、指定したフォルダ中の拡張子”.TXT”がついたファイルを見つけることが出来るのか?教えて頂ければ幸いです。

  • DIR関数を使ったファイル名の取得

    おはようございます。 txtファイル名とdocファイル名を取得したく、以下のコードを作成してみました。 DIR関数を使って、ファイルリストボックスのPatternプロバディのように、複数の形式のファイル名を同時に取得する方法はあるのでしょうか? 是非、教えてください。よろしくお願いします。 ----------------------------- Private Sub Form_Load() Dim MyName MyName = Dir("C:\My Documents\*.txt") Do While MyName <> "" MsgBox MyName MyName = Dir Loop MyName = Dir("C:\My Documents\*.doc") Do While MyName <> "" MsgBox MyName MyName = Dir Loop End End Sub -------------------------------------

  • IPアドレスを検査する関数

    与えられたIPアドレスが、指定した範囲に含まれているか否かをチェックしてくれるような関数、もしくはフリーのプログラムはないでしょうか。 IPアドレスの範囲指定は IPアドレス/ネットマスク の型式かまたは (最小のIPアドレス,最大のIPアドレス) の型式で与えられるものとします。 具体的にやりたいことは次のようなことです。 そのような関数があるとして、名前をIpcheckとします。 そして、例えば192.168.0.1 は 192.168.0.0/24 に含まれているので、 Ipcheck( 192.168.0.0/24 , 192.168.0.1) とすると TRUEを返し、 192.168.1.1 は 192.168.0.0/24 に含まれていないので、 Ipcheck( 192.168.0.0/24 , 192.168.1.1) とするとFAULSを返す もしくは範囲指定で 192.168.0.1 は 192.168.0.0~ 192.168.0.8に含まれているので Ipcheck( (192.168.0.0,192.168.0.8) , 192.168.0.1) とするとTRUEを返す。 という機能が欲しいのです。 実はPHPのスクリプトの中でこういう関数を使いたいのです。しかし、PHPの組込み関数にそういうものは無さそうだし、PHPで組んだらかなりオーバーヘッドになりそうなので、CまたはC++でこういうプログラムがあれば、(関数だったらインターフェイス部分は自作して)system関数で呼び出して使おうと考えています。 PHP(バージョン4)で出来る方法を御存じであれば、そちらも紹介して頂けるとありがたいです。 OSはRedhat Linux 9ですが、なるべくOS依存でないものをご紹介下さい。

  • 複数のCSVファイルを1つのファイルにまとめる方法

    EXCELで、あるフォルダ(例:Dir1)に格納されている複数のCSVファイルを読み込んで、そのファイルの1行目をコピーし、別ファイル(a.csv)にペーストしたいと思っております。 例えば、Dir1には1.csv,2.csv,3.csvの3つのCSVファイルが存在した時に、a.csvに出力されるのは、 ----------------------------------- 1.csvの1行目 2.csvの1行目 3.csvの1行目 ----------------------------------- となるのが、理想の形です。 方法を知っている方がいらっしゃったら お教えいただければと思います。

  • コマンドプロンプトのdirで見えないファイルの削除

    不正な記号を使ったフォルダ名とファイルが存在し、削除できずに困っています。 現象は以下の通りです。 ・起動時に毎回チェックディスクが行われ、該当のファイル名やフォルダ名が出てくる。 ・エクスプローラーで削除をすると、「ファイルを削除できません。送り側のファイルまたはディスクから読み取れません。」 ・ひとつ上のフォルダごと削除しようとしても、「指定されたファイルが見つかりません。」 ・コマンドプロンプトでdirで見てもファイル/ディレクトリは表示されない。 (「<DIR> .」と「<DIR ..>」のみで0個のファイル、2個のディレクトリと表示) ・ネットで調べたコマンドを使って削除しても「指定されたファイルが見つかりません」「ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。」で削除できない。   del "\\?\<ドライブ名>:\*****\*****\ファイル名"   rd /s "\\?\<ドライブ名>:\*****\*****\フォルダ名" エクスプローラーのドライブのプロパティ→ツールでチェックディスクを、オプションを両方チェックしてまたは片方ずつで行ってから上の作業をしても同じです。 自分で調べてみてもこれ以上の方法が見つからなかったのですが、削除する方法はあるでしょうか?

専門家に質問してみよう