Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从文件末尾截断X字节?_C#_File Io_Compact Framework_Filestream_Truncate - Fatal编程技术网

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

C# 如何从文件末尾截断X字节?,c#,file-io,compact-framework,filestream,truncate,C#,File Io,Compact Framework,Filestream,Truncate,假设有一个150字节长的文件,我想截短它的最后16个字节(或任意数量) 除了重新编写完整的文件,还有其他方法吗 更新: SetLength应该执行此操作,但不幸的是,抛出了NotSupportedException using (FileStream fsFinalWrite = new FileStream(FileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)) { fsFinalWrite.Seek(16

假设有一个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。有人知道怎么处理吗

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));
}
让我们稍微概括一下:

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

关于
FileStream.SetLength()

关于
FileStream.SetLength()

我只是在使用

new FileStream(FileName, FileMode.Open)
而不是

new FileStream(FileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)
而且
SetLength
工作非常完美,没有例外。文件确实被截断了。

我只是在使用

new FileStream(FileName, FileMode.Open)
而不是

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

而且
SetLength
工作非常完美,没有例外。文件确实被截断。

操作系统?文件系统?操作系统?文件系统?谢谢:)虽然这可以工作,但这会将整个文件存储在内存中,更改后再写回。。。有没有更有效的方法来处理这个问题?@Ranhiru:当然不是最好的方法。我会考虑一些更有效的方法谢谢:)虽然这会起作用,但这会将整个文件存储在内存中,更改后再写回。。。有没有更有效的方法来处理这个问题?@Ranhiru:当然不是最好的方法。我会考虑一些更有效的方法,我正要补充这一点。链接不幸的是,当使用SetLength时,抛出了一个
NotSupportedException
。。。但是我检查过,
CanSeek
CanRead
都是真的。。。我不知道为什么它不被支持只是检查了一下…CanWrite也是正确的。请检查更新的问题,如果有人感兴趣,SetLength()被声明为流基类上的(抽象)方法,因此任何其他合适的流子类理论上也应该提供以这种方式截断其数据的实现。(我正在使用MemoryStream,我很好奇是否同样的方法也适用)。链接不幸的是,当使用SetLength时,抛出了一个
NotSupportedException
。。。但是我检查过,
CanSeek
CanRead
都是真的。。。我不知道为什么它不被支持只是检查了一下…CanWrite也是正确的。请检查更新的问题,如果有人感兴趣,SetLength()被声明为流基类上的(抽象)方法,因此任何其他合适的流子类理论上也应该提供以这种方式截断其数据的实现。(我正在使用MemoryStream,我很好奇是否同样的方法也适用)。