我有一个关于流类的CopyTo()方法的问题:
https://learn.microsoft.com/en-us/dotnet/api/system.io.stream.copyto这种方法适用于大约15kb的小文件,但任何更高的文件(我测试了2mb, 4mb等),它只是挂在CopyTo()方法上。我真的不知道为什么。
代码示例:
服务器句柄:
public void HandleClient(object c)
{
string path = "some path";
using (TcpClient client = (TcpClient)c)
{
using (NetworkStream netStream = client.GetStream())
{
using (FileStream fileStream = new FileStream(path, FileMode.Create))
{
netStream.CopyTo(fileStream);
}
}
}
}
Client send:
public void Send()
{
IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse("some address"), 12345);
string path = "some path";
using (TcpClient client = new TcpClient(remoteEndPoint))
{
using (NetworkStream netStream = client.GetStream())
{
using (FileStream fileStream = new FileStream(path, FileMode.Open))
{
fileStream.CopyTo(netStream);
}
}
}
}
注。在我研究网络编程的过程中,我经常发现有人建议其他人改用WCF来完成这类任务,因为显然,WCF使一切都变得容易得多。你们有什么建议,你能提供一些链接给一个WCF新手,这将有助于建模一个局域网文件共享应用程序,因为这是我的目标?
我设法解决了CopyTo()问题。问题是我是在主线程上发送文件的,所以整个应用程序都阻塞了需要超过瞬间传输的大文件。
将发送操作放在一个单独的线程中,并测试发送最多3gb,正常工作。现在,有什么方法可以跟踪CopyTo()操作的进度吗?在我看来,我不能,如果我想跟踪进度,我应该手动转移。
感谢所有参与的人:)
我不确定您是否可以使用大于缓冲区大小的文件进行CopyTo。也许,您可以尝试通过将文件拆分为每个缓冲区大小来编写它。