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


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


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

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.


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.


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 )


3

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


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"))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.