gpt4 book ai didi

c# - Stream.CopyTo() 方法可以保存不完整的流吗?

转载 作者:行者123 更新时间:2023-11-30 18:26:16 26 4
gpt4 key购买 nike

我有一个 WCF 服务,它允许我以 block 的形式上传文件。我想知道的是,这段代码是否会导致上传的流在任何情况下都只能部分附加到目标流?

我的日志显示所有发送的流都是 512000 字节(这是我在客户端设置的),到目前为止我已经发送了 9 个 block 中的 6 个 block 。但是在服务器上文件大小是 2634325。这意味着最后发送的 block (第 6 个)保存不完整。

是什么导致了这种行为?我应该怎么做才能避免这种情况?

或者这是否完全安全,我应该在其他地方寻找错误?

public void UploadChunk ( RemoteFileChunk file )
{
/// this file is not touched by anyone else
var uploadPath = @"C:\some path\some.file";

using ( var targetStream = new FileStream(uploadPath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None) )
{
if ( targetStream.Length == file.ChunkNumber * Helper.ChunkSize )
{
/// ---- streaming operation is here ----
targetStream.Position = targetStream.Length;
file.Stream.CopyTo(targetStream);
file.Stream.Close();
/// -------------------------------------
}
else throw new FaultException<DataIntegrityException>(new DataIntegrityException
{
CurrentIndex = targetStream.Length,
RequestedIndex = file.ChunkNumber * Helper.ChunkSize,
Message = string.Format("{0}th chunk index requested when there already {1} chunks exist.", file.ChunkNumber, targetStream.Length / Helper.ChunkSize)
});
}
}

下面是客户端文件上传代码片段:

var buffer = new byte[ChunkIndex != NumberOfChunks - 1 ? Helper.ChunkSize : LastPieceLen];

using ( var file = new FileStream(Info.FullName, FileMode.Open, FileAccess.Read, FileShare.None) )
{
file.Position = (long)ChunkIndex * Helper.ChunkSize;
file.Read(buffer, 0, buffer.Length);
}

var chunk = new MemoryStream(buffer);

chunk.Position = 0;
Service.StreamingEnd.UploadChunk(new RemoteFileChunk(FileId, CF.Id, VersionDate, ChunkIndex, chunk.Length, Sessions.Get(), chunk));

最佳答案

看看那个 if 语句——最终 block 是否保证正好是 block 大小?如果您上传的文件大小不是 block 大小的倍数,会发生什么情况?

关于c# - Stream.CopyTo() 方法可以保存不完整的流吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28943162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com