プロジェクトのルートディレクトリにあるテキストファイルを読み取る方法


89

プロジェクトのルートディレクトリに追加したテキストファイルの最初の行を読みたいのですが。つまり、ソリューションエクスプローラーでは、プロジェクトの.csファイルと一緒に.txtファイルが表示されています。

だから、私はやろうとしました:

TextReader tr = new StreamReader(@"myfile.txt");
string myText = tr.ReadLine();

しかし、これはBinフォルダーを参照していて、ファイルがそこにないため、機能しません...これを機能させるにはどうすればよいですか?:/

ありがとう


ところで、StreamReaderの名前は少しわかりにくいので、Microsoftは私のTextStreamReaderに名前を付けるべきだったと思います
George Birbilis

回答:


138

ソリューションエクスプローラーで、myfile.txtを右クリックし、[プロパティ]を選択します。

そこから、セットBuild Actioncontent してCopy to Output DirectoryのいずれかCopy alwaysまたはCopy if newer

ここに画像の説明を入力してください


2
このファイルをユーザーに公開したくないのですが、それをdllに埋め込み、そこから読み取る方法はありますか?
foreyez 2011年

3
@foreyezファイルを使用する代わりに、文字列をリソースとしてプロジェクトに追加します。データが取得できなくなるわけではないことに注意してください-このファイルに含まれるデータはどの程度機密ですか?
Dan J

5
ビルドオプションをに設定し、Embedded Resourceemebeddedリソースblogs.msdn.com/b/nikola/archive/2008/05/14/…の
dance2die

プロジェクトの作成セットアップの場合、プロパティを操作できません。そのための他の解決策はありますか?
Neel Bhasin 2013年

34

以下を使用して、Webサイトプロジェクトのルートディレクトリを取得できます。

String FilePath;
FilePath = Server.MapPath("/MyWebSite");

または、次のようにベースディレクトリを取得できます。

AppDomain.CurrentDomain.BaseDirectory

30

リソースファイルをプロジェクトに追加します([プロジェクト]-> [プロパティ]-> [リソース]を右クリック)。「文字列」と表示されている場合は、「ファイル」に切り替えることができます。「リソースの追加」を選択し、ファイルを選択します。

これで、Properties.Resourcesコレクションを通じてファイルを参照できます。


15
private string _filePath = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory);

上記のメソッドは次のようなものをもたらします:

"C:\Users\myuser\Documents\Visual Studio 2015\Projects\myProjectNamespace\bin\Debug"

ここから、System.IO.Directory.GetParentを使用して後方に移動できます。

_filePath = Directory.GetParent(_filePath).FullName;

1回で\ binに、2回で\ myProjectNamespaceにアクセスできるため、次のようになります。

_filePath = Directory.GetParent(Directory.GetParent(_filePath).FullName).FullName;

さて、「C:\ Users \ myuser \ Documents \ Visual Studio 2015 \ Projects \ myProjectNamespace」のようになっているので、次のように、fileNameに最終パスを追加するだけです。

_filePath += @"\myfile.txt";
TextReader tr = new StreamReader(_filePath);

それが役に立てば幸い。


ありがとうございます、ただし_filePath = Path.Combine(_filePath、 "myfile.txt"); //スタイリッシュに:)
FreeClimb

14

これを埋め込むこともできます(ビルドアクションをに設定Resource)。これは、そこから取得する方法です。

private static UnmanagedMemoryStream GetResourceStream(string resName)
{
    var assembly = Assembly.GetExecutingAssembly();
    var strResources = assembly.GetName().Name + ".g.resources";
    var rStream = assembly.GetManifestResourceStream(strResources);
    var resourceReader = new ResourceReader(rStream);
    var items = resourceReader.OfType<DictionaryEntry>();
    var stream = items.First(x => (x.Key as string) == resName.ToLower()).Value;
    return (UnmanagedMemoryStream)stream;
}

private void Button1_Click(object sender, RoutedEventArgs e)
{
    string resName = "Test.txt";
    var file = GetResourceStream(resName);
    using (var reader = new StreamReader(file))
    {
        var line = reader.ReadLine();
        MessageBox.Show(line);
    }
}

チャールズによってこの回答から取られたいくつかのコード)


3

この場合、絶対パスを使用する必要があります。ただし、を設定した場合は、設定CopyToOutputDirectory = CopyAlwaysどおりに機能します。


0

このコードでは、rootディレクトリプロジェクトにアクセスします。

 string _filePath = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory);

次に:

StreamReader r = new StreamReader(_filePath + "/cities2.json"))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.