C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: 親ディレクトリのパスを取得


(過去ログ 12 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■3124 / inTopicNo.1)  親ディレクトリのパスを取得
  
□投稿者/ kirapa (1回)-(2007/04/24(Tue) 11:32:26)

分類:[C# (Windows)] 

環境:Visual C# 2005 Express Edition

親ディレクトリのパスを取得するにはどのような方法がありますか?
親の親の。。。パスを取得したいときに、Path.GetDirectoryName を繰り返すことで
取得できたのですが、もっと良い方法がありますでしょうか?
string startup = Application.StartupPath;
string path1 = Path.GetDirectoryName(startup);
string path2 = Path.GetDirectoryName(path1);

思いつくのは区切り文字で分割して再結合するなど。

よろしくおねがいします。
引用返信 編集キー/
■3125 / inTopicNo.2)  Re[1]: 親ディレクトリのパスを取得
□投稿者/ επιστημη (495回)-(2007/04/24(Tue) 11:49:08)
επιστημη さんの Web サイト
> 親の親の。。。パスを取得したいときに、Path.GetDirectoryName を繰り返すことで
> 取得できたのですが、もっと良い方法がありますでしょうか?

…それで十分良い方法だと思うけど、"もっと良い"とは? 簡単? 高速? 他のなにか?

引用返信 編集キー/
■3127 / inTopicNo.3)  Re[2]: 親ディレクトリのパスを取得
□投稿者/ kirapa (3回)-(2007/04/24(Tue) 12:18:35)
> …それで十分良い方法だと思うけど、"もっと良い"とは? 簡単? 高速? 他のなにか?
そのものずばりの関数(例えば引数で何階層か指定できるとか)があれば、それを使ったほうが良いと思ったわけでして。
あと C#をよく使っている人はどうしているか知りたいなという理由だったり。

引用返信 編集キー/
■3129 / inTopicNo.4)  Re[3]: 親ディレクトリのパスを取得
□投稿者/ 未記入 (69回)-(2007/04/24(Tue) 13:08:48)
No3127 (kirapa さん) に返信
> そのものずばりの関数(例えば引数で何階層か指定できるとか)があれば、それを使ったほうが良いと思ったわけでして。

なら、それを作ればいいじゃないですか?
ご自分でメソッドを作るという発想はないんですか?
引用返信 編集キー/
■3131 / inTopicNo.5)  Re[3]: 親ディレクトリのパスを取得
□投稿者/ 刈歩 菜良 (66回)-(2007/04/24(Tue) 13:16:18)
刈歩 菜良 さんの Web サイト
No3127 (kirapa さん) に返信
>>…それで十分良い方法だと思うけど、"もっと良い"とは? 簡単? 高速? 他のなにか?
> そのものずばりの関数(例えば引数で何階層か指定できるとか)があれば、それを使ったほうが良いと思ったわけでして。
> あと C#をよく使っている人はどうしているか知りたいなという理由だったり。

string path = Path.GetDirectoryName(Path.GetDirectoryName(Application.StartupPath));

こういうことぢゃないですよねぇ。
(^^ゞ

失礼しました。
<(_ _)>
引用返信 編集キー/
■3134 / inTopicNo.6)  Re[4]: 親ディレクトリのパスを取得
□投稿者/ kirapa (4回)-(2007/04/24(Tue) 13:26:18)
> なら、それを作ればいいじゃないですか?
> ご自分でメソッドを作るという発想はないんですか?
自作するにしてもメソッドの中で使用する関数に Path.GetDirectoryName 以外に利用できる既存の関数がないか知りたいのです。

文字列を解析するより、Path.GetDirectoryName を使ったほうが明白だしバグの可能性が減りますよね。
同様に、Path.GetDirectoryName よりもこの目的に適した関数やお決まりの方法を知っていれば教えてください。
という意味なのですが、うまく伝わっていないみたいですね。
言葉たらずで不愉快な思いをさせたのならあやまります。ごめんなさい。


刈歩 菜良さま
>string path = Path.GetDirectoryName(Path.GetDirectoryName(Application.StartupPath));
元のソースコードはずばりこれです(^^;


ちょっと脱線しますが、「こんなマニアックな方法でもできるぜ!」っていうを
教えてもらっても勉強になるかも

引用返信 編集キー/
■3135 / inTopicNo.7)  Re[5]: 親ディレクトリのパスを取得
□投稿者/ 刈歩 菜良 (67回)-(2007/04/24(Tue) 13:44:31)
刈歩 菜良 さんの Web サイト
2007/04/24(Tue) 13:45:56 編集(投稿者)

No3134 (kirapa さん) に返信
> 文字列を解析するより、Path.GetDirectoryName を使ったほうが明白だしバグの可能性が減りますよね。
> 同様に、Path.GetDirectoryName よりもこの目的に適した関数やお決まりの方法を知っていれば教えてください。
> という意味なのですが、うまく伝わっていないみたいですね。
> 言葉たらずで不愉快な思いをさせたのならあやまります。ごめんなさい。
だいじょうぶですよー。(と、わたくしは思う。(^^ゞ )

わたしは効率の良い自作よりも効率悪いけど手っ取り早い標準メソッド組み合わせ派なので、自作は滅多な事ではやらないですね。
# ユーザーコントロールとかは別にして。

バグは標準のものでも...なので、それはぢkうぃsd(って、なにおするっ! た、たすけ・・・
引用返信 編集キー/
■3137 / inTopicNo.8)  Re[5]: 親ディレクトリのパスを取得
□投稿者/ とっちゃん (117回)-(2007/04/24(Tue) 13:54:31)
とっちゃん さんの Web サイト
No3134 (kirapa さん) に返信
> ちょっと脱線しますが、「こんなマニアックな方法でもできるぜ!」っていうを

ご要望にお応えしてw

ちょっとマニアックな方法
string path = Path.GetFullPath( Path.Combine( Application.StartupPath, ".." ) );

さらにマニアックな方法
Directory.SetCurrentDirectory( Application.StartupPath );
Directory.SetCurrentDirectory( ".." ); // すきなだけw
string path = Directory.GetCurrentDirectory();

どちらも、1階層上を指します。
あとは、状況に応じて適切に処理すればOKかとw
ただし、2番は「確実に」環境依存です。

どちらも、コンソールアプリで正しく動作することは確認済みです。
#なので、環境を選べば利用は可能です。

スピードは...多分遅いでしょうね。
これまで出てこなかった理由はそれなりにあるということです。


引用返信 編集キー/
■3138 / inTopicNo.9)  Re[4]: 親ディレクトリのパスを取得
□投稿者/ とっちゃん (118回)-(2007/04/24(Tue) 14:03:03)
とっちゃん さんの Web サイト
書き忘れた...

GetDirectoryName() ですが、「パス区切り文字」で終わってる場合、意図しない結果になりますのでご注意を
以下のコードで、どういう状況になるかが確認できます。

string testPath1 = Application.StartupPath;
testPath1 += Path.DirectorySeparatorChar; // ここで区切り文字を足して無理やりNG状況を作り出す

string testPath2 = Path.GetDirectoryName( testPath1 );

Console.WriteLine( testPath1 );
Console.WriteLine( testPath2 );

これは意図的に作り上げたテストコードですが、多分意図しない結果を返してくると思います。

引用返信 編集キー/
■3139 / inTopicNo.10)  Re[5]: 親ディレクトリのパスを取得
□投稿者/ 未記入 (70回)-(2007/04/24(Tue) 14:10:10)
No3134 (kirapa さん) に返信
> 自作するにしてもメソッドの中で使用する関数に Path.GetDirectoryName 以外に利用できる既存の関数がないか知りたいのです。
>
> 文字列を解析するより、Path.GetDirectoryName を使ったほうが明白だしバグの可能性が減りますよね。
> 同様に、Path.GetDirectoryName よりもこの目的に適した関数やお決まりの方法を知っていれば教えてください。
> という意味なのですが、うまく伝わっていないみたいですね。
> 言葉たらずで不愉快な思いをさせたのならあやまります。ごめんなさい。

いやいやいやいや、自作するメソッドの中でGetDirectoryNameメソッドを使えばいいじゃないですか?
なぜ、使ってはいけないという意味にされてしまっているのでしょう?
私はそんなことは書いていません。
引数に階層を指定して、GetDirectoryNameメソッドを利用して返すようにすれば、文字通り

>そのものずばりの関数(例えば引数で何階層か指定できるとか)があれば、

ができるでしょう。

こちらこそ言葉足らずで不愉快な思いをさせたのならあやまります。ごめんなさい。
引用返信 編集キー/
■3141 / inTopicNo.11)  Re[5]: 親ディレクトリのパスを取得
□投稿者/ kirapa (5回)-(2007/04/24(Tue) 15:09:10)
みなさん回答ありがとうございます。

とっちゃんさん
Path.GetFullPath を使った方法は面白いですね。

> GetDirectoryName() ですが、「パス区切り文字」で終わってる場合。。。
了解です。


επιστημη さん
未記入?さん
>…それで十分良い方法だと思うけど、"もっと良い"とは? 簡単? 高速? 他のなにか?
これで十分だとわかりました。ありがとうございます。

解決済み
引用返信 編集キー/
■3199 / inTopicNo.12)  Re[6]: 親ディレクトリのパスを取得
□投稿者/ ぼのぼの (42回)-(2007/04/25(Wed) 17:11:38)
2007/04/25(Wed) 17:13:33 編集(投稿者)
こんにちは。

■No3141 (kirapa さん) に返信
> επιστημη さん
> 未記入?さん
> >…それで十分良い方法だと思うけど、"もっと良い"とは? 簡単? 高速? 他のなにか?
> これで十分だとわかりました。ありがとうございます。

全然こだわる必要のないレベルだと思うんですけど。

private string GetParentDirectory(string pathName, int level)
{
    string s = pathName;
    for (int i = 0; i < level; i++)
    {
        s = Path.GetDirectoryName(s);
    }
    return s;
}

このコードだと、GetDirectoryNameを呼んだ回数だけ、
内部でその戻り値としてのstringインスタンスが生成されると考えられます。
それを避けたいならば、所詮文字列操作ですから、↓の方がいいのかも。

private string GetParentDirectory(string pathName, int level)
{
    int x = pathName.Length;
    for (int i = 0; i < level; i++)
    {
        x = pathName.LastIndexOf(Path.DirectorySeparatorChar, x - 1);
        if (x < 0) return null;
    }
    if (x == 2) x++;
    return pathName.Substring(0, x);
}

解決済み
引用返信 編集キー/
■3208 / inTopicNo.13)  Re[7]: 親ディレクトリのパスを取得
□投稿者/ kirapa (6回)-(2007/04/25(Wed) 18:54:21)
ぼのぼの さん

>それを避けたいならば、所詮文字列操作ですから、↓の方がいいのかも。
そうですね。とても参考になります。


>全然こだわる必要のないレベルだと思うんですけど。
最初の質問の書き方が悪かったための誤解だと思うのですが。。。
 回答してくださった方々が「なんでそんなところにこだわるの?」って思っているように感じました。
 誤解のないように書きますが、みなさんを批難しているわけではありません m(_ _)m

 掲示板を見ていて、「自分で調べたの?」っと言う回答をよく見るので、まずヘルプ等を調べました。
 それで、Path.GetDirectoryName を繰り返して使うと言う結論に達したわけですが、処理速度に不満が
 あったわけでもなく、他の(上手な?)書き方はないか(この感覚がおかしいのかな?)と思って質問
 したわけです。

 今回は、たまたま Path.GetDirectoryName を使う方法でよかったので、みなさんには、
 「それでいいじゃないの?」「なににこだわってるの?」と見えたのかもしれません。

 質問の仕方は難しいなぁとつくづく感じました。
引用返信 編集キー/
■3214 / inTopicNo.14)  Re[8]: 親ディレクトリのパスを取得
□投稿者/ ぼのぼの (43回)-(2007/04/25(Wed) 22:06:01)
No3208 (kirapa さん) に返信
> >全然こだわる必要のないレベルだと思うんですけど。
> 最初の質問の書き方が悪かったための誤解だと思うのですが。。。(以下略)

あ〜すみません。ちょっと誤解を与える書き方だったかも。
「全然こだわる必要のないレベルだと思うんですけど。」は、私自身の書き込みに対する自己ツッコミです。
つまり、概ね同じ結果を返す2つのサンプルコード、無理して後者を採択する必要はないですよと。
#概ねと書いたのは、第一引数にnullを指定すると違う動きをするから

>  今回は、たまたま Path.GetDirectoryName を使う方法でよかったので、みなさんには、
>  「それでいいじゃないの?」「なににこだわってるの?」と見えたのかもしれません。

そのメソッドがどのような使われ方をするかによってはこだわりは必要でしょう。
プロジェクトでみんなが使う共通部品なら、多少工数かけてでも処理効率の良い方法を考えるべきだし、
数回使うだけのプライベートメソッドなら、てっとりばやさとバグの作り込みにくさの方が優先だろーし。

つまり、状況によっては必ずしも最高のアルゴリズムが求められるわけではないってことです。
処理速度8割のものが所要工数5割でできるなら、差額でハード増強した方が結果的に速いかもしれないでしょ?

>  質問の仕方は難しいなぁとつくづく感じました。

ちょっと運が悪かったのは、たまたま例にあげた親ディレクトリのパス取得っていう機能が、
実際の使用状況を想像すると階層数(=ループ回数)はせいぜい1〜5くらいと予想されてしまうことと、
C#という言語自体が、シビアな性能を求められる状況ではそもそも採択されないってことも
あるのかもしれませんね。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -