2011-06-20 8 views
65

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 al lado de mis archivos .cs en mi proyecto.¿Cómo leer un archivo de texto en el directorio raíz del proyecto?

tanto, he intentado hacer:

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

Pero esto no funciona, ya que se está refiriendo a la carpeta bin y mi archivo no está ahí ... ¿Cómo puedo hacer este trabajo? :/

Gracias

+0

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

Respuesta

97

Desde el Explorador de soluciones, haga clic derecho sobre miarchivo.txt y elija "Propiedades"

A partir de ahí, establecer el Build Action a content y Copy to Output Directory a cualquiera Copy always o Copy if newer

enter image description here

+2

Prefiero no tener este archivo expuesto a mis usuarios ... ¿hay alguna manera de incrustarlo en el dll y leerlo ¿desde allí? – foreyez

+2

@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 inalcanzables. ¿Cuán delicados son los datos que contiene este archivo? –

+4

Establezca la opción de compilación en 'Recurso incrustado' y lea el artículo sobre cómo leer el recurso emebedded http://blogs.msdn.com/b/nikola/archive/2008/05/14/embedded-resources.aspx – Sung

3

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

25

Usted puede usar 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 de base de este modo:

AppDomain.CurrentDomain.BaseDirectory 
23

añadir un archivo de recursos para su proyecto (Haga clic derecho Proyecto-> Propiedades-> Recursos). Donde dice "cadenas", puede cambiar para ser "archivos". Elija "Agregar recurso" y seleccione su archivo.

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

9

Puede tenerlo incorporado (ampliar la acción ajustado a Resource), así, esta es la forma de recuperar a partir de ahí:

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

(Parte del código tomado de this answer por Charles)

9
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 hora te llevará a \ bin, 2 veces te llevará a \ myProjectNamespace, por lo que sería de esta manera:

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

Bueno, ahora usted tiene algo así como "C : \ Users \ miUsuario \ documentos \ Visual Studio 2015 \ Projects \ myProjectNamespace", por lo que sólo fijar el camino final al nombre del archivo, por ejemplo:

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

espero que ayude.

Cuestiones relacionadas