2010-08-04 4 views
1

길이가 150 바이트 인 파일이 있고 마지막 16 자 (또는 임의의 수)를 자르고 싶습니다. ...끝에서 X 바이트 파일을 자르는 방법은 무엇입니까?

다시 작성하는 것보다 다른 방법이 있습니까? 완전한 파일?

UPDATE : 으로 SetLength는 일을해야하지만, 불행하게도에서 NotSupportedException이

using (FileStream fsFinalWrite = new FileStream(FileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)) 
{ 

    fsFinalWrite.Seek(16, SeekOrigin.End); 

    fsFinalWrite.Write(SwappedBytes, 0, 16); 

    Debug.WriteLine("fsFinalWrite Can Seek = " + fsFinalWrite.CanSeek); 
    Debug.WriteLine("fsFinalWrite Can Write = " + fsFinalWrite.CanWrite); 

    fsFinalWrite.SetLength((long)lengthOfFile); 

} 

모두 인쇄 진정한 슬로우됩니다! 그러나 여전히 NotSupportedException을 발생시킵니다. 누구든지이 문제를 어떻게 처리해야하는지 알고 있습니까?

+1

운영체제? 파일 시스템? – msw

+0

C#, Compact Framework 3.5 –

답변

10

무엇 FileStream.SetLength() 대해를?

+0

나는 이것을 추가하려하고 있었다. 링크 http://msdn.microsoft.com/en-us/library/system.io.filestream.setlength.aspx –

+0

고맙습니다이게 작동합니다 :) –

+0

불행히도 SetLength가 사용될 때 'NotSupportedException'이 발생합니다 ... 그러나 나는 CanSeek와 CanRead가 모두 true라는 것을 확인했다. 왜 지원되지 않는지 모르겠다. –

0
using System.IO;  
using System.Linq; // as far as you use CF 3.5, it should be available 

byte[] bytes = File.ReadAllBytes(path); 
byte[] trancated = bytes.Take(bytes.Lenght - 15); 
File.WriteAllBytes(path, trancated); 

은의이 조금을 캡슐화 보자

void TruncateEndFile(string path, int size) 
{ 
    byte[] data = File.ReadAllBytes(path); 
    File.WriteAllBytes(path, data.Take(data.Lenght - size)); 
} 
+0

고맙습니다 :)이 방법이 효과적 일지는 모르겠지만,이 방법은 완전한 파일을 메모리로 가져 와서 변경 한 다음 다시 쓰는 방법입니다. 더 효율적인 방법은 없습니까? –

+0

@Ranhiru : 물론 최선의 방법은 아닙니다. 나는 더 효과적인 무엇인가에 대해 생각할 것이다. – abatishchev

1

단순히 완벽

new FileStream(FileName, FileMode.Open) 

대신

new FileStream(FileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite) 

SetLength 작품의 예외를 사용하지 않고 있어요. 파일은 실제로 잘립니다.

관련 문제