• ベストアンサー

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

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のアドレスを取得するにはどうしたら良いでしょうか? (サーバーは社内管理していて詳しくありません)

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

  • ベストアンサー
  • 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応答許可していない可能性もあると思います) 位しかないのではないでしょうか