Projenin kök dizinindeki bir metin dosyası nasıl okunur?


94

Projemin kök dizinine eklediğim bir metin dosyasının ilk satırını okumak istiyorum. Yani, çözüm gezginim .txt dosyasını projemdeki .cs dosyalarımın yanında gösteriyor.

Ben de yapmaya çalıştım:

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

Ancak, Bin Klasörüne atıfta bulunduğu ve dosyam orada olmadığı için bu işe yaramıyor ... Bunun çalışmasını nasıl sağlayabilirim? : /

Teşekkürler


btw, StreamReader adı biraz kafa karıştırıcı, Microsoft benim görüşüme göre bu TextStreamReader'ı adlandırmalıydı
George Birbilis

Yanıtlar:


142

Solution Explorer'dan myfile.txt üzerine sağ tıklayın ve "Properties" i seçin

Oradan, Build Actionto content ve Copy to Output Directoryto Copy alwaysveyaCopy if newer

görüntü açıklamasını buraya girin


2
Bu dosyanın kullanıcılarımın görmesini istemem ... onu dll'ye yerleştirip oradan okumanın bir yolu var mı?
Shai UI

3
@foreyez Belki bir dosya kullanmak yerine projenize bir kaynak olarak dizeyi ekleyin. Verilerin elde edilemez olmayacağını unutmayın - Bu dosyanın içerdiği veriler ne kadar hassas?
Dan J

5
Oluşturma seçeneğini ayarlayın ve Embedded Resourceyerleşik kaynak bloglarının
dance2die

Bir proje için kurulum oluşturursam, o zaman mülk ile çalışamam. bunun için başka bir çözüm var mı?
Neel Bhasin

35

Bir web sitesi projesinin kök dizinini almak için aşağıdakileri kullanabilirsiniz:

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

Veya temel dizini şu şekilde alabilirsiniz:

AppDomain.CurrentDomain.BaseDirectory

32

Projenize bir Kaynak Dosyası ekleyin (Sağ Tıkla Proje-> Özellikler-> Kaynaklar). "Dizeler" yazan yerde, "dosyalar" olarak geçiş yapabilirsiniz. "Kaynak Ekle" yi seçin ve dosyanızı seçin.

Artık dosyanıza Properties.Resourceskoleksiyon aracılığıyla başvurabilirsiniz .


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

Yukarıdaki yöntem size şöyle bir şey getirecek:

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

Buradan System.IO.Directory.GetParent kullanarak geriye doğru gidebilirsiniz:

_filePath = Directory.GetParent(_filePath).FullName;

1 kez sizi \ bin konumuna, 2 kez \ myProjectNamespace'e götürür, yani şu şekilde olur:

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

Artık "C: \ Kullanıcılar \ kullanıcım \ Belgeler \ Visual Studio 2015 \ Projeler \ ProjemAd alanım" gibi bir şeyiniz var, bu nedenle dosyaAdı'nızın son yolunu ekleyin, örneğin:

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

Umarım yardımcı olur.


Teşekkürler, ancak _filePath = Path.Combine (_filePath, "myfile.txt"); // şık :)
FreeClimb

14

Gömülü olarak da alabilirsiniz (eylemi inşa et Resource), oradan nasıl geri getirilir:

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

( Charles tarafından bu yanıttan alınan bazı kodlar )


3

Bu durumda mutlak yolu kullanmalısınız. Ama eğer ayarlarsanız, CopyToOutputDirectory = CopyAlwaysyaptığınız gibi çalışacaktır.


0

Bu kodda rootdizin projesine erişirsiniz :

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

sonra:

StreamReader r = new StreamReader(_filePath + "/cities2.json"))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.