Как мне усечь файл X байтов с конца? - PullRequest
1 голос
/ 04 августа 2010

Допустим, есть файл длиной 150 байт, и я хочу обрезать последние 16 (или любое число) его с конца ...

Есть ли другой способ сделать это, кроме перезаписи всего файла?

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. Кто-нибудь знает, как справиться с этим?

Ответы [ 3 ]

11 голосов
/ 04 августа 2010

А как же FileStream.SetLength()?

1 голос
/ 14 января 2012

Я просто использую

new FileStream(FileName, FileMode.Open)

вместо

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

и SetLength работает отлично, не исключение.Файл действительно усечен.

0 голосов
/ 04 августа 2010
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));
}
...