caminhos relativos no Visual Studio
-
03-07-2019 - |
Pergunta
Eu estou trabalhando no Visual Studio 2005 e adicionou um arquivo de texto que precisa ser analisado pelo botão direito do mouse o projeto no explorador solução e add -> novo item. Isso coloca o arquivo .txt para a pasta projeto. O arquivo de depuração .exe está na pasta / bin / debug.
Como faço para apontar corretamente para o arquivo txt a partir do código usando caminhos relativos que irá adequadamente resolver sendo duas pastas para trás, ao mesmo tempo, resolvendo ser na mesma pasta depois que a solução é publicado?
Solução
Confira o Aplicação Classe . Tem vários membros que podem ser usados ??para localizar arquivos, etc. relativos à aplicação uma vez que foi instalado.
Por exemplo, Application.ExecutablePath diz-lhe onde o arquivo EXE em execução está localizado; Você poderia, então, usar um caminho relativo para localizar o arquivo, por exemplo, .. \ .. \ FileToBeParsed.txt. No entanto, isso pressupõe que os arquivos são implantados na mesma estrutura de pastas como a estrutura de pastas do projeto, que não é geralmente o caso.
Considere imóveis como CommonAppDataPath e LocalUserAppDataPath para localizar arquivos de aplicativos relacionadas, uma vez que um projeto foi implantado.
Outras dicas
Se eu entendi sua pergunta: Selecione o arquivo no "Solution Explorer". Em Propriedades -> Copiar para Diretório de Saída, selecione "Copiar Sempre" ou "Copy if newer". Para ação de compilação, selecione "Conteúdo". Isso irá copiar o arquivo para a pasta / bin / debug em construção. Você deve ser capaz de fazer referência a ela a partir da raiz do projeto a partir de então.
Uma alternativa para localizar o arquivo no disco seria incluir o arquivo diretamente na compilado assembly como um recurso incorporado. Para fazer isso, clique com o botão direito no arquivo e escolha "Embedded Resource", como a ação de compilação. Você pode recuperar o arquivo como um fluxo de bytes:
Assembly thisAssembly = Assembly.GetExecutingAssembly();
Stream stream = thisAssembly.GetManifestResourceStream("Namespace.Folder.Filename.Ext");
byte[] data = new byte[stream.Length];
stream.Read(data, 0, (int)stream.Length);
Mais informações sobre recursos incorporados podem ser encontrados aqui e aqui .
Se você está construindo uma aplicação para o seu próprio uso, a sugestão de David Krep é melhor: basta copiar o arquivo para o diretório de saída. Se você está construindo um conjunto que vai ser reutilizados ou distribuído, a opção de recurso incorporado é preferível porque ele vai empacotar tudo em um único .dll.
Gostaria de acrescentar uma etapa de pós compilação que copia o arquivo txt na pasta de saída da configuração ativa:
xcopy "$(ProjectDir)*.txt" "$(OutDir)"
Existem algumas macros definidos como "$(ConfigurationName)"
, $(ProjectDir)
Vá para Propriedades do projeto -> Propriedades de configuração -> Depuração
Set "diretório de trabalho" para $ (TargetDir)
Em seguida, você pode fazer referência corretamente seu arquivo usando um caminho relativo em seu código (por exemplo, ".... \ foo.xml")
A solução Application.ExecutablePath não funcionam para UnitTests. O caminho da vstesthost.exe será devolvido
System.Reflection.Assembly.GetExecutingAssembly (). Location vai funcionar, mas dá o caminho com o assemblyname incluído.
Então, isso funciona:
System.Reflection.Assembly.GetExecutingAssembly().Location + "\..\" + "fileToRead.txt"
Mas, assim:
fileToRead.txt
Funciona também. Parece diretório de trabalho é o anuário de assembly em execução por padrão.
Você pode adicionar um evento pós-compilação para copiar o arquivo .txt para a pasta de saída de compilação. Em seguida, seu código pode assumir que o arquivo está na mesma pasta que o executável.