วิธีอ่านไฟล์ข้อความในไดเรกทอรีรากของโครงการ


94

ฉันต้องการอ่านบรรทัดแรกของไฟล์ข้อความที่ฉันเพิ่มลงในไดเร็กทอรีรากของโปรเจ็กต์ของฉัน หมายความว่าโปรแกรมสำรวจโซลูชันของฉันกำลังแสดงไฟล์. txt ข้างไฟล์. cs ในโครงการของฉัน

ฉันพยายามทำ:

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

แต่ไม่ได้ผลเนื่องจากอ้างถึง Bin Folder และไฟล์ของฉันไม่อยู่ในนั้น ... ฉันจะทำให้มันทำงานได้อย่างไร? : /

ขอบคุณ


btw ชื่อ StreamReader ค่อนข้างสับสน Microsoft ควรตั้งชื่อ TextStreamReader นั้นในความคิดของฉัน
George Birbilis

คำตอบ:


142

จาก Solution Explorer คลิกขวาที่ myfile.txt แล้วเลือก "Properties"

จากนั้นตั้งค่าBuild Actionไปcontent และCopy to Output Directoryให้ทั้งสองCopy alwaysหรือCopy if newer

ป้อนคำอธิบายภาพที่นี่


2
ฉันไม่อยากให้ไฟล์นี้เปิดเผยต่อผู้ใช้ของฉัน ... มีวิธีฝังลงใน dll และอ่านจากที่นั่นหรือไม่?
Shai UI

3
@foreyez เพิ่มสตริงในโครงการของคุณเป็นทรัพยากรแทนที่จะใช้ไฟล์ โปรดทราบว่าข้อมูลจะไม่สามารถเข้าถึงได้ - ข้อมูลในไฟล์นี้มีความละเอียดอ่อนเพียงใด
Dan J

5
ตั้งค่าตัวเลือกการสร้างเป็นEmbedded Resourceและอ่านบทความเกี่ยวกับวิธีการอ่าน emebedded resource blogs.msdn.com/b/nikola/archive/2008/05/14/…
dance2die

หากฉันสร้างการตั้งค่าสำหรับโครงการฉันจะไม่สามารถทำงานกับคุณสมบัติได้ มีวิธีแก้ปัญหาอื่นไหม
Neel Bhasin

35

คุณสามารถใช้สิ่งต่อไปนี้เพื่อรับไดเรกทอรีรากของโครงการเว็บไซต์:

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

หรือคุณจะได้รับไดเร็กทอรีฐานดังนี้:

AppDomain.CurrentDomain.BaseDirectory

32

เพิ่มไฟล์ทรัพยากรในโครงการของคุณ (คลิกขวาที่โครงการ -> คุณสมบัติ -> ทรัพยากร) ที่ระบุว่า "สตริง" คุณสามารถเปลี่ยนเป็น "ไฟล์" ได้ เลือก "เพิ่มทรัพยากร" และเลือกไฟล์ของคุณ

ตอนนี้คุณสามารถอ้างอิงไฟล์ของคุณผ่านProperties.Resourcesคอลเลกชัน


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

วิธีการด้านบนจะนำเสนอสิ่งต่อไปนี้:

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

จากที่นี่คุณสามารถนำทางย้อนกลับโดยใช้ System.IO.Directory.GetParent:

_filePath = Directory.GetParent(_filePath).FullName;

1 ครั้งจะพาคุณไปที่ \ bin 2 ครั้งจะพาคุณไปที่ \ myProjectNamespace ดังนั้นมันจะเป็นดังนี้:

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

ตอนนี้คุณมีบางอย่างเช่น "C: \ Users \ myuser \ Documents \ Visual Studio 2015 \ Projects \ myProjectNamespace" ดังนั้นเพียงแค่แนบพา ธ สุดท้ายไปยัง fileName ของคุณเช่น:

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

หวังว่าจะช่วยได้


ขอบคุณ แต่สามารถ _filePath = Path.Combine (_filePath, "myfile.txt"); // มีสไตล์ :)
FreeClimb

14

คุณสามารถฝังไว้ได้ (สร้างการดำเนินการตั้งค่าเป็นResource) เช่นกันนี่คือวิธีดึงข้อมูลจากที่นั่น:

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 )


3

คุณต้องใช้เส้นทางสัมบูรณ์ในกรณีนี้ แต่ถ้าคุณตั้งค่าCopyToOutputDirectory = CopyAlwaysมันจะทำงานตามที่คุณกำลังทำอยู่


0

ในรหัสนี้คุณเข้าถึงrootโครงการไดเร็กทอรี:

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

แล้ว:

StreamReader r = new StreamReader(_filePath + "/cities2.json"))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.