Làm thế nào để đọc một tệp văn bản trong thư mục gốc của dự án?


93

Tôi muốn đọc dòng đầu tiên của tệp văn bản mà tôi đã thêm vào thư mục gốc của dự án của mình. Có nghĩa là, trình khám phá giải pháp của tôi đang hiển thị tệp .txt cùng với tệp .cs trong dự án của tôi.

Vì vậy, tôi đã cố gắng làm:

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

Nhưng điều này không hoạt động vì nó tham chiếu đến Thư mục Bin và tệp của tôi không có trong đó ... Làm cách nào để làm cho điều này hoạt động? : /

Cảm ơn


btw, tên StreamReader là một chút bối rối, Microsoft nên đã đặt tên cho rằng TextStreamReader theo ý kiến của tôi
George Birbilis

Câu trả lời:


141

Từ Solution Explorer, nhấp chuột phải vào myfile.txt và chọn "Thuộc tính"

Từ đó, thiết lập Build Actionđể contentCopy to Output Directoryđể một trong hai Copy alwayshoặcCopy if newer

nhập mô tả hình ảnh ở đây


2
Tôi không muốn để tệp này tiếp xúc với người dùng của mình ... có cách nào để nhúng nó vào dll và đọc nó từ đó không?
foreyez

3
@foreyez Thêm chuỗi vào dự án của bạn dưới dạng tài nguyên, thay vì sử dụng tệp, có lẽ. Lưu ý rằng dữ liệu sẽ không thể có được - Dữ liệu mà tệp này chứa nhạy cảm như thế nào?
Dan J

5
Đặt build tùy chọn để Embedded Resourceđọc t các bài viết về cách đọc tài nguyên emebedded blogs.msdn.com/b/nikola/archive/2008/05/14/...
dance2die

nếu tôi đang tạo thiết lập cho một dự án thì tôi không thể làm việc với thuộc tính. có giải pháp nào khác cho điều đó không?
Neel Bhasin

35

Bạn có thể sử dụng cách sau để lấy thư mục gốc của một dự án trang web:

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

Hoặc bạn có thể lấy thư mục cơ sở như sau:

AppDomain.CurrentDomain.BaseDirectory

32

Thêm tệp tài nguyên vào dự án của bạn (Nhấp chuột phải vào Dự án-> Thuộc tính-> Tài nguyên). Trong trường hợp nó cho biết "chuỗi", bạn có thể chuyển thành "tệp". Chọn "Thêm tài nguyên" và chọn tệp của bạn.

Bây giờ bạn có thể tham khảo tệp của mình thông qua Properties.Resourcesbộ sưu tập.


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

Phương pháp trên sẽ mang lại cho bạn một cái gì đó như thế này:

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

Từ đây, bạn có thể điều hướng ngược lại bằng System.IO.Directory.GetParent:

_filePath = Directory.GetParent(_filePath).FullName;

1 lần sẽ đưa bạn đến \ bin, 2 lần sẽ đưa bạn đến \ myProjectNamespace, vì vậy nó sẽ như thế này:

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

Vâng, bây giờ bạn có một cái gì đó giống như "C: \ Users \ myuser \ Documents \ Visual Studio 2015 \ Projects \ myProjectNamespace", vì vậy chỉ cần đính kèm đường dẫn cuối cùng vào tên tệp của bạn, ví dụ:

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

Hy vọng nó giúp.


Cảm ơn, nhưng có thể _filePath = Path.Combine (_filePath, "myfile.txt"); // sành điệu :)
FreeClimb

14

Bạn cũng có thể nhúng nó (xây dựng hành động được đặt thành Resource), đây là cách truy xuất nó từ đó:

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

(Một số mã lấy từ câu trả lời này của Charles )


3

Bạn phải sử dụng đường dẫn tuyệt đối trong trường hợp này. Nhưng nếu bạn đặt CopyToOutputDirectory = CopyAlways, nó sẽ hoạt động như bạn đang làm.


0

Trong mã này, bạn truy cập vào rootdự án thư mục:

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

sau đó:

StreamReader r = new StreamReader(_filePath + "/cities2.json"))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.