존재하지 않고 새 줄을 추가하는 경우 .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.