如何读取项目根目录中的文本文件?


89

我想阅读添加到项目根目录的文本文件的第一行。意思是,我的解决方案资源管理器在项目中的.cs文件旁边显示.txt文件。

因此,我尝试做:

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

但这是行不通的,因为它是指Bin文件夹,而我的文件不在其中...我该如何工作?:/

谢谢


顺便说一句,StreamReader的名称有点令人困惑,我认为Microsoft应该将其命名为TextStreamReader
George Birbilis

Answers:


138

在解决方案资源管理器中,右键单击myfile.txt,然后选择“属性”

从那里,将Build ActioncontentCopy to Output DirectoryCopy alwaysCopy if newer

在此处输入图片说明


2
我不想让这个文件暴露给我的用户...有没有办法将其嵌入dll并从那里读取?
foreyez 2011年

3
@foreyez将该字符串作为资源添加到您的项目中,而不是使用文件。请注意,数据不会是不可获取的-此文件包含的数据有多敏感?
Dan J

5
设置构建选项Embedded Resource和阅读T ON如何阅读emebedded资源文章blogs.msdn.com/b/nikola/archive/2008/05/14/...
dance2die

如果我正在为项目创建安装程序,那么我将无法使用属性。还有其他解决方案吗?
尼尔·巴辛

34

您可以使用以下命令获取网站项目的根目录:

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

(的一些代码此答案查尔斯



0

在此代码中,您可以访问root目录项目:

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

然后:

StreamReader r = new StreamReader(_filePath + "/cities2.json"))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.