代码之家  ›  专栏  ›  技术社区  ›  Ranhiru Jude Cooray

如何从文件末尾截断X字节?

  •  1
  • Ranhiru Jude Cooray  · 技术社区  · 14 年前

    假设有一个150字节长的文件,我想截短它的最后16个字节(或任意数字)。。。

    除了重写完整的文件,还有其他方法吗?

    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 回复  |  直到 14 年前
        1
  •  11
  •   abatishchev Karl Johan    14 年前

    那怎么办 FileStream.SetLength() ?

        2
  •  1
  •   DaveShaw Thishin    13 年前

    我只是在用

    new FileStream(FileName, FileMode.Open)
    

    而不是

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

    SetLength

        3
  •  0
  •   abatishchev Karl Johan    14 年前
    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));
    }