質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • C#

    9058questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

c# file.ReadAllLinesのファイルパスを省略したい

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 553

orbwedu4

score 1

 前提・実現したいこと

教えてください。

1.c#のfile.writealltextでファイルパスを省略したいです。
省略しても動いているのですが省略した場合なにか不都合があるでしょうか?

2.writealltextに限らずにメソッドの動作・仕様の調べ方が知りたいです。
(今回の質問のようにファイルパスにファイル名だけ指定した場合など)
普通はどのように調べるものですか?

 該当のソースコード

private void ConfiguratorForm_Load(object sender, EventArgs e)
{
    var test = new Test("test.txt");  //pathなしでも動作している。
    testDGV.DataSource = test.Param;
}

public class Test
    {
        public List<ParamDto> Param { get; set; }
        //コンストラクタ
        public Test(string filePath)
        {
            Param = ReadParam(filePath);
        }
        private static List<ParamDto> ReadParam(string filePath)
        {
            var temp = new List<ParamDto>();
            string[] lines = File.ReadAllLines(filePath);
            foreach (var line in lines)
            {
                string[] items = line.Split(',');
                var parameter = new ParamDto
                {
                    No      = items[0],
                    Value   = items[1],
                    Unit    = items[2],
                    // 省略
                };
                temp.Add(parameter);
            }
            return temp;
        }
    }

 試したこと

1.\bin\Debugフォルダにtest.txtを作成して上記ソースコードで読込みとdatagridviewへの
表示ができました。

2.マイクロソフトのサイトでReadAllLinesの仕様を調べました。
https://docs.microsoft.com/ja-jp/dotnet/api/system.io.file.readalllines?redirectedfrom=MSDN&view=netframework-4.7.2

3.右クリックででてくる”定義に移動”でReadAllLinesの定義・コメントを見ました。

 補足情報(FW/ツールのバージョンなど)

Visual Studio 2017 .NET Framework 4.7.2
Windowsフォームアプリケーション

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

パスの指定については、この解説が参考になるかと思います。

Windows システムのファイル パス形式
https://docs.microsoft.com/ja-jp/dotnet/standard/io/file-path-formats

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/18 23:48

    回答ありがとうございます。

    解説をざっとよんでみたのですがパスを省略した場合にどうなるのかよくわかりませんでした...。

    すなおにパスを指定したほうが良い気がしてきました。

    キャンセル

  • 2018/11/18 23:54

    パスを省略してファイル名だけを書くと「現在のディレクトリに相対」になります。

    Windowsのプログラムは、常に「現在のドライブ」と「現在のディレクトリ」を持っていて、パスの一部を省略した場合(=絶対パスではない場合)は、そこからの相対になります。

    キャンセル

  • 2018/11/19 00:35

    Windowsのプログラムのルール(常識?)みたいなものなんですね。
    みなさんどのように調べているんでしょうか?
    やはりマイクロソフトのページからですか?

    キャンセル

  • 2018/11/19 00:40

    そうですね。
    私の経験では、入門書や入門サイトで広く浅く一通り勉強されるのが、一見遠回りでも最終的に近道になるのではないかと思います。

    なお、マイクロソフトのサイトでも以下に一連の初学者向けの説明がありますが、難易度がちょっと高めです。

    .NET にようこそ
    https://docs.microsoft.com/ja-jp/dotnet/welcome

    キャンセル

  • 2018/11/19 00:50

    地道に勉強していこうと思います。
    ありがとうございました。

    キャンセル

+2

1に関してですが、ファイルを指定する場合に2つの方法があります。
絶対パスと相対パスです。
C:\Test\ABC\Test.txt
とドライブ名から記述するものを絶対パスといい
ABC\Test.txt  (カレントフォルダがC:\Testの場合)
といった感じで「カレントフォルダ」からの位置を記述するものを相対パスといいます。
ファイル名のみを記述した場合、相対パスとして扱われ、カレントフォルダにあるファイルを示します。
カレントフォルダは標準でEXEのあるフォルダになります。
よって、EXEと同じフォルダにそのファイルを配置すれば、ファイル名のみの指定で大丈夫です。

クラスやメソッド等の仕様はマイクロソフトのページを見るのが基本だと思います。
ただ、今回のようなファイル名の指定の話は、メソッドの仕様というよりは、ファイル指定の基本の話ですので、ReadAllLinesの解説には出てこないでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/19 00:13

    回答ありがとうございます。

    >ファイル名のみを記述した場合、相対パスとして扱われ、カレントフォルダにあるファイルを示します。
    これはWindowsフォームアプリケーションを普段作っている方からすると常識的なことですか?
    Windowsのファイル指定について初心者が調べるとしたらどのあたりから手をつけていけば
    よいでしょうか?

    (ソースコードをできるだけ手を抜くために、test.txtファイルの場所はexeのあるフォルダと
    同じ場所に限定するつもりです。)

    キャンセル

  • 2018/11/19 00:17

    カレントディレクトリが exe と同じになるのはエクスプローラーの仕様です。
    その他のランチャーやコマンドプロンプトではその限りではありません。

    キャンセル

  • 2018/11/19 00:27

    なるほど、エクスプローラーについてしらべてみます。

    >ファイル名のみを記述した場合、相対パスとして扱われ、カレントフォルダにあるファイルを示します。
    そうすると設定ファイルなどを全部exeのあるフォルダにおいておけばファイル名指定だけでよさそう
    ですね。

    キャンセル

  • 2018/11/19 00:34

    カレントディレクトリはユーザーがいかようにも変えられるので相対パスは信頼できません。
    AppDomain.BaseDirectory を使ってフルパスで指定する方が安全です。
    https://docs.microsoft.com/ja-jp/dotnet/api/system.appdomain.basedirectory?view=netframework-4.7.2

    キャンセル

  • 2018/11/19 01:20

    >カレントディレクトリはユーザーがいかようにも変えられるので相対パスは信頼できません
    ユーザーがカレントディレクトリをかえてもtest.txtと実行ファイルが同じ場所にあれば
    問題なさそうな気がするのですが...

    (今ためしにtest.txtと実行ファイルを同じフォルダにいれていろんな場所にコピーして実行して
    みるとパス指定なしでもtest.txtを読み込めました。)
    test.txtの置き場所をexeのあるフォルダに限定していてもフルパスで指定しなきゃ危険でしょうか?

    キャンセル

  • 2018/11/19 07:22

    カレントディレクトリからの相対なので、カレントディレクトリが変わると読み込めなくなります。

    キャンセル

  • 2018/11/19 07:26

    EXEのショートカットを作成し、そのプロパティにて作業フォルダを変えるなど、カレントフォルダの初期値を変更する手段があります。
    Assembly.GetExecutingAssemblyなどを利用して、カレントフォルダを変更するなり、絶対パスを構築するなりし、EXEと同じフォルダに配置されれば大丈夫という形にする。
    https://dobon.net/vb/dotnet/vb6/apppath.html

    もしくは、マイドキュメントやデスクトップなどの特殊フォルダを取得するなどして、環境に左右されにくくするなどします。
    https://docs.microsoft.com/ja-jp/dotnet/api/system.environment.getfolderpath?view=netframework-4.7.2

    また、絶対パス、相対パスの考え方はディレクトリ構造を持つOSであればどのOSでも持っているものだと思います。

    キャンセル

checkベストアンサー

+1

絶対パスと相対パスと言うのは他回答の説明を参照してもらうとして、、

var test = new Test("test.txt");

実行ファイルを直接実行した場合は、実行ファイルのあるフォルダのtest.txtにアクセスします
では、以下の場合に、どの場所のファイルをアクセスするか実際にやってみましょう

  1. (デスクトップに)実行ファイルのショートカットを作って、そこから実行した場合
  2. 実行ファイルのショートカットを作って、ショートカットの作業フォルダにどこかのフォルダを入れた場合
  3. 実行ファイルのショートカットを作って、ショートカットの作業フォルダを空白にした場合

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/19 22:19

    やってみました。

    1の場合は正常にアクセスできました。
    2と3の場合は"アプリケーションのコンポーネントでハンドルされていない例外が発生しました。・・・”となってアクセスできませんでした!

    ショートカットの作業フォルダを変更したことがこれまでなかったのでまったく想定していませんでした。
    自分ひとりが使うのであれば問題ないかもですが人に使ってもらう場合だときちんとパスを指定しておいたほうがいいんですね。
    (なんで作業フォルダを変更することがあるのかいまいちわかっていませんが。。。)

    //var test = new Test("test.txt");
    var path = System.AppDomain.CurrentDomain.BaseDirectory + "test.txt";
    var test = new Test(path);
    と変更したら1.2.3.すべてアクセスできました。

    すごく納得できました。
    ありがとうございました。

    キャンセル

  • 2018/11/19 22:28

    パスを結合する場合は、Path.Combineメソッドを使いましょう

    キャンセル

  • 2018/11/19 22:49

    //var path = System.AppDomain.CurrentDomain.BaseDirectory + "test.txt";
    var path = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory,"test.txt");
    Path.Combineをつかってアクセスできました。こんなかんじでいいんでしょうか?

    いまはどちらも動作していますがあとあとのことを考えてPath.Combineを使うようにします。
    (無効な文字を含むと例外がでてくれる)

    キャンセル

同じタグがついた質問を見る

  • C#

    9058questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。