존재하지 않고 새 줄을 추가하는 경우 .txt 파일을 만듭니다.


161

.txt 파일을 만들어서 쓰고 싶습니다. 파일이 이미 존재하면 더 많은 줄을 추가하고 싶습니다.

string path = @"E:\AppServ\Example.txt";
if (!File.Exists(path))
{
    File.Create(path);
    TextWriter tw = new StreamWriter(path);
    tw.WriteLine("The very first line!");
    tw.Close();
}
else if (File.Exists(path))
{
    TextWriter tw = new StreamWriter(path);
    tw.WriteLine("The next line!");
    tw.Close(); 
}

그러나 첫 번째 줄은 항상 덮어 쓰는 것 같습니다 ... 같은 줄에 쓰지 않으려면 어떻게해야합니까 (루프에서 이것을 사용하고 있습니까)?

나는 그것이 매우 간단한 일이라는 것을 알고 있지만 WriteLine이전 에는 방법을 사용하지 않았습니다 . 저는 C #을 처음 접했습니다.


3
여기에있는 거의 모든 답변이 잘못되어 경쟁 조건에 처해 있음을 주의하십시오 . 기억하십시오 : 패턴 if (file exists) { open file }은 모든 프로그래밍 언어에서 거의 항상 틀립니다! .NET의 경우 솔루션은 File.Open(path, FileMode.Append, FileAccess.ReadWrite)적절한 플래그와 함께 사용 하는 것입니다.
— ComFreek

"파일이 존재하지 않는 경우 파일을 작성할지 여부를 지정하고 기존 파일의 컨텐츠를 보유 할 것인지 겹쳐 쓸지를 결정하는 FileMode 값입니다." 수동 접근 방식 대신 .net에서 수행 한 것과 동일한 작업입니다. 따라서 여기에는 문제가 없으며 수동으로 수행하는 것과 동일한 프로세스입니다. 비효율적이라고 말할 수도 있지만 잘못된 말은 중요하지 않습니다.
— Berker Yüceer

차이점은 File.Open내부적으로 WinAPI 함수 (다음 주석 참조)에 위임하여 경쟁 조건을 방지하는 것입니다. 여기에있는 대부분의 솔루션은이 작업을 수행하지 않으며 경쟁 조건에 따라 달라질 수 있습니다.
— ComFreek

1
그러나 존재 확인은 FileMode.Append here.에 의해 결정되며 존재 확인으로 이동 한 다음 CreateFileA로 파일을 작성합니다. 여전히 조금 극단적 인 말을하고 있지만 비효율적이라고 말할 수 있습니다. 또한 존재 확인은 쓰기 / 읽기 액세스에만 사용될 수 없으며 다른 문제에서도 사용될 수 있으므로 새로운 스타터의 경우이 주제가 작동 방식을 이해하는 데 유용합니다. 그러나 여기에 작성한 모든 정의를 포함하여 답변을 추가 할 수 있고 더 나은 이유는 답변으로 많은 도움이되고 올바른 것으로 선택 될 수 있습니다.
— Berker Yüceer

1
@ComFreek 나는 당신이 그것을 명확하게 설명하기 위해 그것에 대한 완전한 답변을 작성해야한다는 것에 강력히 동의합니다. 의견은 답변을 드리기위한 것이 아니며, 이러한 경쟁 조건과 해결 방법에 대해 진심으로 궁금합니다.
— Matthieu Foltzer

답변:


167

올바른 생성자를 사용하십시오 .

else if (File.Exists(path))
{
    using(var tw = new StreamWriter(path, true))
    {
        tw.WriteLine("The next line!");
    }
}

11
첫 번째 답변, 가장 간단한 답변, 가장 유용한 답변 LOL. 내가 그것을 볼 때 나는 같았다 : 응? "true"만 추가하면 충분합니까? 내가 전에 그것을 어떻게 보지 못합니까? 젠장 ... 전 정말 바보 같은 느낌이었습니다. 나는 이런 좋은 답변을 정말 정확하게 계산합니다.
— Berker Yüceer

7
힌트 : 파일이 존재하지 않으면이 생성자는 새 파일을 만듭니다.
— Abou-Emish 2016 년

1
i를 사용하여 포장하십시오 (아래 답변 참조).
— David Thielen 17

1
당신이 사용하는 경우 닫기, 중복
— 마이클 Freidgeim

2
-1 레이스 조건에 따라 달라지며 잘못된 동작이 발생할 수 있습니다! 아마도 File.Open(path, FileMode.Append, FileAccess.ReadWrite)반환 된 스트림을 통해 파일 크기를 사용 하고 확인하십시오.
— ComFreek

57
string path = @"E:\AppServ\Example.txt";
File.AppendAllLines(path, new [] { "The very first line!" });

File.AppendAllText ()도 참조하십시오. AppendAllLines는 줄을 직접 넣지 않아도 각 줄에 개행을 추가합니다.

두 가지 방법 모두 파일이 존재하지 않으면 파일을 작성하므로 필요하지 않습니다.


3
나는 이것이 사용자가 요구 한 것에 더 적합하다고 생각합니다. 두 가지 문제가있는 것 같습니다. 1은 텍스트를 덮어 씁니다. WriteLine이 파일을 덮어 쓰고 있기 때문입니다. 이 경우 File.AppendAllText가 더 적합합니다. 2)-파일을 어떻게 작성하고 파일에 추가하고 있는지 알 수있는 방법에 대한 질문 File.AppendAllText가 파일을 만드는 것이 좋습니다. 제 질문입니다. StreamWriter가 항상 적절한 것은 아니며 응용 프로그램의 용도에 따라 다릅니다. 어느 경우 든 이것은 나를 도왔다. +1
— Devin C

42
string path=@"E:\AppServ\Example.txt";

if(!File.Exists(path))
{
   File.Create(path).Dispose();

   using( TextWriter tw = new StreamWriter(path))
   {
      tw.WriteLine("The very first line!");
   }

}    
else if (File.Exists(path))
{
   using(TextWriter tw = new StreamWriter(path))
   {
      tw.WriteLine("The next line!");
   }
}

나도 같은 문제가 있으며이 포스터를 찾을 수 있지만 여기의 해결책으로도 문제가 해결되지 않습니다. 그래서 나는 몇 가지 솔루션을 사용하고 Dispose ()를 추가합니다. 내 목표는 복사 붙여 넣기를 포함하지 않습니다.
— Aek

1
나는 그것을 제안하지 않았다. 나는 당신의 대답에 그것을 포함시키지 않으면, 원래의 포스터는 당신이 왜 변경했는지 또는 그들이 달성해야 할 것을 알지 못한다고 말하고 있습니다. 게시 할 때 항상 모든 관련 정보를 포함하여 사람들이 내가하고있는 일을 모두 알 수 있도록하십시오. :)
— DiMono

1
이것은 다른 프로세스에서 사용 중이므로 새로 만든 파일에 쓸 수 없다는 오류를 나타내지 않기 때문에 작동합니다. .Dispose ()가 핵심입니다. 정말 고맙습니다!
— GenXisT

이것은 기존의 내용을 보존하는 것에 관한 질문을 다루지 않습니다.
— Ben Voigt

전화 아무 소용이 없습니다 Close()A로부터 using모든 리소스가 자동으로 배치되기 전에 종료됩니다로, 문.
— Sheridan

21

StreamWriter가 자동으로 파일을 존재하는지 확인할 필요가 없습니다. 추가 모드에서 파일을 열면 파일이 존재하지 않으면 파일이 만들어지며 항상 추가하고 덮어 쓰지 않습니다. 따라서 초기 점검은 중복됩니다.

TextWriter tw = new StreamWriter(path, true);
tw.WriteLine("The next line!");
tw.Close(); 

1
나는 받아 들여진 대답의 논리를 해결하려고 노력했지만, 나는 한 줄로 이것을 한 것을 알았지 만 정확한 구문을 기억할 수 없었습니다. 감사합니다.
— Morvael

14

File.AppendAllText는 파일에 문자열을 추가합니다. 파일이 없으면 텍스트 파일도 작성합니다. 내용을 읽을 필요가 없으면 매우 효율적입니다. 유스 케이스가 로깅 중입니다.

File.AppendAllText("C:\\log.txt", "hello world\n");

이것은 내가 필요한 것인데, 어떻게 새로운 내용을 새로운 줄에서 시작할 수 있습니까? CSV 파일을 사용하고 있습니다.
— NiallUK

간단한 해결책이 없다고 생각합니다. 이 게시물을 확인하시기 바랍니다. stackoverflow.com/questions/1343044/…
— R.Cha


3

StreamWriter를 시작하면 이전에 있던 텍스트보다 우선합니다. 다음과 같이 append 속성을 사용할 수 있습니다.

TextWriter t = new StreamWriter(path, true);

3
 else if (File.Exists(path)) 
{ 
  using (StreamWriter w = File.AppendText(path))
        {
            w.WriteLine("The next line!"); 
            w.Close();
        }
 } 

1
`using '블록이 있다면 w.Close는 중복됩니다. 블록 사용이 끝나면 처리도 동일합니다.
— Michael Freidgeim

-1 레이스 조건에 따라 달라지며 잘못된 동작이 발생할 수 있습니다! 아마도 File.Open(path, FileMode.Append, FileAccess.ReadWrite)반환 된 스트림을 통해 파일 크기를 사용 하고 확인하십시오.
— ComFreek


2

이 시도.

string path = @"E:\AppServ\Example.txt";
if (!File.Exists(path))
{
    using (var txtFile = File.AppendText(path))
    {
        txtFile.WriteLine("The very first line!");
    }
}
else if (File.Exists(path))
{     
    using (var txtFile = File.AppendText(path))
    {
        txtFile.WriteLine("The next line!");
    }
}

Redudant File.AppendText(path)이며이를 확인할 필요가 없습니다 File.Exists(path). 그리고 If (not A) Else If (A)이상한 If / Else입니다. 기본적 으로이 질문에는 좋은 점이 없으며 다른 답변의 중복 버전 인 설명 코드는 없습니다.
— xdtTransform

-1 레이스 조건에 따라 달라지며 잘못된 동작이 발생할 수 있습니다! 아마도 File.Open(path, FileMode.Append, FileAccess.ReadWrite)반환 된 스트림을 통해 파일 크기를 사용 하고 확인하십시오.
— ComFreek

2

File.AppendAllText () 메서드를 사용하면 문제가 해결됩니다. 이 방법은 파일을 열거 나 닫을 수없는 경우 파일 작성을 처리합니다.

var outputPath = @"E:\Example.txt";
var data = "Example Data";
File.AppendAllText(outputPath, data);

1

Microsoft 설명서에서 존재하지 않는 경우 파일을 만들어 단일 호출 File에 추가 할 수 있습니다. File.AppendAllText 메서드 (문자열, 문자열)

.NET Framework (현재 버전) 기타 버전

파일을 열고 지정된 문자열을 파일에 추가 한 다음 파일을 닫습니다. 파일이 없으면이 메서드는 파일을 만들고 지정된 문자열을 파일에 쓴 다음 파일을 닫습니다. 네임 스페이스 : System.IO 어셈블리 : mscorlib (mscorlib.dll)

구문 C # C ++ F # VB public static void AppendAllText (string path, string contents) 매개 변수 path 형식 : System.String 지정된 문자열을 추가 할 파일입니다. contents 형식 : System.String 파일에 추가 할 문자열입니다.

AppendAllText


1
using(var tw = new StreamWriter(path, File.Exists(path)))
{
    tw.WriteLine(message);
}

일반적으로 코드의 목적과 다른 언어를 도입하지 않고 문제를 해결하는 이유에 대한 설명이 포함되어 있으면 답변이 훨씬 유용합니다.
— Tim Diekmann
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.