DOBON.NET DOBON.NETプログラミング掲示板過去ログ

相対パスの表し方

  • 題名: 相対パスの表し方
  • 著者: トッチー
  • 日時: 2005/10/03 21:50:26
  • ID: 13082
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[VB.NET XP]
分類:[.NET]

こんばんわ ご教授願います。
コンパイルした自分自身のファイルを基準にして同じフォルダにあるファイルを取得する方法がしりたいです。

同じフォルダのsample.mdbにアクセスしたい。
例)Data source=???sample.mdb

また、次の階層のファイルにアクセスする方法もお願いします。
Data source=sample.mdb
Private Sub Button1_Click(ByVal sender As System.Object _
, ByVal e As System.EventArgs) Handles Button1.Click

Dim oleCn = New OleDb.OleDbConnection()

'接続文字列を作成して接続を開始する
oleCn.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=d\Sample.mdb;" & _
"Persist Security Info=False"
oleCn.Open()

'Stateプロパティを使って接続状態を表示する
MessageBox.Show(oleCn.State.ToString() & " 状態です。", "結果通知")

'接続を終了する
oleCn.Close()
End Sub


"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=Sample.mdb;" & _
"Persist Security Info=False"

では繋がらないです どうしてでしょうか?
> "Provider=Microsoft.Jet.OLEDB.4.0;" & _
> "Data Source=Sample.mdb;" & _
> "Persist Security Info=False"
>
> では繋がらないです どうしてでしょうか?

Data Source=..\Sample.mdb;
ではどうでしょうか?

ビルドされたexeやdllからみた相対位置となりますので。

私の勝手な想像ですが、ビルドされたexeかdllの一つ上のフォルダにmdbファイルを置いていませんか??
(同様な経験あり^^;)
binフォルダとかの下に出来上がったEXEはあるので、プロジェクトフォルダに入っていると確かに動かないでしょう。
そういう場合には..\なんてするんじゃなくってビルド後タスクでコンパイル時に毎回コピーしてあげるとかのほうがいいと思います。
> そういう場合には..\なんてするんじゃなくってビルド後タスクでコンパイル時に毎回コピーしてあげるとかのほうがいいと思います。

開発中のデバッグ状況を勝手にイメージしておりましたので、単純に一つ上のディレクトリを参照できればいいと思っていましたが(これも勝手な想像^^;)、確かに運用面を考えるとこれ(..\)は良くないですね!
ApplicationクラスのStartupPathプロパティでどうでしょうか。
本日仕事で遅くなりました。お返事ありがたいです。

exeファイルが生成されるDebug とreleaseフォルダに.mdbファイルを入れたり、コンパイル後のexeの一つ〜二つ上のファイルに.mdbファイルをおいて、コンパイル後移動しても結果は駄目でした。  

ApplicationクラスのStartupPathプロパティは絶対パスがでてきますね。

他でも.\Sample.mdb とか./Sample.mdb とかというアドバイスを戴きましたが接続には至りませんでした。

はてさて。。。
本来書きたい事を書くのを忘れました

'接続文字列を作成して接続を開始する
oleCn.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=d\Sample.mdb;" & _
"Persist Security Info=False"
oleCn.Open()

に対して Data Source= ってところがダブルクオーテーションになっていないんですよね。 これが Data Source="d\Sample.mdb;" だったらApplicationクラスのStartupPathプロパティはつかえるんですよね。

絶対パスを取得する方法はありがとうございます。
でも相対パスだと exeファイルとmdbファイルの位置関係が保てれれば基本的にどこにおいても動くとおもうので相対パス動作を一生懸命さがしてます。
  • 題名: Re[9]: うっかり
  • 著者: あのね
  • 日時: 2005/10/05 9:41:11
  • ID: 13107
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
> 絶対パスを取得する方法はありがとうございます。
> でも相対パスだと exeファイルとmdbファイルの位置関係が保てれれば
>基本的にどこにおいても動くとおもうので相対パス動作を一生懸命さがしてます。

尚更、『ApplicationクラスのStartupPathプロパティ』でいいような気が・・・。
こんにちは、じゃんぬ です。

■No13102に返信(トッチーさんの記事)
> Data Source= ってところがダブルクオーテーションになっていないんですよね。
> これが Data Source="d\Sample.mdb;" だったらApplicationクラスのStartupPathプロパティはつかえるんですよね。

すいません、意味が判り兼ねました。
よろしかったら、何故使えないと思われたのかを教えてください。(*_ _)
  • 題名: Re[9]: うっかり
  • 著者: trapemiya
  • 日時: 2005/10/05 9:59:13
  • ID: 13109
  • この記事の返信元:
  • この記事への返信:
  • ツリーを表示
■No13102に返信(トッチーさんの記事)
> "Data Source=d\Sample.mdb;" & _
> でも相対パスだと exeファイルとmdbファイルの位置関係が保てれれば基本的にどこにおいても動くとおもうので相対パス動作を一生懸命さがしてます。

相対パスだと、普通に
"Data Source=""..\hoge\Sample.mdb;""" & _
みたいな感じでいいと思いますが・・・。

#VB.NETの文法は合ってますかね。(^^;
■No13109に返信(trapemiyaさんの記事)
> ■No13102に返信(トッチーさんの記事)
>>"Data Source=d\Sample.mdb;" & _
>>でも相対パスだと exeファイルとmdbファイルの位置関係が保てれれば基本的にどこにおいても動くとおもうので相対パス動作を一生懸命さがしてます。
> 
> 相対パスだと、普通に
> "Data Source=""..\hoge\Sample.mdb;""" & _
> みたいな感じでいいと思いますが・・・。
> 
> #VB.NETの文法は合ってますかね。(^^;

Access>OLE DB, OleDbConnection (.NET) ですから、、、

...Data Source=A:\Moo.MDB;...

という構文になるので、
ダブルコーテーションは要らないと思いますよー。
書き忘れ。

ConnectionStringといえば

http://www.connectionstrings.com/

がおすすめです。
  • 題名: Re[9]: うっかり
  • 著者: まどか
  • 日時: 2005/10/05 11:26:26
  • ID: 13114
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
> に対して Data Source= ってところがダブルクオーテーションになっていないんですよね。 これが Data Source="d\Sample.mdb;" だったらApplicationクラスのStartupPathプロパティはつかえるんですよね。

a = "CDE"
b = "AB" & a "FG"
としたらbはどうなりますか?

> 絶対パスを取得する方法はありがとうございます。
> でも相対パスだと exeファイルとmdbファイルの位置関係が保てれれば基本的にどこにおいても動くとおもうので相対パス動作を一生懸命さがしてます。

パスの見た目は絶対パスですが、その中身は。。。
コンパイルして適当なフォルダで実行してみるとよいでしょう。
2005/10/05(Wed) 11:37:15 編集(投稿者)

お世話になります。

■No13102に返信(トッチーさんの記事)
> 本来書きたい事を書くのを忘れました
>
> '接続文字列を作成して接続を開始する
> oleCn.ConnectionString = _
> "Provider=Microsoft.Jet.OLEDB.4.0;" & _
> "Data Source=d\Sample.mdb;" & _
> "Persist Security Info=False"
> oleCn.Open()
>
> に対して Data Source= ってところがダブルクオーテーションになっていないんですよね。 これが Data Source="d\Sample.mdb;" だったらApplicationクラスのStartupPathプロパティはつかえるんですよね。
>
> 絶対パスを取得する方法はありがとうございます。
> でも相対パスだと exeファイルとmdbファイルの位置関係が保てれれば基本的にどこにおいても動くとおもうので相対パス動作を一生懸命さがしてます。

ちょっと、話の流れが理解し切れていないので、
まったく見当違いの事かもしれませんが…

■exeと同一ディレクトリに、Sample.mdbを置く場合
oleCn.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Application.StartUpPath & "\Sample.mdb;" & _
"Persist Security Info=False"

■exeの配置ディレクトリの配下に、dbというディレクトリを作成し、Sample.mdbを置く場合

oleCn.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Application.StartUpPath & "\db\Sample.mdb;" & _
"Persist Security Info=False"

という事ではないですか?
&でパスをつないではいけません。
System.IO.Path.Combineつかってください。
お世話になります。

■No13116に返信(中博俊さんの記事)
> &でパスをつないではいけません。
> System.IO.Path.Combineつかってください。

System.IO.Path.Combine知りませんでした…勉強になります。

"Data Source=" & Application.StartUpPath & "\Sample.mdb;" & _

"Data Source=" & System.IO.Path.Combine(Application.StartUpPath ,"Sample.mdb") & ";" _

という事でしょうか。
GJ!
2005/10/05(Wed) 16:39:18 編集(投稿者)

こんにちは、じゃんぬ です。

せっかくだから、Tips を挙げます。
http://jeanne.wankuma.com/tips/path/09-combine.html

せっかくだから、DOBON! さんの Tips も挙げます。
http://dobon.net/vb/dotnet/file/pathclass.html

すいません、DOBON! さんのサイトにもあったので追加しました... orz

# あれ? DOBON! さんの Tips の C# のところに PRE 要素の class 属性に閉じタグのカスがありませんか?
# そのために、正常に表示されていないようです。
'System.Reflection.TargetInvocationException' のハンドルされていない例外が mscorlib.dll で発生しました。

追加情報 : 呼び出しのターゲットが例外をスローしました。

です。。。。

なおこさんの
oleCn.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Application.StartUpPath & "\Sample.mdb;" & _
"Persist Security Info=False"
を参考にしました
お世話になります。

■No13131に返信(トッチーさんの記事)
> 'System.Reflection.TargetInvocationException' のハンドルされていない例外が mscorlib.dll で発生しました。
>
> 追加情報 : 呼び出しのターゲットが例外をスローしました。
>
> です。。。。
>
> なおこさんの
> oleCn.ConnectionString = _
> "Provider=Microsoft.Jet.OLEDB.4.0;" & _
> "Data Source=" & Application.StartUpPath & "\Sample.mdb;" & _
> "Persist Security Info=False"
> を参考にしました
>

↑を書いてて思ってた事なのですが、
Persist Security Info=False
って必要なんでしょうか?
Mooさんのおっしゃってたhttp://www.connectionstrings.com/をみると
必要なさそうな気が…

あと、中さん・じゃんぬさんがおっしゃっている通り
"Data Source=" & System.IO.Path.Combine(Application.StartUpPath ,"Sample.mdb")
の方を使ってくださいです。理由はじゃんぬさんの紹介されたページに記載されています。

念のためお尋ねしますが、exeと同じフォルダにSample.mdbってありますか?
13132のレス

mdbファイルの名前を間違えていました。 反省。。

しかし、13118の方法ですと 構文エラーになります。



みなさん20件も書いていただきありがとうございます。

もうしばらくここは空けておきます。ご容赦を。
># あれ? DOBON! さんの Tips の C# のところに PRE 要素の class 属性に閉じタグのカスがありませんか?

修正しました。ご報告ありがとうございました。

純粋に相対パスから絶対パスの取得ということであれば、こちらもどうぞ。

相対パスから絶対パスを取得するhttp://dobon.net/vb/dotnet/file/getabsolutepath.html

また、カレントディレクトリの変更ということであれば、Environment.CurrentDirectoryプロパティを使ってください。
パスの中に全角文字(ひらがななど)が入っていると機能しません。

ひらがなを変換しないと駄目ですか?
  • 題名: 今までありがとうございました
  • 著者: トッチー
  • 日時: 2005/10/16 17:50:42
  • ID: 13297
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
今まで相談に乗って頂きありがとうございます。
マルチポストをしたという(世間体では)愚行を働いたので撤収します。

ありがとうございました、さようなら。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板