web-dev-qa-db-ja.com

パスを定義せずに既存のテキストファイルを読み取る方法

ほとんどの例では、正確な場所からテキストファイルを読み取る方法を示しています(f.e. "C:\ Users\Owner\Documents\test1.txt")。しかし、フルパスを書き込まずにテキストファイルを読み取る方法は、他のコンピューターにコピーしたときにコードが機能するようになります。 Visual Studioを使用して、プロジェクト(コンソールプロジェクト)に2つのテキストファイルを追加しましたが、これらのファイルを読み取る最適な方法がわかりません。問題を明確に説明してください。たぶん、これらのtxtファイルを別々に追加する必要がありました(.exeファイルと同じフォルダに直接など)?

32
Vilius

Directory.GetCurrentDirectory を使用できます。

var path = Path.Combine(Directory.GetCurrentDirectory(), "\\fileName.txt");

これは、アプリケーションの現在のディレクトリでfileName.txtファイルを探します。

46
Darren

アプリケーションがWebサービスの場合、_Directory.CurrentDirectory_は機能しません。

代わりにSystem.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory.ToString(), "yourFileName.txt"))を使用してください。

22
AXMIM

パスを指定する場合、絶対/ルート、または相対パスにすることができます。相対パスを指定すると、実行中のプロセスの作業ディレクトリを取得することで解決されます。

例:

string text = File.ReadAllText("Some\\Path.txt"); // relative path

上記のコードの効果は次のとおりです。

string text = File.ReadAllText(
    Path.Combine(Environment.CurrentDirectory, "Some\\Path.txt"));

アプリケーションに対して常に同じ場所にあるファイルがある場合は、それらへの相対パスを含めるだけで、異なるコンピューターで正しく解決されるはずです。

11
Dan

ファイルを相対的にするディレクトリを決定する必要があります。それが完了したら、次のようにフルパスを作成します。

string fullPathToFile = Path.Combine(dir, fileName);

ベースディレクトリdirを指定しない場合、プロセスの作業ディレクトリに何が起こっても、何の問題もありません。それはあなたがコントロールできないものです。たとえば、アプリケーションへのショートカットで指定できます。ファイルダイアログを使用すると変更できます。

コンソールアプリケーションは、作業ディレクトリが重要な入力であり、実行環境の明確に定義された部分であるようにコンソールアプリケーションが設計されているため、相対ファイルを直接使用するのが妥当です。ただし、GUIアプリの場合はそうではないため、明確に定義されたベースディレクトリを使用して相対ファイル名を絶対パスに明示的に変換することをお勧めします。

ここで、コンソールアプリケーションがあるので、問題のファイルが作業ディレクトリにあることが予想される場合は、相対パスを使用するのが妥当です。しかし、そうでないことは非常に一般的です。通常、作業ディレクトリは、ユーザーの入力ファイルと出力ファイルの保存場所を指定するために使用されます。通常、プログラムのファイルがある場所を指していません。

最後のオプションの1つは、これらのプログラムファイルを外部テキストファイルとして展開しないことです。おそらくより良いオプションは、リソースとして実行可能ファイルにリンクすることです。そうすれば、実行可能ファイルにバインドされ、この問題を完全に回避できます。

3
David Heffernan

これにより、作業ディレクトリにファイルがロードされます。

        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);
            }
        }
1
terrybozzio

読み込むファイルがどこにあるかを絶対に知る必要があります。ただし、この情報はrelativeになる可能性があるため、他のシステムにうまく適合させることができます。

そのため、現在のディレクトリ(Directory.GetCurrentDirectory()から取得)またはアプリケーションの実行可能パス(たとえば、Windows Formsを使用する場合、またはAssembly.GetEntryAssembly().Locationを使用する場合はApplication.ExecutablePathになります)または「ドキュメントと設定」などの特別なWindowsディレクトリに移動します(Environment.SpecialFolder列挙の1つの要素でEnvironment.GetFolderPath()を使用する必要があります)。

「現在のディレクトリ」と実行可能ファイルのパスは必ずしも同一ではないことに注意してください。どこを見るべきか知る必要があります!

どちらの場合でも、パスを操作する必要がある場合は、Pathクラスを使用してパスの一部を分割または結合します。

1
JeffRSon

プロジェクトはコンソールプロジェクトであるため、string [] argsを介して読み取りたいテキストファイルへのパスを渡すことができます

static void Main(string[] args)
{
}

Main内で、引数が渡されたかどうかを確認できます

if (args.Length == 0){ System.Console.WriteLine("Please enter a parameter");}

引数を抽出する

string fileToRead = args[0];

ほぼすべての言語が引数の受け渡しの概念をサポートし、C#と同様のパターンに従います。

C#固有の詳細については、 http://msdn.Microsoft.com/en-us/library/vstudio/cb20e19t.aspx を参照してください

1
armitage

パスを取得するには多くの方法があります。前述のCurrentDirrectoryを参照してください。また、Assembly.GetExecutingAssembly()。Locationを使用してアプリケーションの完全なファイル名を取得し、Pathクラスを使用してディレクトリ名を取得することもできます。

0
ElDog