web-dev-qa-db-ja.com

任意のコンピューターのプロジェクトフォルダーにファイルを書き込む

私はクラスのプロジェクトに取り組んでいます。私がしなければならないのは、解析された命令をファイルにエクスポートすることです。 Microsoftには、ファイルへの書き込み方法を説明する次の例があります。

// Compose a string that consists of three lines.
string lines = "First line.\r\nSecond line.\r\nThird line.";

// Write the string to a file.
System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\test.txt");
file.WriteLine(lines);

file.Close();

その部分は問題ありませんが、現在のプロジェクトの環境/場所にファイルを書き込む方法はありますか?特定のパスをハードコーディングする代わりに、それを実行したいと思います(つまり、"C:\\test.txt")。

10
blutuu

はい、相対パスを使用してください。 @".\test.txt"を使用する場合(@は文字列リテラルを実行しているとだけ言っているので、エスケープ文字が不要になるため、".\\test.txt"も実行でき、同じ場所に書き込むことができます)ほとんどの場合、プログラムを含むフォルダである現在の作業ディレクトリにファイルを書き込みます。

20
evanmcdonnal

Assembly.GetExecutingAssembly().Location を使用して、メインアセンブリ(.exe)のパスを取得できます。そのパスが保護されたフォルダー(たとえば、Program Files)内にある場合、ユーザーが管理者でない限り、そこに書き込むことはできないことに注意してください。これに依存しないでください。

サンプルコードは次のとおりです。

string path = System.Reflection.Assembly.GetExecutingAssembly().Location;
string fileName = Path.Combine(path, "test.txt");

この質問/回答 は、書き込みアクセス権を持つユーザーのプロファイルフォルダーを取得する方法を示しています。または、ユーザーのMy Documentsフォルダーを使用してファイルを保存することもできます。この場合も、アクセスできることが保証されています。あなたは呼び出すことによってそのパスを取得することができます

Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
8
xxbbcc

プログラムの現在のフォルダの場所を取得する場合は、次のコードを使用します。

string path = Directory.GetParent(System.Reflection.Assembly.GetExecutingAssembly().Location).FullName; // return the application.exe current folder
string fileName = Path.Combine(path, "test.txt"); // make the full path as folder/test.text

データをファイルに書き込むための完全なコード:

string path = Directory.GetParent(System.Reflection.Assembly.GetExecutingAssembly().Location).FullName;
string fileName = Path.Combine(path, "test.txt");

if (!File.Exists(fileName))
{
    // Create the file.
    using (FileStream fs = File.Create(fileName))
    {
        Byte[] info =
            new UTF8Encoding(true).GetBytes("This is some text in the file.");

        // Add some information to the file.
        fs.Write(info, 0, info.Length);
    }
}
0
ahmed.soli