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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

Q&A

解決済

3回答

1933閲覧

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

orbwedu4

総合スコア13

C#

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

0グッド

0クリップ

投稿2018/11/18 13:53

前提・実現したいこと

教えてください。

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フォームアプリケーション

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

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

投稿2018/11/18 14:53

YAmaGNZ

総合スコア10242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

orbwedu4

2018/11/18 15:13

回答ありがとうございます。 >ファイル名のみを記述した場合、相対パスとして扱われ、カレントフォルダにあるファイルを示します。 これはWindowsフォームアプリケーションを普段作っている方からすると常識的なことですか? Windowsのファイル指定について初心者が調べるとしたらどのあたりから手をつけていけば よいでしょうか? (ソースコードをできるだけ手を抜くために、test.txtファイルの場所はexeのあるフォルダと 同じ場所に限定するつもりです。)
Zuishin

2018/11/18 15:17

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

2018/11/18 15:27

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

2018/11/18 16:20

>カレントディレクトリはユーザーがいかようにも変えられるので相対パスは信頼できません ユーザーがカレントディレクトリをかえてもtest.txtと実行ファイルが同じ場所にあれば 問題なさそうな気がするのですが... (今ためしにtest.txtと実行ファイルを同じフォルダにいれていろんな場所にコピーして実行して みるとパス指定なしでもtest.txtを読み込めました。) test.txtの置き場所をexeのあるフォルダに限定していてもフルパスで指定しなきゃ危険でしょうか?
Zuishin

2018/11/18 22:22

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

2018/11/18 22: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でも持っているものだと思います。
guest

0

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

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

投稿2018/11/18 14:40

segavvy

総合スコア958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

orbwedu4

2018/11/18 14:48

回答ありがとうございます。 解説をざっとよんでみたのですがパスを省略した場合にどうなるのかよくわかりませんでした...。 すなおにパスを指定したほうが良い気がしてきました。
segavvy

2018/11/18 14:54

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

2018/11/18 15:35

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

2018/11/18 15:40

そうですね。 私の経験では、入門書や入門サイトで広く浅く一通り勉強されるのが、一見遠回りでも最終的に近道になるのではないかと思います。 なお、マイクロソフトのサイトでも以下に一連の初学者向けの説明がありますが、難易度がちょっと高めです。 .NET にようこそ https://docs.microsoft.com/ja-jp/dotnet/welcome
orbwedu4

2018/11/18 15:50

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

0

ベストアンサー

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

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

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

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

投稿2018/11/18 22:29

編集2018/11/18 22:38
y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

orbwedu4

2018/11/19 13: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.すべてアクセスできました。 すごく納得できました。 ありがとうございました。
y_waiwai

2018/11/19 13:28

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

2018/11/19 13:49

//var path = System.AppDomain.CurrentDomain.BaseDirectory + "test.txt"; var path = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory,"test.txt"); Path.Combineをつかってアクセスできました。こんなかんじでいいんでしょうか? いまはどちらも動作していますがあとあとのことを考えてPath.Combineを使うようにします。 (無効な文字を含むと例外がでてくれる)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問