프로젝트의 루트 디렉토리에서 텍스트 파일을 읽는 방법은 무엇입니까?


92

내 프로젝트의 루트 디렉토리에 추가 한 텍스트 파일의 첫 번째 줄을 읽고 싶습니다. 의미, 내 솔루션 탐색기가 내 프로젝트의 내 .cs 파일과 함께 .txt 파일을 표시합니다.

그래서 나는 시도했습니다.

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

그러나 이것은 Bin 폴더를 참조하고 있고 내 파일이 거기에 없기 때문에 작동하지 않습니다. 어떻게 작동시킬 수 있습니까? : /

감사


btw, StreamReader 이름은 약간 혼란 스럽습니다. Microsoft는 제 생각에 TextStreamReader라는 이름을 지정 했어야합니다
George

답변:


140

솔루션 탐색기에서 myfile.txt를 마우스 오른쪽 단추로 클릭하고 "속성"을 선택합니다.

거기에서 Build Actionto contentCopy to Output Directoryto Copy always또는Copy if newer

여기에 이미지 설명 입력


2
이 파일을 내 사용자에게 노출시키지 않고 싶습니다. dll에 파일을 포함하고 거기에서 읽을 수있는 방법이 있습니까?
foreyez

3
@foreyez 아마도 파일을 사용하는 대신 리소스로 프로젝트에 문자열을 추가하십시오. 데이터를 얻을 수 없습니다.이 파일에 포함 된 데이터는 얼마나 민감한가요?
Dan J

5
빌드 옵션을로 설정하고 Embedded Resourceemebedded 리소스를 읽는 방법에 대한 기사 읽기 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);
    }
}

(에서 가져온 일부 코드 이 답변 에 의해 찰스 )


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.