none
作業ディレクトリを相対パスで RRS feed

  • 質問

  •  

    いつもお世話になっております。

    作業ディレクトリを相対パスで設定すると、見つかりませんと言われます。

    Debugフォルダからの相対パスを指定しています。

     

    例: ..\..\..\Environment\

     

    VS6の時は可能だった気がするのですが。

    宜しくお願い致します。

     

    環境:VS2005 TeamEdition C# WinXP

     

     

     

    2007年12月25日 9:35

回答

  • こんにちは、ファクトです。

     

    この場合の作業ディレクトリが何の事なのかを、もう少し詳しく書かれると回答が付きやすいと思いますよ

    おそらく、ソースコード内に相対パスを示す文字列を持っていて、それを使って何か処理をした結果、ファイルが見つからない旨の例外が発生した、という事かと思います。

     

    で、考えられる原因としては、

    ・文字列を定義する際に@を指定していなくて、円マークがエスケープに使われてしまっている。

    ・IO系のクラスの使用方法が間違っている。

    ・単純にフォルダ/ファイルがない。

     

    と、いったところでしょうか。

     

    2007年12月26日 0:08
  •  ファクト さんからの引用

    この場合の作業ディレクトリが何の事なのかを、もう少し詳しく書かれると回答が付きやすいと思いますよ

     

    エラーメッセージの内容からプロジェクトのプロパティのデバッグタブの「作業フォルダ」だと思います。

     

    それで、元の問題ですが、手元のVC#2008 Expressでも同じエラーが出て、設定できませんね。

    $(SolutionDir)といったマクロも受け入れないみたいですので、フルパスで設定するしかないのかもしれません。

    (この設定はユーザ依存の情報として保存されるため、csprojには含まれません)
    2007年12月26日 14:38
    モデレータ
  •  Myon さんからの引用

    フルパスしか設定できないとなると不便だと思うのですが。

    別の人にプロジェクトごと渡した時に、

    違うディレクトリでデバッグ実行されると「動かない」と言われてしまいます。

    なんとか別の解決方法はないものでしょうか

    渡しただけで動くってのはできなさそうな気がします。

    何度も受け渡しをするのであれば、その人の環境のhogehoge.csproj.userが上書きされないようにすれば、最初の一度だけ設定すれば良いことになります。

    (何人もその対象が居る場合は、開発環境構築手順書みたいなものに記述するといった対応)

     

    渡すファイル(一例)

    hogehoge.csproj

    Form1.cs

    Form1.Designer.cs

    Program.cs

    Propertiesフォルダ

    (他、slnファイル等)

     

    渡さないファイル

    hogehoge.csproj.user

    (他、suoファイル等)

     

    suoファイル、userファイルはユーザ固有環境の情報を保存するためのものです。

    前述の作業フォルダはここに保存されますので、最初に一度だけ作業フォルダを設定してもらってください。

    以降はこのユーザ固有ファイルは配布せず、上書きしないように運用することでなんとか回避できると思います。

    2007年12月26日 22:34
    モデレータ
  • VisualStudioのデバッカで、作業ディレクトリを指定して実行する機能があったんですね・・・

    勉強になりました。申し訳ない orz

     

    Azuleanさんのおっしゃる通り、各開発者毎に設定してもらうのが良いかと思います。

    ただし、無理矢理に実現するのであれば、以下の方法でもやれない事もないです。

     

    ・エントリポイントの最初で、「#IF DEBUG」で「Directory.SetCurrentDirectory(@"..\..\..\")」する。

    ・WindowsApplicationプロジェクトを追加し、カレントディレクトリを変更してから、元のプロジェクトのMain()を呼び出す。

     

    2007年12月27日 0:59
  •  Myon さんからの引用
    VS6では可能だったため、非常に残念です。

    VS2008でも不可能ということなんですよね。

     

    ちょっと誤解されているようなので補足ですが.

     

    作業ディレクトリの設定は,ご指摘のように VIsual C++ 6.0 では可能でしたし,もちろん Visual C++ 2008 でも依然として可能です.

    一方,Visual C# では,Visual C# 2002 から一貫して(?) ご要望の動作をしていません.Visual Studio のバージョンが上がったことでできなくなったというよりは,同じ Visual Studio 言語の中にも違いがあって,C# ではずっと使えていない,という感じでしょうか.

    2007年12月28日 11:29

すべての返信

  • こんにちは、ファクトです。

     

    この場合の作業ディレクトリが何の事なのかを、もう少し詳しく書かれると回答が付きやすいと思いますよ

    おそらく、ソースコード内に相対パスを示す文字列を持っていて、それを使って何か処理をした結果、ファイルが見つからない旨の例外が発生した、という事かと思います。

     

    で、考えられる原因としては、

    ・文字列を定義する際に@を指定していなくて、円マークがエスケープに使われてしまっている。

    ・IO系のクラスの使用方法が間違っている。

    ・単純にフォルダ/ファイルがない。

     

    と、いったところでしょうか。

     

    2007年12月26日 0:08
  •  ファクト さんからの引用

    この場合の作業ディレクトリが何の事なのかを、もう少し詳しく書かれると回答が付きやすいと思いますよ

     

    エラーメッセージの内容からプロジェクトのプロパティのデバッグタブの「作業フォルダ」だと思います。

     

    それで、元の問題ですが、手元のVC#2008 Expressでも同じエラーが出て、設定できませんね。

    $(SolutionDir)といったマクロも受け入れないみたいですので、フルパスで設定するしかないのかもしれません。

    (この設定はユーザ依存の情報として保存されるため、csprojには含まれません)
    2007年12月26日 14:38
    モデレータ
  • 申し訳ありません。誤解を招く記述をしてしまいました。

     

    Azuleanさんのおっしゃるとおり

    プロジェクトのプロパティのデバッグタブの「作業フォルダ」

    の設定での話です。

     

    フルパスしか設定できないとなると不便だと思うのですが。

    別の人にプロジェクトごと渡した時に、

    違うディレクトリでデバッグ実行されると「動かない」と言われてしまいます。

    なんとか別の解決方法はないものでしょうか

     

     

    2007年12月26日 16:40
  •  Myon さんからの引用

    フルパスしか設定できないとなると不便だと思うのですが。

    別の人にプロジェクトごと渡した時に、

    違うディレクトリでデバッグ実行されると「動かない」と言われてしまいます。

    なんとか別の解決方法はないものでしょうか

    渡しただけで動くってのはできなさそうな気がします。

    何度も受け渡しをするのであれば、その人の環境のhogehoge.csproj.userが上書きされないようにすれば、最初の一度だけ設定すれば良いことになります。

    (何人もその対象が居る場合は、開発環境構築手順書みたいなものに記述するといった対応)

     

    渡すファイル(一例)

    hogehoge.csproj

    Form1.cs

    Form1.Designer.cs

    Program.cs

    Propertiesフォルダ

    (他、slnファイル等)

     

    渡さないファイル

    hogehoge.csproj.user

    (他、suoファイル等)

     

    suoファイル、userファイルはユーザ固有環境の情報を保存するためのものです。

    前述の作業フォルダはここに保存されますので、最初に一度だけ作業フォルダを設定してもらってください。

    以降はこのユーザ固有ファイルは配布せず、上書きしないように運用することでなんとか回避できると思います。

    2007年12月26日 22:34
    モデレータ
  • VisualStudioのデバッカで、作業ディレクトリを指定して実行する機能があったんですね・・・

    勉強になりました。申し訳ない orz

     

    Azuleanさんのおっしゃる通り、各開発者毎に設定してもらうのが良いかと思います。

    ただし、無理矢理に実現するのであれば、以下の方法でもやれない事もないです。

     

    ・エントリポイントの最初で、「#IF DEBUG」で「Directory.SetCurrentDirectory(@"..\..\..\")」する。

    ・WindowsApplicationプロジェクトを追加し、カレントディレクトリを変更してから、元のプロジェクトのMain()を呼び出す。

     

    2007年12月27日 0:59
  •  

    いろいろと案を出してくださいましてありがとうございました。

    やはり難しいと言うことなのですね。

    VS6では可能だったため、非常に残念です。

    VS2008でも不可能ということなんですよね。

     

    とりあえずチームでルールを決めて開発を行いたいと思います。

    ありがとうございました。

     

     

    2007年12月28日 0:04
  •  Myon さんからの引用
    VS6では可能だったため、非常に残念です。

    VS2008でも不可能ということなんですよね。

     

    ちょっと誤解されているようなので補足ですが.

     

    作業ディレクトリの設定は,ご指摘のように VIsual C++ 6.0 では可能でしたし,もちろん Visual C++ 2008 でも依然として可能です.

    一方,Visual C# では,Visual C# 2002 から一貫して(?) ご要望の動作をしていません.Visual Studio のバージョンが上がったことでできなくなったというよりは,同じ Visual Studio 言語の中にも違いがあって,C# ではずっと使えていない,という感じでしょうか.

    2007年12月28日 11:29
  • そうでしたか。C#の仕様でダメと言うことだったのですね。

    貴重な情報ありがとうございました。

    2007年12月31日 2:10