Bagaimana cara membaca file teks di direktori root proyek?

94

Saya ingin membaca baris pertama dari file teks yang saya tambahkan ke direktori root proyek saya. Artinya, penjelajah solusi saya menampilkan file .txt di samping file .cs saya di proyek saya.

Jadi, saya mencoba melakukan:

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

Tetapi ini tidak berhasil karena mengacu pada Folder Bin dan file saya tidak ada di sana ... Bagaimana saya dapat membuat ini berfungsi? : /

Terima kasih

Shai UI
sumber
btw, nama StreamReader agak membingungkan, Microsoft seharusnya menamai TextStreamReader itu menurut pendapat saya
George Birbilis

Jawaban:

142

Dari Solution Explorer, klik kanan pada myfile.txt dan pilih "Properties"

Dari sana, setel Build Actionke content dan Copy to Output Directoryke salah satu Copy alwaysatauCopy if newer

masukkan deskripsi gambar di sini

dance2die
sumber
2
Saya lebih suka file ini tidak diekspos ke pengguna saya ... apakah ada cara untuk menyematkannya di dll dan membacanya dari sana?
Shai UI
3
@foreyez Tambahkan string ke proyek Anda sebagai sumber daya, daripada menggunakan file, mungkin. Perhatikan bahwa data tidak akan dapat diperoleh - Seberapa sensitif data yang dikandung file ini?
Dan J
5
Mengatur membangun pilihan untuk Embedded Resourcedan membaca t artikel tentang cara membaca emebedded sumber daya blogs.msdn.com/b/nikola/archive/2008/05/14/...
dance2die
jika saya membuat pengaturan untuk sebuah proyek maka saya tidak dapat bekerja dengan properti. apakah ada solusi lain untuk itu?
Neel Bhasin
35

Anda dapat menggunakan berikut ini untuk mendapatkan direktori root dari proyek situs web:

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

Atau Anda bisa mendapatkan direktori dasar seperti ini:

AppDomain.CurrentDomain.BaseDirectory
Mangesh Pimpalkar
sumber
32

Tambahkan File Sumber Daya ke proyek Anda (Klik Kanan Proyek-> Properti-> Sumber Daya). Di mana dikatakan "string", Anda dapat beralih menjadi "file". Pilih "Tambahkan Sumber Daya" dan pilih file Anda.

Sekarang Anda dapat mereferensikan file Anda melalui Properties.Resourceskoleksi.

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

Metode di atas akan memberi Anda sesuatu seperti ini:

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

Dari sini Anda dapat menavigasi mundur menggunakan System.IO.Directory.GetParent:

_filePath = Directory.GetParent(_filePath).FullName;

1 kali akan membawa Anda ke \ bin, 2 kali akan membawa Anda ke \ myProjectNamespace, jadi akan seperti ini:

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

Nah, sekarang Anda memiliki sesuatu seperti "C: \ Users \ myuser \ Documents \ Visual Studio 2015 \ Projects \ myProjectNamespace", jadi lampirkan saja jalur terakhir ke nama file Anda, misalnya:

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

Semoga membantu.

Bruno Carvalho
sumber
Terima kasih, tapi can _filePath = Path.Combine (_filePath, "myfile.txt"); // dengan gaya :)
FreeClimb
14

Anda juga dapat menyematkannya (build action set to Resource), berikut cara mengambilnya dari sana:

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

(Beberapa kode diambil dari jawaban ini oleh Charles )

HB
sumber
3

Anda harus menggunakan jalur absolut dalam kasus ini. Tetapi jika Anda menyetelnya CopyToOutputDirectory = CopyAlways, ini akan berfungsi seperti yang Anda lakukan.

Shuhel Ahmed
sumber
0

Dalam kode ini Anda mengakses ke rootproyek direktori:

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

kemudian:

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