• ベストアンサー

ファイル/フォルダアドレスの取得と区別

VB6 ファイル/フォルダのアドレスを取得してファイル/フォルダの区別を したいのですが、特定の物(サーバー内)がエラーしてしまいます。 リストへ"OLEDragDrop"した時に下記実行させています。 MsgBox Data.Files(1) MsgBox GetAttr(Data.Files(1)) MsgBox Dir(Data.Files(1)) MsgBox Dir(Data.Files(1), vbDirectory) エラーの対象 AとB & 問題無い C A>ファイルの種類:Windows Server A>アドレス:\\server B>コンピューターの種類:Windows Server B>アドレス:\\server\TestB C>ファイルの種類:ファイルフォルダ C>アドレス:\\St_server\TestB\TestC Aは全てエラー >実行時エラー'461': >データの形式が一致しません。 Bはアドレスは取得出来て"Dir"でエラー (GetAttr = 16) >実行時エラー'52': >ファイル名または番号が不正です。 Bはアドレスを取得出来てるのでエラー処理で なんとかなりそうなのですが、Aはアドレスすら取得出来ません。 Aのアドレスを取得するにはどうしたら良いでしょうか? (サーバーは社内管理していて詳しくありません)

  • mmac
  • お礼率94% (64/68)

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

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.6

私の方でも確認しました。確かに、コンピュータ名をドロップした場合、 Files プロパティにアクセスできないですね。 以下のコードを使えば、コンピュータ名は取得できました。 Private Declare Function RegisterClipboardFormat Lib "user32" Alias "RegisterClipboardFormatA" (ByVal lpString As String) As Long Private Sub LI1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) Dim CF_FILENAMEW As Long Dim file As String CF_FILENAMEW = RegisterClipboardFormat("FileNameW") If CF_FILENAMEW > 32767 Then CF_FILENAMEW = CF_FILENAMEW - 65536 ' 16bit値に変換 If Data.GetFormat(CF_FILENAMEW) Then file = Split(Data.GetData(CF_FILENAMEW), Chr(0))(0) ' 末尾の'\0'を削除 MsgBox file End If End Sub

mmac
質問者

お礼

回答有難う御座います。 "\\server"のパスを取得出来ました。 なるほど Clipboard を利用するんですね。コード詳細は後程確認してみます。 複数の場合は出来ないので"\\server"関連は一個単位にして この方法でパスを取得します。(分類はフォルダ指定) それ以外は"Data.Files.Count"と"Data.Files(1)"と"Dir"を使用し ファイル/フォルダを区別します。 Exploreで開くも確認出来ました。 CreateObject("Shell.Application").Explore "\\server" 助かりました。

その他の回答 (5)

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.5

>あとはserverも複数有るため、VBへドロップ時にserverのパス名を取得する方法だけです これが何を言われてるのか良く分からないのですが エクスプローラから選択ファイルを自作アプリにドラッグ&ドロップしたい (そしてその方法が分からない)ということでいいのでしょうか? そうだとしたら以下URL参考になりませんか http://www.atmarkit.co.jp/fdotnet/dotnettips/676dragdrop/dragdrop.html 関連情報(上のURL含む)は ファイル ドラッグ ドロップ アプリケーション VB のキーワードで検索かければ出てきます ※ 初めに書いたように自分でVB触ってないので確認などは一切していません  (というか文法もちゃんと知りませんのでまともなアドバイスは出来ません) ファイルフルパス名が分かれば1文字目の判断だけでドライブなのか UNC名なのかの判断は出来るはずです そうでない内容なのであれば実際にどのようにして何を行いたいのかを もう少し詳しく書いていただかないと分かりません

mmac
質問者

お礼

足 度々の回答有難う御座います。 多数の質問で分かりにくくなってすみません。 エクスプローラーからVBへドロップした時に"\\Server" という文字(パス名)を得たいのです。 私の中でその唯一の方法が Data.Files(1) だったのですが、"\\Server"はエラーしてしまいます。 他にもファイルに対してのドラッグ/ドロップ方法は有るのですが ファイルで無いため、このパスをVBでは取得出来ない??のでしょうか。 "\\Server"などサーバー類は手動でパスを入れるしかない? ------------------------------------------------------------------------ If Data.GetFormat(vbCFFiles) Then '(ドロップファイルをWindows エクスプローラのファイル リストかどうかの判定) で調べると、[\\Server]はFalse が返ってきます。他はTrue [\\Server]は通常のファイル/フォルダ操作では出来ないみたいです。

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.4

>BとCですが、Bをプロパティ表示すると全般にCP名・CP種類・ドメイン >と表示され、編集出来ない様管理されています。 この辺りはファイルかフォルダかという話もありますが アクセス権限がどのようになっているのかも関係しきてるのではないかと思います 試したわけではありませんので以下そのつもりで WindowsのUNC(\\IPアドレス\**\**)形式で ファイル名指定されている場合 A)がPC名=IPに該当するのは既に書いたとうり B)の場合 必ずフォルダになるはずです    ※ ここがきちんと確認したわけではないところですが      Windowsの共有設定の関係上IP名に続く      名称(単純に言えば \TestB にあたる部分)      がファイル名になるという設定は出来ないはずです      (必ず \\IP\共有フォルダ名 となるはず) c)の場合はフォルダ名・ファイル名の場合も混在します BとCの区別は \ の数を調べれば判断付くはずです 環境限定なのであればの話ですが上記条件で決め打ちで 作ってしまってもいいのではないかと思います(という勝手な意見) OS上から普通にショートカット作ってもB の時はちょっと 特殊な作り方されてるようですので(リンク先の変更不可) この辺り(ネットワークの共有フォルダ名)は レジストリの情報見てた様な気もしますが未確認です

mmac
質問者

お礼

回答有難う御座います。 サーバー内のフォルダがなんとなく理解出来てきました。 >(必ず \\IP\共有フォルダ名 となるはず) なるほどと思ったのですが、プリンタが2つ\\server\配下にありました。 まあこの辺は無視するしかないと思いますが・・。 \ の数でPC名判断は使わしてもらいます。 あとはserverも複数有るため、VBへドロップ時にserverのパス名を取得 する方法だけです。肝心なここが出来ないとこの一週間が無駄になってしまいます・・。

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.3

> 実際にはPCが有る無しではなくショートカット用アドレスを取得したいです。 「アドレスを取得」というのがちょっと意味不明ですが、 ショートカットにしたりExplorerに使うのは、引数の「Data.Files(1)」そのままでOKでしょう。 > ドロップした物のアドレスを保管してショートカットで開くソフトを検討しています。 > (ファイル/フォルダ区別はフォルダの場合エクスプローラで開くため) この場合、知りたいのは、引数が「ファイルなのかフォルダなのか」どちらなのか、ということですよね。 コンピュータ名は、「\\コンピュータ名」という形になってますから、 Left(Data.Files(1),2)="\\" And InStr(Mid(Data.Files(1),3),"\")=0 で判定できます。 それなら、コンピュータ名の時は、ファイルフォルダの判別処理は行わないようにし、開く時はフォルダと同様にエクスプローラで開くようにすればいいんじゃないでしょうか。

mmac
質問者

お礼

回答有難う御座います。 すみません用語が不理解でした「アドレスを取得」= パス 「Data.Files(1)」でパスを取得出来ると思ったのですが、 PC名(マイコンピュータなど)をドロップするとData.Files(1)でエラーしてしまいます。 この時点で >Left(Data.Files(1),2)="\\" And InStr(Mid(Data.Files(1),3),"\")=0 が利用出来ません。 Data.Files(1)の使い方がおかしいのでしょうか? Private Sub LI1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) MsgBox Data.Files(1) End Sub

mmac
質問者

補足

すみません、マイコンピュータにはパスがありませんでした。 \\server\ などの サーバーのPC名でした。 serverのパス ⇒ \\server [Data.Files(1)] = × 通常のパス ⇒ \\server\TestB [Data.Files(1)] = ○

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.2

ちょっと追記 A)は#1に書いたようにPC名に該当します > B>コンピューターの種類:Windows Server > C>ファイルの種類:ファイルフォルダ とかかれてますがこれが間違い 両方ともファイルもしくはフォルダとなります

mmac
質問者

お礼

回答有難う御座います。 なんとなく見えてきた気がします。 PC名にファイルやフォルダ操作は出来ないって事ですね。 BとCですが、Bをプロパティ表示すると全般にCP名・CP種類・ドメイン と表示され、編集出来ない様管理されています。 B(フォーム名:TestA-Serverのプロパティ) C(フォーム名:TestBのプロパティ) でもアドレスは表示されるので確かにフォルダですね。 実際にはPCが有る無しではなくショートカット用アドレスを取得したいです。 ドロップした物のアドレスを保管してショートカットで開くソフトを検討しています。 (ファイル/フォルダ区別はフォルダの場合エクスプローラで開くため)

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

VBについては使ってないので知りません A)はファイルやフォルダではなくてPC名(IPアドレス)に該当するものになります (ファイル操作とは根本的な扱いが違います) そのPCが存在しているかを知りたいのでしょうか? PING投げて応答が返ってくるか(但しPing応答許可していない可能性もあると思います) 位しかないのではないでしょうか

関連するQ&A

  • フォルダ内のファイル名取得の仕方が分かりません

    Apache2.0.47、PHP4.3.2で使用しています。 フォルダ内のファイル名の取得を以下のように書いています。 (scandirは使えませんでした) <?php $dir = "test_dir"; $dh = opendir($dir); while (false !== ($filename = readdir($dh))) { $files[] = $filename; } sort($files); print_r($files); ?> "."と".."も取得されるので、以下のように変更したのですが同じ結果でした。 <?php $dir = "test_dir"; $dh = opendir($dir); while (false !== ($filename = readdir($dh))) { if(filename!=". "){ if(filename!=".. "){ $file[] = $filename; } } } sort($files); print_r($files); ?> "."と".."をはぶいたファイル名だけを取得したい場合にはどうすればよいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • フォルダーとファイルの認識

    フォルダーとファイルを認識するため、 例として下記のVBAを実行します。 If (GetAttr("D:\winpobox-0.1\win2000") And vbDirectory) = vbDirectory Then MsgBox "フォルダ。" Else MsgBox "ファイル。" End If 結果は、「フォルダ」となりますが、 「win2000」が「win.2000」とwinと2000の間に「.」(ドット)が入ると「ファイルが見つかりません。」となります。 フォルダー名にドットが入っても識別できる方法はありますか。 よろしくお願いいたします。

  • ダイアログボックスからフォルダ名を取得し、フォルダ内のCSVファイルを

    ダイアログボックスからフォルダ名を取得し、フォルダ内のCSVファイルをすべてアクセスのテーブルにインポート使用と思っています。 ところがCSVファイルの数の分だけ、1つめのCSVファイルの中身が繰り返しインポートされてしまっています。 どの部分に誤りがあるのでしょうか? お知恵を拝借できますでしょうか・・・。 コードは以下になります。 Private Sub cmd06_Click() Dim MyFile As String Dim MyName As String Dim MyName02 As String Dim strFolderName As String strFolderName = GetFolderName() 'フォルダ選択ダイアログを表示 If Len(strFolderName) > 0 Then '選択結果を評価 MyFile = strFolderName & "\*.csv" '【拡張子csvのファイルのみ取得】 MyName = Dir(MyFile, vbNormal) MyName02 = "\" & MyName Do While MyName <> "" If MyName <> "." And MyName <> ".." Then If GetAttr(strFolderName & "\" & MyName) <> vbDirectory Then DoCmd.TransferText acImportFixed, "T03_インポート定義", "T03_全CSVデータ", strFolderName & MyName02, False, "" '【取得したファイルをインポート】 End If End If MyName = Dir Loop Else MsgBox "フォルダは選択されませんでした" End If MsgBox "データのインポートが終了しました" End Sub

  • フォルダ内のファイル名を取得、エラーになる原因は?

    指定したフォルダ内のファイル名を1つずつ取得するサンプルコードです。 function ForlderInImgGet() { CR = String.fromCharCode(13); folder = new Folder ("../img/"); files = folder.getFiles(); for (i=0; i<files.length; i++) { txt = txt + files[i].fullName + CR; } alert(txt); } 実行すると「Folder is not defined」というエラーになってしまいます。 画像ファイルは、 ルートディレクトリ\test\img\に01.jpg~10.jpgがあります。 jsファイルは、 ルートディレクトリ\test\js\に配置してあります。 一体なぜこのようなエラーが出てしまうのでしょうか。

  • ファイル名の取得

    こんばんは。 指定したフォルダ(IEキャッシュ)のサブフォルダ以下のファイル名を取得しようとしています。 コードは次のとおりなのですが、ファイル名の取得ができません。どこがまずいのか、是非アドバイスを下さい。 よろしくお願いします。 -------------------------- Private Sub Form_Load() Dim FileName As String FileName = Dir("C:\WINDOWS\Temporary Internet Files\CONTENT.IE5\*\*.gif") MsgBox FileName End Sub --------------------------- **環境** Win98se , VB6.0sp5 ,IE5.5sp2

  • ファイルの日付取得

    お世話になります。 Perl/CGIで悩んでいるところがあり質問させていただきに参りました。 サーバ上の、とあるフォルダに下にある.htmlファイルの一覧を表示・リンクし、またその各ファイルの最終更新日付を表示したいと思っています。 そこで下記の様な、ソースを書きました。 opendir (DIR,$dir) ; @files = grep { /\.html$/ } readdir DIR; close DIR; foreach $filename (@files){ $modtime = (stat($filename))[9] ; # ($sec, $min, $hour, $mday, $mon, $year) = localtime($modtime); $year = $year + 1900; $mon= $mon + 1; print "<a href=html/$filename>$filename</a>[作成日:$year 年$mon月$mday日$hour時$min分$sec秒]<P>\n"; } これを実行すると、複数ファイルのうち、1つのファイルだけが、なぜか正常に表示され、あとのファイルはすべて 「1970 年1月1日9時0分0秒」となってしまいます。 これはどうしてなんでしょうか?? 分かる方がいらっしゃいましたら、ご教授の程、よろしくお願いします。 環境:Windows 2000 Server,IIS,ActivePerl

    • ベストアンサー
    • Perl
  • 複数フォルダに格納されたファイル名取得VBA

    お世話になっております。 あるフォルダに複数のフォルダが格納されており、更にそのフォルダの中にあるファイルの情報を取得するプログラムを書いたのですが、実行すると下記のようなエラーとなってしまいます。 ■エラー プロシージャの呼び出し、または引数が不正です 下から3行目、「buf = Dir()」が問題であることはわかるのですが、 何が問題でどのように解決したらいいかわかりません。 どなたかご教授の程よろしくお願い致します(>_<) ------------------------------------------------------------------------ Sub test() Dim buf As String Dim fName As String Dim msg As String buf = Dir("*.*", vbDirectory) Do While buf <> "" If GetAttr(buf) And vbDirectory Then If buf <> "." And buf <> ".." Then fName = Dir(CurDir & "\" & buf & "\" & "*.jpg") Do While fName <> "" cnt = cnt + 1 Cells(cnt, 1) = buf Cells(cnt, 2) = fName msg = msg & buf & "\" & fName & vbCrLf fName = Dir() Loop MsgBox msg End If End If buf = Dir() Loop End Sub ------------------------------------------------------------------------ これが実現できないと細かい作業を毎日繰り返す事となり、 かなり業務不可が高いです。。 繰り返しになってしまいますが、どなたかご回答よろしくお願い致します。

  • フォルダの中身がカラか調べる

    vbaです。 フォルダ(新しいフォルダ)を作り、その中にサブフォルダ(Test用フォルダ)を作って --------------------------------------------------------- Sub フォルダの中身がカラか調べる() If Dir("D:\新しいフォルダ\Test用フォルダ\*.*") = "" Then MsgBox "カラです" Else MsgBox "カラではありません" End If End Sub --------------------------------------------------------- を実行すると、新しいフォルダの中にフォルダがあるのに、 「カラです」が表示されてしまいます。 新しいフォルダのファイルサイズは0です。 If Dir("D:\新しいフォルダ\Test用フォルダ\*.*") = "" Then のコードは、フォルダの中のファイル数ではなく、 フォルダのサイズを取得してしまうのでしょうか?

  • VBScriptでフォルダ内の全ファイル名取得

    こんにちは VBScriptでツールを作成しています。 フォルダA内の全ファイルをリネームして 別フォルダB内に同じファイル名があればリネームして フォルダA内のファイルをコピーしたいのですが 一度にフォルダ内の全ファイル名を取得する方法が分かりません。 なにかいい方法は無いでしょうか?よろしくお願いします。

  • クラスパス配下のファイル名一覧取得

    ある、クラスパスの通ったフォルダ(仮にdir)があったとして そのフォルダ内にあるファイル名一覧を取得したいと考えております。 dir/ ->a.txt ->b.txt ->c.txt 結果:a.txt、b.txt、c.txt ClassLoader クラスなどを用いて取得しようと考えたのですが、 getSystemResource() メソッドなどはファイル名まで指定しないと 取得できないみたいで、現時点で望む処理ができない状態です。 フォルダまでの絶対パスの指定はしたくないため、 Fileクラスも使用できない状態です。 このような処理をやったことがある方は、 どうかご教授お願いいたします。