Comment lire un fichier texte dans le répertoire racine du projet?

89

Je souhaite lire la première ligne d'un fichier texte que j'ai ajouté au répertoire racine de mon projet. Cela signifie que mon explorateur de solutions affiche le fichier .txt à côté de mes fichiers .cs dans mon projet.

Alors, j'ai essayé de faire:

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

Mais cela ne fonctionne pas car il fait référence au dossier Bin et mon fichier n'y est pas ... Comment puis-je faire fonctionner cela? : /

Merci

Foreyez
la source
btw, le nom de StreamReader est un peu déroutant, Microsoft aurait dû nommer ce TextStreamReader à mon avis
George Birbilis

Réponses:

138

Dans l'Explorateur de solutions, faites un clic droit sur myfile.txt et choisissez "Propriétés"

À partir de là, définissez le Build Actionto content et Copy to Output Directorysur soit Copy alwaysouCopy if newer

entrez la description de l'image ici

dance2die
la source
2
Je préfère ne pas exposer ce fichier à mes utilisateurs ... y a-t-il un moyen de l'intégrer dans la DLL et de le lire à partir de là?
foreyez
3
@foreyez Ajoutez la chaîne à votre projet en tant que ressource, au lieu d'utiliser un fichier, peut-être. Notez que les données ne seront pas inaccessibles - Quelle est la sensibilité des données contenues dans ce fichier?
Dan J
5
Définissez l'option de construction sur Embedded Resourceet lisez l'article sur la lecture de la ressource intégrée blogs.msdn.com/b/nikola/archive/2008/05/14/…
dance2die
si je crée une configuration pour un projet, je ne peux pas travailler avec la propriété. y a-t-il une autre solution pour cela?
Neel Bhasin
34

Vous pouvez utiliser ce qui suit pour obtenir le répertoire racine d'un projet de site Web:

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

Ou vous pouvez obtenir le répertoire de base comme ceci:

AppDomain.CurrentDomain.BaseDirectory
Mangesh Pimpalkar
la source
30

Ajoutez un fichier de ressources à votre projet (clic droit sur Projet-> Propriétés-> Ressources). Là où il est dit "chaînes", vous pouvez passer en "fichiers". Choisissez "Ajouter une ressource" et sélectionnez votre fichier.

Vous pouvez désormais référencer votre fichier via la Properties.Resourcescollection.

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

La méthode ci-dessus vous apportera quelque chose comme ceci:

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

De là, vous pouvez naviguer vers l'arrière en utilisant System.IO.Directory.GetParent:

_filePath = Directory.GetParent(_filePath).FullName;

1 fois vous amènera à \ bin, 2 fois vous amèneront à \ myProjectNamespace, donc ce serait comme ceci:

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

Eh bien, maintenant vous avez quelque chose comme "C: \ Users \ myuser \ Documents \ Visual Studio 2015 \ Projects \ myProjectNamespace", alors attachez simplement le chemin final à votre nom de fichier, par exemple:

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

J'espère que ça aide.

Bruno Carvalho
la source
Merci, mais peut _filePath = Path.Combine (_filePath, "myfile.txt"); // élégamment :)
FreeClimb
14

Vous pouvez également l'inclure (action de construction définie sur Resource), voici comment le récupérer à partir 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);
    }
}

(Quelques codes tirés de cette réponse de Charles )

HB
la source
3

Vous devez utiliser le chemin absolu dans ce cas. Mais si vous définissez le CopyToOutputDirectory = CopyAlways, cela fonctionnera comme vous le faites.

Shuhel Ahmed
la source
0

Dans ce code, vous accédez au rootprojet de répertoire:

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

puis:

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