2012-07-27 5 views
4

System.IO.File.WriteAllLines을 사용하여 String [] 배열의 내용을 저장하면 파일 끝에 항상 공백이 생깁니다. 예를 들어 :.NET File.WriteAllLines은 파일 끝에 빈 행을 남깁니다.

이 이미 화제였다
a 
b 
c 
_ 

: Empty line in .Net File.WriteAllLines, is a bug?하지만, autor 내가이 생각하는 내 데이터에 문제가있다 "고 말했다 그건 내 문제 야

System.IO.File.WriteAllLines(Application.dataPath + "/test.txt",["a", "b", "c"]); 

은 (밑줄 없음) 파일을 생성합니다 WritAllLines가 아니라 ""너무 지역화 된 "(?!?)으로 닫혔습니다.

이것은 버그입니까? 어떻게하면 쉽게 제거 할 수 있습니까? (지금은 파일을 다시 읽을 때 무시할 수 있습니다)?

+0

마지막 줄의 항목이 줄 바꿈으로 끝나나요? – Polynomial

+0

나는 인자로 주어진 모범적 인 배열을 보여주었습니다 : [ "a", "b", "c"] 일반적인 문자 만 포함합니다. – user1557862

답변

6

WriteAllLines 메서드는 배열의 각 줄에 줄 바꿈을 쓰게됩니다. 즉, 파일에서이 "빈 줄"을 항상 가져옵니다.

링크 된 게시물에서 작성한 요지는 줄을 문자로 끝나는 것으로 간주하는 ReadAllLines을 실행할 때와 같습니다. 따라서 방금 작성한 파일에서 read 메소드를 사용하면 똑같은 줄을 다시 얻어야합니다.

다른 방법으로 파일을 읽는 경우 직접 줄 바꿈을 처리해야합니다.

본질적으로 예상되는 동작입니다.

+0

나는 그것을 제거하는 가장 좋은 방법은'WriteAllText'와'String.Join'을'\ r \ n'을 구분 기호로 사용하는 것임을 이해합니다. – user1557862

+0

가에도 봐 [이 질문]은은 "항상 (http://stackoverflow.com/questions/585860/string-join-vs-stringbuilder-which-is-faster) String.Join과 StringBuilder의 – Steve

+0

의 성과에 관하여가 있기 때문에 마지막 줄 "이 비어 있든 없든, 나는 왜 마지막 줄이 비어 있어야하는지 이해하지 못한다. ReadAllLines에서 생성 된 마지막 배열 요소는 줄 바꿈으로 끝나지 않는 파일 줄입니다.이 줄은 단지 마지막 줄입니다. WriteAllLines에 저장된 파일과 XmlSerializer.Serialize에 저장된 파일을 비교하면 의미를 알 수 있습니다. –

3

WriteAllLines는 배열의 모든 단일 항목을 쓰고 줄 바꿈을 추가합니다.
보시다시피, 모든 문자열은 자체 행에 있습니다. 즉, 마지막 항목이 개행 문자로 종료되고 파일에 한 줄 더 표시됩니다. 파일의 16 진수 덤프로 이것을 증명할 수 있습니다.

WriteAllLines의 소스 코드를 보면이를 확인할 수 있습니다.
내부적으로는 TextWriter.WriteLine(string) 메서드를 사용합니다.

9

다른 사람들도 지적했듯이 그것이 작동하는 방식입니다.

public static class FileExt 
{ 
    public static void WriteAllLinesBetter(string path, params string[] lines) 
    { 
     if (path == null) 
      throw new ArgumentNullException("path"); 
     if (lines == null) 
      throw new ArgumentNullException("lines"); 

     using (var stream = File.OpenWrite(path)) 
     using (StreamWriter writer = new StreamWriter(stream)) 
     { 
      if (lines.Length > 0) 
      { 
       for (int i = 0; i < lines.Length - 1; i++) 
       { 
        writer.WriteLine(lines[i]); 
       } 
       writer.Write(lines[lines.Length - 1]); 
      } 
     } 
    } 
} 

사용법 :

FileExt.WriteAllLinesBetter("test.txt", "a", "b", "c"); 

이 기록 :

 
    aenter 
    benter 
    c 
+0

매력처럼 작동합니다. –

0

내가 같은 일을 그냥 줄 추가했다 : 3, 희망 여기에 여분의 줄 바꿈하지 않고 그것을 수행하는 방법은 도움이되는 사람

for(int i = 0; i < Length; i++) 
    { 
     line = getLocation(i).X.ToString("0.0", nfi) + ',' + getLocation(i).Y.ToString("0.000", nfi) + ',' + getColorRaw(i).R.ToString("0.000", nfi) + ',' + getColorRaw(i).G.ToString("0.000", nfi) + ',' + getColorRaw(i).B.ToString("0.000", nfi); 
     writer.Write(line); 
     if(i < Length - 1) writer.Write("\n"); 
0

후행 줄 바꿈을 없애는 가장 좋은 해결책은 .ReadAllLines()으로 읽으면 문자열 배열에서 마지막 요소를 실제로 닫을 수 있습니다.

+1

빈 문자열이 수신 배열 구조로 실제로 읽히는 경우 부분 솔루션이됩니다. 문제는 이것이 실제로 사실이 아님을 알게합니다. –

0

내가 그것을 마지막 라인 AppendAllText을 usning되었다 할 수있는 가장 쉬운 방법 :

if ($i -ne $lines.Count - 1){ 
    $newLines += $lines[$i] 
    } else { 
    $lastLine = $lines[$i] 
} 

[IO.File]::WriteAllLines($file.FullName, $newLines); 
[IO.File]::AppendAllText($file.FullName, $lastLine); 
1

@Virtlink 솔루션은 거의 완벽합니다.사실 파일의 끝에 - 파일이 존재하고 그 내용이 새로운 내용보다 클 때 쓰레기가 생기는 시나리오가 있습니다. 새 파일 내용을 wrting하기 전에 파일 길이를 0으로 재설정하십시오.

public static void WriteAllLinesBetter(string path, params string[] lines) 
    { 
     if (path == null) 
      throw new ArgumentNullException("path"); 
     if (lines == null) 
      throw new ArgumentNullException("lines"); 

     using (var stream = File.OpenWrite(path)) 
     { 
      stream.SetLength(0); 
      using (var writer = new StreamWriter(stream)) 
      { 
       if (lines.Length > 0) 
       { 
        for (var i = 0; i < lines.Length - 1; i++) 
        { 
         writer.WriteLine(lines[i]); 
        } 
        writer.Write(lines[lines.Length - 1]); 
       } 
      } 
     } 
    } 
+0

나는 이것도 발견했다, 좋은 지점. 'var writer '로 바꾸기위한 명성. – Waescher

관련 문제