¿Cómo leer un archivo de texto en el directorio raíz del proyecto?

93

Quiero leer la primera línea de un archivo de texto que agregué al directorio raíz de mi proyecto. Es decir, mi explorador de soluciones muestra el archivo .txt junto con mis archivos .cs en mi proyecto.

Entonces, traté de hacer:

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

Pero esto no funciona ya que se refiere a la carpeta Bin y mi archivo no está ahí ... ¿Cómo puedo hacer que esto funcione? : /

Gracias

foreyez
fuente
Por cierto, el nombre de StreamReader es un poco confuso, Microsoft debería haber nombrado a ese TextStreamReader en mi opinión
George Birbilis

Respuestas:

141

Desde el Explorador de soluciones, haga clic derecho en myfile.txt y elija "Propiedades"

A partir de ahí, establecer la Build Actiona content y Copy to Output Directorya cualquiera Copy alwaysoCopy if newer

ingrese la descripción de la imagen aquí

dance2die
fuente
2
Preferiría no tener este archivo expuesto a mis usuarios ... ¿hay alguna manera de incrustarlo en el dll y leerlo desde allí?
foreyez
3
@foreyez Agregue la cadena a su proyecto como un recurso, en lugar de usar un archivo, tal vez. Tenga en cuenta que los datos no serán imposibles de obtener. ¿Qué tan sensibles son los datos que contiene este archivo?
Dan J
5
Establezca la opción de compilación en Embedded Resourcey lea el artículo sobre cómo leer el recurso emebedded blogs.msdn.com/b/nikola/archive/2008/05/14/…
dance2die
si estoy creando una configuración para un proyecto, entonces no puedo trabajar con la propiedad. ¿Hay alguna otra solución para eso?
Neel Bhasin
35

Puede utilizar lo siguiente para obtener el directorio raíz de un proyecto de sitio web:

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

O puede obtener el directorio base así:

AppDomain.CurrentDomain.BaseDirectory
Mangesh Pimpalkar
fuente
32

Agregue un archivo de recursos a su proyecto (haga clic derecho en Proyecto-> Propiedades-> Recursos). Donde dice "cadenas", puede cambiar a "archivos". Elija "Agregar recurso" y seleccione su archivo.

Ahora puede hacer referencia a su archivo a través de la Properties.Resourcescolección.

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

El método anterior le traerá algo como esto:

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

Desde aquí puede navegar hacia atrás usando System.IO.Directory.GetParent:

_filePath = Directory.GetParent(_filePath).FullName;

1 vez lo llevará a \ bin, 2 veces lo llevará a \ myProjectNamespace, por lo que sería así:

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

Bueno, ahora tiene algo como "C: \ Users \ myuser \ Documents \ Visual Studio 2015 \ Projects \ myProjectNamespace", así que simplemente adjunte la ruta final a su nombre de archivo, por ejemplo:

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

Espero eso ayude.

Bruno Carvalho
fuente
Gracias, pero puede _filePath = Path.Combine (_filePath, "myfile.txt"); // con estilo :)
FreeClimb
14

También puede tenerlo incrustado (acción de compilación configurada en Resource), así es como se puede recuperar desde allí:

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

(Algún código tomado de esta respuesta por Charles )

media pensión
fuente
3

Tienes que usar la ruta absoluta en este caso. Pero si configura el CopyToOutputDirectory = CopyAlways, funcionará mientras lo hace.

Shuhel Ahmed
fuente
0

En este código accedes al rootdirectorio del proyecto:

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

entonces:

StreamReader r = new StreamReader(_filePath + "/cities2.json"))
Mojtaba Nava
fuente