• ベストアンサー

指定フォルダの絶対パス取得

初歩的なことですが教えてください。 VB.netにて、指定したフォルダの相対パスに対する絶対パスの取得を行いたいのですが、良い方法が見つかりません。 「Path.GetFullPath メソッド」を使用して見ましたが、存在しないパス「例:\A\」を指定すると、勝手に「例:C:\A\」のように絶対パスが割り付けられてしまいます。実際に存在するパスを検索して取得することは出来ないのでしょうか? 例:「ABC」というフォルダが「C:\program files」や「D:\」などに存在するという結果です。

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

  • ベストアンサー
回答No.3

前置きが長いですが。。。 「パス」について http://e-words.jp/w/E38391E382B9.html 頂点から目的のファイルやフォルダまでのすべての道筋を記述するのが「絶対パス」 起点となる現在位置から、目的のファイルやフォルダまでの道筋を記述するのが「相対パス」 他に例えます。 [起点] 私の家の住所は、○○県○○市○○区○○町○○番地です (自宅住所が起点) [起点からの道筋を辿った相対パス] 家から、南側に3つ目の交差点があり、そこにA点というコンビニがあります (南側に3つ目の交差点が相対パス) [絶対パスを算出] 起点の家から辿って、A点までの経路を考えると、そのA点の住所は、△△県△△市△△区△△町△△番地になります。 (A点住所が絶対パス) 上の例から、相対パスから絶対パスを算出するためには、絶対パスの起点が必要となることがわかると思います。 ここから本題 >実際に存在するパスを検索して取得することは出来ないのでしょうか? >例:「ABC」というフォルダが「C:\program files」や「D:\」などに存在するという結果です。 私が言いたいことは、#1さんが言われている事と、全く一緒です。 フォルダ名だけで存在チェックをしたいのであれば、起点が無いので、全フォルダを調べなければならないです。 それでもよければサンプルです。 http://okweb.jp/kotaeru.php3?q=1561188 をベースに、.NET用に変換しています。 アクセス権の無いフォルダを参照しようとすると落ちます。 (解析しやすいように、あえてエラー処理を入れていません。) Option Explicit On Imports System.IO Imports System.Text Module Module1   '-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*   Private Const LIST_FILE As String = "C:\FileList.txt"   '←ログ出力先   '-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*   Private stmWriter As StreamWriter   '-----------------------------------------------   Sub Main()     Const DEF_検索ルート As String = "C:\WINDOWS"     Const DEF_検索フォルダ名 As String = "System32"     Dim l_strWk As String = _         "以下の論理ドライブが存在しています" & vbCrLf & vbCrLf _         & Join(System.Environment.GetLogicalDrives(), vbCrLf) & vbCrLf & vbCrLf _         & "しかし時間がかかるので[" & DEF_検索ルート & "]以下だけを対象にします"     Call MsgBox(l_strWk, MsgBoxStyle.Information)     'ログファイルがあったら抹消     If File.Exists(LIST_FILE) Then       Call File.Delete(LIST_FILE)     End If     'ログファイル準備     stmWriter = New StreamWriter(LIST_FILE, False, Encoding.GetEncoding(932))     'リスト作成メイン実行     Call CreateFileList(DEF_検索ルート, DEF_検索フォルダ名)     'ログファイルクローズ     stmWriter.Close()     'オブジェクト開放     stmWriter = Nothing     MsgBox("終了")     Call System.Diagnostics.Process.Start(LIST_FILE)   End Sub   '-----------------------------------------------   'リスト作成メイン   '-----------------------------------------------   Sub CreateFileList(ByVal p_str起点 As String, ByVal p_str検索フォルダ名 As String)     Dim l_strサブフォルダ As String     '絶対パスを取得     Dim l_str絶対パス As String = Path.Combine(p_str起点, p_str検索フォルダ名)     '存在チェック     If Directory.Exists(l_str絶対パス) Then       'ログに出力       stmWriter.WriteLine(l_str絶対パス)     End If     'パラメータの起点フォルダ以下のサブフォルダ階層をチェックする     For Each l_strサブフォルダ In Directory.GetDirectories(p_str起点)       'サブフォルダで再帰       Call CreateFileList(l_strサブフォルダ, p_str検索フォルダ名)     Next   End Sub End Module

i-miyo
質問者

お礼

お返事が遅くなり申し訳ありませんでした。 詳細かつ分かり易い回答を頂き、ありがとうございます。早速、参考にさせて頂きます。

その他の回答 (2)

  • sam_inoue
  • ベストアンサー率47% (27/57)
回答No.2

.NETは分からないのですが、 FSOのGetAbsolutePathNameは使えないのでしょうか。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

>例:「ABC」というフォルダが「C:\program files」や「D:\」などに存在するという結果です。 全検索しなくちゃいけなくなるから、あんまり(本当に全検索したい場合を除いては)現実的とは言えないと思います。 本当にやるつもりならドライブリストから全ドライブのサブフォルダを全部 検索することになるデス

i-miyo
質問者

お礼

早速の回答ありがとうございます。 思っていたより厄介そうですね。今回頂いた回答は参考にさせて頂きます。

関連するQ&A