- ベストアンサー
指定フォルダの絶対パス取得
初歩的なことですが教えてください。 VB.netにて、指定したフォルダの相対パスに対する絶対パスの取得を行いたいのですが、良い方法が見つかりません。 「Path.GetFullPath メソッド」を使用して見ましたが、存在しないパス「例:\A\」を指定すると、勝手に「例:C:\A\」のように絶対パスが割り付けられてしまいます。実際に存在するパスを検索して取得することは出来ないのでしょうか? 例:「ABC」というフォルダが「C:\program files」や「D:\」などに存在するという結果です。
- i-miyo
- お礼率43% (44/101)
- Visual Basic
- 回答数3
- ありがとう数2
- みんなの回答 (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
その他の回答 (2)
- sam_inoue
- ベストアンサー率47% (27/57)
.NETは分からないのですが、 FSOのGetAbsolutePathNameは使えないのでしょうか。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>例:「ABC」というフォルダが「C:\program files」や「D:\」などに存在するという結果です。 全検索しなくちゃいけなくなるから、あんまり(本当に全検索したい場合を除いては)現実的とは言えないと思います。 本当にやるつもりならドライブリストから全ドライブのサブフォルダを全部 検索することになるデス
お礼
早速の回答ありがとうございます。 思っていたより厄介そうですね。今回頂いた回答は参考にさせて頂きます。
関連するQ&A
- 相対パスから絶対パスの取得
相対パスを指定することにより、絶対パスを取得したいのですが・・・。 どうすればいいでしょうか? ■状況■ VB6.0 Windows2000 ひとつ上の階層に行きそこのTableフォルダ内のsample.htmlのパスを取得したい。 Dir$("..\Table\sample.html")としてみたのですができませんでした。
- ベストアンサー
- Visual Basic
- C# 2つのフォルダの相対パスを求めたいが…
お世話になります。 二つのフォルダの相対パスを求めるメソッドを組みたいのですが、 MakeRelativeUriメソッドを使用すると実行時にどうしても InvalidOperationExceptionが出てしまいます。 下記がそのソースです。 string stPath = "C:/a/~~~"; stPath = stPath.Replace("/","\\"); Uri uri = new Uri(Path.GetFullPath(stPath + "\\")); // ディレクトリをと取得 string[] stDirectories = Directory.GetDirectories(stPath); foreach (string s in stDirectories) { string st = s.Replace("/", "\\"); Uri uri2 = new Uri(Path.GetFullPath(st + "\\")); Uri uri3 = uri2.MakeRelativeUri(uri); } 他のサイト様を拝見して、気を付けている点は、 1、相対ではなく、絶対で指定する。 2、末尾に"\\"を付ける。 3、"/"ではなく、"\\"に変更する の3点です。 それとも、MakeRelativeUriメソッドはフォルダには使えないのでしょうか? それとも、パスの中に2バイト文字が入っていてはダメ? 解決策をお願いいたします。 VC#2010Expressです。
- 締切済み
- C・C++・C#
- 相対パスが使えない
EXCELのファイルを呼び出したいのですが,絶対パスで e:\vb6.0\book1.xls と指定するとファイルが開くのですが, 相対パスで .\book1.xls と指定するとファイルが開けません。 なぜでしょうか? EXCELのファイルとvbのファイルは同じフォルダ内にあります.
- ベストアンサー
- Visual Basic
- 相対パスか絶対パスって何?
CGIサイト内検索を設置したいと思っていますが、相対パスか絶対パスって言う言葉が出てきます。 (例)path/にはsearch.cgiまでの相対パスか絶対パスが入ります。 相対パス・絶対パスとは何でしょう? サーバーにあるホームディレクトリのフルパスとは違うのですか? 教えてくださいお願いします。
- 締切済み
- CGI
- 相対パスか絶対パス??
CGIサイト内検索を設置したいと思っていますが、相対パスか絶対パスって言う言葉が出てきます。 (例)path/にはsearch.cgiまでの相対パスか絶対パスが入ります。 相対パス・絶対パスとは何でしょう? サーバーにあるホームディレクトリのフルパスとは違うのですか? もしフルパスと同じだと言った場合・・・ 「path/にはsearch.cgiまでの相対パスか絶対パスが入ります」ではフルパスが/home/hatenaだった場合は 下記にはどのようにはいるのでしょうか? (例)<form method="GET" action="path/search.cgi"> 再投稿ですが、もうチョット具体的に書いてみました 教えてくださいお願いします。
- 締切済み
- CGI
- 絶対パス、相対パス、環境変数の概念が掴めない
絶対パス相対パス環境変数についていまいち概念が掴めないのでどなたかご教示いただけないでしょうか? 絶対パスというものは指定のフォルダなどへの行き道をしていしたもの、相対パスはある程度のものだけきじゅつしてあるしか認識できておりません。 ググって探してみてもいまいちいい内容がなくて・・・ 何かいい知識の身につけ方があったら教えてください。 あと例えばCGIを使うためにActivePerlなどを入れたときに絶対パスで指定する方法があるとか言うのはどういった意味なのでしょうか?
- ベストアンサー
- Perl
- Active Basic フォルダの絶対パスの取得
ファイルまでの絶対パスの取得のように、自分のフォルダまでのパスを取得するにはどうしたらいいのでしょうか? D:\aaaa\bbbb\cccc\dddd\abcd.exe があって、 D:\aaaa\bbbb\cccc\dddd\ を取得したいのですが・・・ 実験してみたのですが、上手くいきませんでした。 すみませんが、やり方をご教授ください。お願いします。 ↓頑張った証 '自分自身のファイルパスを取得する Dim path[MAX_PATH] As Byte Dim FileName As BytePtr Dim MaxFilePath As Long Dim MyFileName As Long Dim AllByte As Long Dim MidAns As String GetModuleFileName(NULL,path,MAX_PATH) 'ファイルパスからファイル名を抜き出し、その大きさを取得して、引く FileName=malloc(Len(path)+1) GetFileTitle(path,FileName,Len(path)+1) MaxFilePath=Len(path) MyFileName=Len(FileName)+1 AllByte=MaxFilePath-MyFileName 'フォルダまでのパスを抜き出す MidAns=Mid$(path,1,54) free(FileName)
- ベストアンサー
- その他(プログラミング・開発)
- コマンドプロンプトで相対パスの取得
コマンドプロンプトにて、絶対パスから相対パスを取得する方法はございますでしょうか? hoge ├ hoge2.txt └ hoge3.txt という階層で、 for %%A in (hoge\*.txt) do ( echo %%A ) と for で回すと、%%Aには絶対パスが入ります。 この%%Aに相対パス(hoge\hoge2.txt)を格納する方法、もしくは%%Aから相対パスを抜き出す方法が知りたいのです。 VBなど別プログラムを起動させずに、あくまでもコマンドプロンプト上での方法がありましたら、どうかご教授下さいませ。
- 締切済み
- その他([技術者向] コンピューター)
- シェルスクリプトでの絶対パスの取得
UNIXのシェルスクリプトで、引数として渡された相対パスから絶対パスを取得するには、そうすればよいでしょうか。 cd 相対パス 変数=`pwd` これが一番普通のやり方でしょうか。 change directory しなくてもできる方法がないのかなあと思ったもので。
- ベストアンサー
- Linux系OS
- C#で相対パスを絶対パスへ変換したい
C#で相対パスを絶対パスへ変換したい C#でプログラミングしています。 以下のようにベースとなる絶対パスと、そこからの相対パスがあるとします。 string basePath = "C:\\Projects\\Test001\\Debug\\"; string relativePath = "..\\..\\Test002\\"; 2つの文字列をただ足し合わせるだけだと、 "C:\\Projects\\Test001\\Debug\\..\\..\\Test002\\" となってしまいます。 これでも目的のパス「C:\\Projects\\Test002\\」にアクセスできますが、なにか既存の関数などを使って、「C:\\Projects\\Test002\\」というちゃんとした絶対パスを取得する方法はないでしょうか?
- ベストアンサー
- その他(プログラミング・開発)
お礼
お返事が遅くなり申し訳ありませんでした。 詳細かつ分かり易い回答を頂き、ありがとうございます。早速、参考にさせて頂きます。