経緯
C#で.txt
ファイルを読み込むWindowsアプリケーションを作成し、自分のPCでは正常に動作していました。
しかし、他の人のPCで同じアプリを実行してみたところ、ファイルが読み込まれずアプリが動作しないという問題が発生しました。
原因を調べた結果、ファイルのパス指定に問題があったことが判明し、対処方法を学びました。
原因:ファイルパスをフルパスで指定していた
最初に書いていたコードでは、ファイルの場所をフルパス(絶対パス)で指定していたため、
他のPCではそのパスが存在せず、ファイルを読み込むことができませんでした。
以下がうまく動かなかったコード例です。
// ディレクトリをフルパスで指定(他のPCでは存在しない可能性あり)
Directory.SetCurrentDirectory("C:\\Users\\mori\\デスクトップ\\MyC#\\単語帳\\単語帳\\data\\");
string filePath = "単語テキスト.txt";
このコードでは、特定のユーザー環境・フォルダ構成でのみ正しく動作します。
他のPCで同じフォルダ構成が存在しない場合、ファイルが見つからずアプリは正しく動作しません。
解決策:相対パスを使って実行ファイルの場所からファイルを取得する
正しい方法は、相対パスを使って、実行ファイルの場所からファイルを参照するようにすることです。
以下のように書き換えることで、どのPCでも動作するようになります。
// アプリケーションの実行ファイルがあるフォルダからの相対パスで指定
string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "単語テキスト.txt");
この方法では、アプリが配置されているフォルダと同じ場所に単語テキスト.txt
が存在すれば、
どのPCでもそのファイルを正しく読み込むことができます。
注意点
・単語テキスト.txt
は、実行ファイル(.exe)と同じディレクトリに配置しておく必要があります。
・アプリを配布する際は、.exe
と.txt
ファイルをまとめて同じフォルダに入れて渡すようにしてください。
・インストーラやZIP形式で配布する場合も、フォルダ構成が崩れないよう注意が必要です。
まとめ
C#で作成したアプリを他のPCで実行する際にファイル読み込みが失敗する原因の多くは、フルパス指定による環境依存です。AppDomain.CurrentDomain.BaseDirectory
を使って実行ファイルからの相対パスで指定することで、どのPCでも共通の挙動を実現できます。
今回の方法は、アプリの配布・運用時に非常に重要なポイントです。
最後までお読みいただき、ありがとうございました。