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


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


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

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.


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.


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 )


3

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


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"))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.