Como ler um arquivo de texto no diretório raiz do projeto?

89

Quero ler a primeira linha de um arquivo de texto que adicionei ao diretório raiz do meu projeto. Ou seja, meu explorador de soluções está mostrando o arquivo .txt junto com meus arquivos .cs no meu projeto.

Então, tentei fazer:

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

Mas isso não funciona, pois se refere à pasta Bin e meu arquivo não está lá ... Como posso fazer isso funcionar? : /

obrigado

Foreyez
fonte
btw, o nome StreamReader é um pouco confuso, a Microsoft deveria ter nomeado esse TextStreamReader na minha opinião
George Birbilis

Respostas:

138

No Solution Explorer, clique com o botão direito em myfile.txt e escolha "Propriedades"

A partir daí, defina Build Actionpara content e Copy to Output Directorypara Copy alwaysouCopy if newer

insira a descrição da imagem aqui

dance2die
fonte
2
Prefiro não ter este arquivo exposto aos meus usuários ... há uma maneira de incorporá-lo na dll e lê-lo de lá?
foreyez de
3
@foreyez Adicione a string ao seu projeto como um recurso, em vez de usar um arquivo, talvez. Observe que os dados não ficarão impossíveis de obter - Quão sensíveis são os dados que este arquivo contém?
Dan J de
5
Defina a opção de compilação Embedded Resourcee leia o artigo sobre como ler emebedded resource blogs.msdn.com/b/nikola/archive/2008/05/14/…
dance2die
se eu estiver criando uma configuração para um projeto, não poderei trabalhar com propriedade. existe alguma outra solução para isso?
Neel Bhasin,
34

Você pode usar o seguinte para obter o diretório raiz de um projeto de site:

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

Ou você pode obter o diretório base assim:

AppDomain.CurrentDomain.BaseDirectory
Mangesh Pimpalkar
fonte
30

Adicione um Arquivo de Recurso ao seu projeto (Clique com o botão direito do mouse em Projeto-> Propriedades-> Recursos). Onde diz "strings", você pode mudar para "arquivos". Escolha "Adicionar recurso" e selecione seu arquivo.

Agora você pode consultar seu arquivo por meio da Properties.Resourcescoleção.

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

O método acima trará algo assim:

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

A partir daqui, você pode navegar para trás usando System.IO.Directory.GetParent:

_filePath = Directory.GetParent(_filePath).FullName;

1 vez levará você para \ bin, 2 vezes levará você para \ myProjectNamespace, então seria assim:

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

Bem, agora você tem algo como "C: \ Users \ myuser \ Documents \ Visual Studio 2015 \ Projects \ myProjectNamespace", portanto, basta anexar o caminho final ao seu fileName, por exemplo:

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

Espero que ajude.

Bruno carvalho
fonte
Obrigado, mas pode _filePath = Path.Combine (_filePath, "myfile.txt"); // elegantemente :)
FreeClimb
14

Você também pode incorporá-lo (ação de construção definida Resourcecomo), veja como recuperá-lo de lá:

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

(Algum código retirado desta resposta de Charles )

HB
fonte
3

Você tem que usar o caminho absoluto neste caso. Mas se você definir o CopyToOutputDirectory = CopyAlways, ele funcionará como você está fazendo.

Shuhel Ahmed
fonte
0

Neste código você acessa o rootdiretório do projeto:

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

então:

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