2011-02-23 8 views
12

아마도 다른 방법이있을 수는 없지만 한 텍스트 파일의 내용을 다른 텍스트 파일에 추가하는 방법이 있습니다. 움직임?C# : 한 텍스트 파일의 * 내용 *을 다른 텍스트 파일에 추가

난 그냥 큰 파일에 대한 비효율적 인 것 같습니다 독자와 작가를 사용하는 것입니다 알고있는 유일한 방법 ...

감사합니다!

+0

유일한 방법은 무엇입니까? – CarneyCode

+0

@Carn : 그게 망설입니까? 또는 ... – CODe

+1

파일의 블록을 "링크 해제"하고 SO 레벨의 다른 파일에 "링크"할 수 없습니다 (원하는 파일의 점이 블록 경계에 있지 않아도). 읽고 쓰고 그 다음에는 지워야합니다. 그리고 거래를 원한다면 ... 음 ... 행운을 빌어 요! :-) 이것은 SQL이 아닙니다 :-) (기술적으로는 최신 Windows에서도 가능합니다). 당신이 단지 "정상적으로"하고 싶다면, 코드의 약 10/20 줄 (아마도 덜) – xanatos

답변

26

아니요, 저는이 작업을 수행하는 것이 없다고 생각하지 않습니다.

두 파일이 동일한 인코딩을 사용하고 유효한지 확인할 필요가없는 경우이 파일을 이진 파일로 처리 할 수 ​​있습니다. file1.txt는 바이트 순서 표시를 포함하는 경우, 당신은 file2.txt의 중간에 그것을 피하기 위해 첫 번째 건너 뛸 것을

using (Stream input = File.OpenRead("file1.txt")) 
using (Stream output = new FileStream("file2.txt", FileMode.Append, 
             FileAccess.Write, FileShare.None)) 
{ 
    input.CopyTo(output); // Using .NET 4 
} 
File.Delete("file1.txt"); 

참고.

public static class StreamExtensions 
{ 
    public static void CopyTo(this Stream input, Stream output) 
    { 
     if (input == null) 
     { 
      throw new ArgumentNullException("input"); 
     } 
     if (output == null) 
     { 
      throw new ArgumentNullException("output"); 
     } 
     byte[] buffer = new byte[8192]; 
     int bytesRead; 
     while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      output.Write(buffer, 0, bytesRead); 
     } 
    } 
} 
+0

+1로 바꾸는 것을 제외하고는 Jon의 대답을 향상시킬 수 없습니다. 왜냐하면 "{}"의 다른 레벨을 추가하지 않고 두 개의 "계단식"을 사용하지 않았을 것이기 때문입니다. 음 ... StyleCop에서 신고할까요? – xanatos

+0

@ 존 : OpenAppend는 File 클래스의 메소드처럼 보이지 않습니다. 우연히 OpenWrite를 의미합니까? 또한 CopyTo는 사용할 수 없으며 System.IO를 사용하고 있습니다 ... 맞습니까? 도와 주셔서 감사합니다! – CODe

+0

@ 코드 : 전화가 울 렸을 때 확인 중이었습니다. 고칠 것입니다. 'Stream.CopyTo'는 .NET 4에서만 사용됩니다 - 어떤 버전을 사용하고 있습니까? –

3

이의 cmd.exe 버전은 다음과 같습니다 당신이 .NET 4를 사용하지 않는 경우

당신은 원활한 핸드 오버 할 경우에도 확장 방법 ... Stream.CopyTo의 자신의 동등한를 쓸 수 있습니다

형 fileOne.txt로는 >>

델 fileOne.txt로

01 filetwo.txt

이렇게하려면 시스템 셸을 만들 수 있습니다. 그것은 꽤 효과적이어야합니다. (하지만 난 그것을 테스트하지 않은)

File.AppendAllText("path/to/destination/file", File.ReadAllText("path/to/source/file")); 

그런 다음 당신은 그냥 삭제하거나 첫 번째 파일을 삭제해야하는 순간,이 같은 아마 일하는 것이 대한 오류 처리, 인코딩 및 효율성을 무시

+0

fileone.txt를 삭제하고 싶지 않고 "clear"만하고 싶다면'type nul> fileone.txt'을 사용할 수 있습니다. –

6

이 단계가 완료되면

+0

누군가 파일에 완전한 백과 사전을 갖고 있지 않기를 바랍니다. – xanatos

0

"비효율적 인"이 무슨 뜻인지 모르겠습니다. 대부분의 경우 Jon의 답변으로 충분할 것입니다. 그러나 매우 큰 소스 파일이 염려되는 경우 Memory-Mapped Files은 친구가 될 수 있습니다. 자세한 내용은 this link을 참조하십시오.

관련 문제