Most of the examples shows how to read text file from exact location (f.e. "C:\Users\Owner\Documents\test1.txt"). But, how to read text files without writing full path, so my code would work when copied to other computers. With visual studio I added 2 text files to project (console project) and don't know best way to read those files. Hope I described my problem clearly. Maybe I needed to add those txt files differentely (like directly to same folder as .exe file)?
8 に答える
アプリケーションが Web サービスの場合Directory.CurrentDirectory
は機能しません。
System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "yourFileName.txt"))
代わりに使用してください。
ファイルを相対的に配置するディレクトリを決定する必要があります。それが完了したら、次のようにフルパスを作成します。
string fullPathToFile = Path.Combine(dir, fileName);
ベースディレクトリを指定しないdir
と、プロセスの作業ディレクトリに何が起こっても、完全に翻弄されます。それはあなたのコントロールの及ばないものです。たとえば、アプリケーションへのショートカットで指定されている場合があります。ファイルダイアログを使用すると、変更できます。
コンソール アプリケーションの場合、作業ディレクトリが重要な入力であり、実行環境の明確に定義された部分となるようにコンソール アプリケーションが設計されているため、相対ファイルを直接使用することは合理的です。ただし、そうではない GUI アプリの場合は、適切に定義されたベース ディレクトリを使用して、相対ファイル名を完全な絶対パスに明示的に変換することをお勧めします。
ここでは、コンソール アプリケーションを使用しているため、問題のファイルが作業ディレクトリに配置されることが予想される場合は、相対パスを使用するのが合理的です。しかし、そうでないことは非常に一般的です。通常、作業ディレクトリは、ユーザーの入力ファイルと出力ファイルを格納する場所を指定するために使用されます。通常、プログラムのファイルがある場所を指しているわけではありません。
最後の選択肢の 1 つは、これらのプログラム ファイルを外部テキスト ファイルとして展開しないことです。おそらくより良いオプションは、それらをリソースとして実行可能ファイルにリンクすることです。そうすれば、それらは実行可能ファイルにバインドされ、この問題を完全に回避できます。
読み取るファイルがどこにあるかを絶対に知っておく必要があります。ただし、この情報はもちろん相対的である可能性があるため、他のシステムにうまく適合する可能性があります。
そのため、現在のディレクトリ ( から取得Directory.GetCurrentDirectory()
) またはアプリケーションの実行可能パス (たとえばApplication.ExecutablePath
、Windows フォームを使用している場合や を介して思い浮かぶAssembly.GetEntryAssembly().Location
)、または "Documents and Settings" などの特別な Windows ディレクトリ (Environment.GetFolderPath()
いずれかで使用する必要があります) に関連付けることができます。Environment.SpecialFolder
列挙の要素)。
「現在のディレクトリ」と実行可能ファイルのパスは必ずしも同じではないことに注意してください。あなたはどこを見るべきかを知る必要があります!
どちらの場合でも、パスを操作する必要がある場合は、Path クラスを使用してパスの一部を分割または結合します。
これにより、作業ディレクトリにファイルがロードされます。
static void Main(string[] args)
{
string fileName = System.IO.Path.GetFullPath(Directory.GetCurrentDirectory() + @"\Yourfile.txt");
Console.WriteLine("Your file content is:");
using (StreamReader sr = File.OpenText(fileName))
{
string s = "";
while ((s = sr.ReadLine()) != null)
{
Console.WriteLine(s);
}
}
Console.ReadKey();
}
コンソールを使用している場合は、これを行うこともできます。ユーザーは、ファイルのパス (拡張子付きのファイル名を含む) を書き込むように求められます。
static void Main(string[] args)
{
Console.WriteLine("****please enter path to your file****");
Console.Write("Path: ");
string pth = Console.ReadLine();
Console.WriteLine();
Console.WriteLine("Your file content is:");
using (StreamReader sr = File.OpenText(pth))
{
string s = "";
while ((s = sr.ReadLine()) != null)
{
Console.WriteLine(s);
}
}
Console.ReadKey();
}
たとえば、winforms を使用する場合は、次の簡単な例を試してください。
private void button1_Click(object sender, EventArgs e)
{
string pth = "";
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)
{
pth = ofd.FileName;
textBox1.Text = File.ReadAllText(pth);
}
}
パスを取得するには多くの方法があります。言及されているCurrentDirectoryを参照してください。また、Assembly.GetExecutingAssembly().Location を使用してアプリケーションの完全なファイル名を取得し、Path クラスを使用してディレクトリ名を取得することもできます。