프로젝트에있는 폴더에서 파일 읽기


87

C # 프로젝트 (Windows 콘솔 응용 프로그램)가 있습니다. 프로젝트 내부에 Data 라는 폴더를 만들었습니다 . Data 폴더에는 두 개의 텍스트 파일이 있습니다.

"Data"폴더에서 텍스트 파일을 어떻게 읽을 수 있습니까? 나는 아래에서 시도했다.

string[] files = File.ReadAllLines(@"Data\Names.txt")

파일을 찾을 수 없다는 것은 오류입니다.

이전에 게시 된 일부 Stackoverflow 답변을 확인했지만 그 어느 것도 나를 위해 일하지 않습니다.

어떻게 진행할 수 있습니까? 감사!


1
구글 "현재 디렉토리". 실행 파일은 소스 코드 폴더에서 불필요하게 실행되지 않습니다!
Ondrej Tucny

프로젝트를 빌드 할 때이 데이터 폴더를 출력에 복사하고 있습니까? 파일의 옵션을 확인하고 수정하십시오.
ryadavilli

설정은 항상 출력 디렉토리에 복사입니다.
SKJ

답변:


122

아래 코드가 작동합니다.

string path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"Data\Names.txt");
string[] files = File.ReadAllLines(path);

내 폴더와 파일이 어셈블리 폴더에 존재하지 않습니다 : s .. 왜 그렇습니까?
bohem.be

33
Visual Studio에서 파일을 표시하고 설정 Build ActionContent하고, Copy to Output DirectoryCopy always
플로리안 모저

3
그냥 사용 @ "데이터 \ Name.txt"적용 @FlorianMoser 표기
알렉산드르 Sargsyan

'@'는 무엇을 의미합니까?
gumuruh

@ 축어 문자열 리터럴이라고합니다. stackoverflow.com/questions/3311988/…
Morbia

34

데이터 폴더가 어디에 있는지에 따라 다릅니다.

.exe 파일이있는 디렉토리를 가져 오려면 다음을 수행하십시오.

AppDomain.CurrentDomain.BaseDirectory

현재 디렉토리를 가져 오려면 :

Environment.CurrentDirectory

그런 다음 디렉토리 경로 ( @"\Data\Names.txt")를 연결할 수 있습니다.


18

'Data'라는 폴더의 모든 파일을 가져와야하는 경우 다음과 같이 코딩하십시오.

string[] Documents = System.IO.Directory.GetFiles("../../Data/");

이제 '문서'는 'Data'폴더 'Data'에있는 두 텍스트 파일의 전체 개체 이름 배열로 구성됩니다.


@Bunyip : 텍스트 파일의 내용을 읽어야합니까, 아니면 폴더에있는 파일을 알고 있어야합니까?
Uthistran Selvaraj 2012

13

C # 프로젝트 (Windows 콘솔 응용 프로그램)가 있습니다. 프로젝트 안에 이미지라는 폴더를 만들었습니다. MyIcon.ico라는 ico 파일이 하나 있습니다. 아래와 같이 Images 폴더 내 MyIcon.ico에 액세스했습니다.

this.Icon = new Icon(@"../../Images/MyIcon.ico");

9

항상 출력 디렉토리에 복사가 설정된 후 다음을 시도하십시오.

 Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
 String Root = Directory.GetCurrentDirectory();

이것이 허용되는 대답이어야합니다. 파일이 라이브러리에 있든 실행 가능한 프로젝트에 있든 상관 없습니다.
Tullochgorum

0

Xamarin.iOS의 경우 파일이있는 경우 다음 코드를 사용하여 파일의 내용을 가져올 수 있습니다.

var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var filename = Path.Combine(documents, "xyz.json");
if (File.Exists(filename))
{
var text =System.IO.File.ReadAllText(filename);
}

-1

이 코드를 사용하여 폴더 및 하위 폴더의 모든 파일을 읽을 수도 있습니다.

class Program
{
    static void Main(string[] args)
    {

        getfiles get = new getfiles();
        List<string> files =  get.GetAllFiles(@"D:\Document");

        foreach(string f in files)
        {
            Console.WriteLine(f);
        }


        Console.Read();
    }


}

class getfiles
{
    public List<string> GetAllFiles(string sDirt)
    {
        List<string> files = new List<string>();

        try
        {
            foreach (string file in Directory.GetFiles(sDirt))
            {
                files.Add(file);
            }
            foreach (string fl in Directory.GetDirectories(sDirt))
            {
                files.AddRange(GetAllFiles(fl));
            }
        }
        catch (Exception ex)
        {

            Console.WriteLine(ex.Message);
        }



        return files;
    }
}

-1
string myFile= File.ReadAllLines(Application.StartupPath.ToString() + @"..\..\..\Data\myTxtFile.txt")

3
자세히 텍스트를 추가하십시오 왜이 작품 / 그것은 무엇을
Gibolt

1
이것은 저자의 질문에 답할 수 있지만 설명하는 단어 및 / 또는 문서에 대한 링크가 부족합니다. 원시 코드 조각은 주변에 문구가 없으면 그다지 도움이되지 않습니다. 좋은 답변을 작성하는 방법이 매우 도움 이 될 수도 있습니다. 제발 편집 답변을 - 검토에서

-1

이것을 사용하면 작동합니다.

string path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"TestData\test.json");
var response = JsonConvert.DeserializeObject<Response>(File.ReadAllText(path));

참고 : 파일의 속성을 다음 test.json과 같이 설정해야합니다.

"Build Action"= "내용"

"Copy to Output Directory"= "항상 복사"


이전 질문에 대답 할 때, 특히 이미 승인 된 대답이있는 질문에 대한 대답이 어떻게 도움이되는지 설명하는 컨텍스트를 포함하면 다른 StackOverflow 사용자에게 대답이 훨씬 더 유용 할 것입니다. 참조 : 좋은 답변을 작성하는 방법 .
David Buck

-2

이것은 나를 위해 도움이되었습니다.

var dir = Directory.GetCurrentDirectory()

경로 채우기가 현재 폴더를 벗어나면이 경로가 포함됩니다. \ bin \ debug 내가 권장하는 것은

string dir = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName

그런 다음 dir 값을 인쇄하고 경로가 제공하는지 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.