写入文件仅在 "step in" 调试模式下有效?
Writing to file works in "step in" debug mode only?
大家好,我有一个关于我尝试创建的 "FTP" 应用程序的问题。我在 C# 中构建了一个客户端,在 C 中构建了我的服务器。对于我的客户端,我使用 visual studio 2015。当我使用 "step-in/step-out" 调试模式功能时,我的代码执行完美。当客户端尝试下载文件时会出现问题。服务器发送文件的全部内容,客户端接收所有这些内容,但由于某种原因,只有大约 70% 的文件被写入 FileStream。
我的代码如下:
public void download(string baseCom,string downloadPlace)
{
//baseCom is the main command
//downloadPlace is location to download file from including name
sendCommand(baseCom);
FileStream myStream = File.Create(downloadPlace);
int bytesRead = 0;
byte[] myByte = new byte[1024];
do
{
bytesRead = ourSock.Receive(myByte, myByte.Length, 0);
myStream.Write(myByte, 0, bytesRead);
} while ((bytesRead > 0) && (bytesRead == 1024)) ;
myStream.Flush();
myStream.Close();
}
我是 C# 和网络编程的新手,所以非常感谢大家的帮助。我的一部分相信,当 运行 程序定期时,某些数据可能会 "left-over" 保留在套接字流中。
((bytesRead > 0) && (bytesRead == 1024))
似乎是这里的问题。
请求 1024 字节的读取操作并不能保证您将获得 1024 字节。
您可以获得 0 到 1024 之间的任意数量的字节(0 表示传输结束),在这种情况下(假设读取缓冲区只有 768 字节)您就停止读取。
因此,如果在收到一半文件时发生这种情况(全部通过 1024 字节读取),您将不会拥有剩余的一半并保存目前已获取的内容。
请改为:
while (bytesRead > 0);
大家好,我有一个关于我尝试创建的 "FTP" 应用程序的问题。我在 C# 中构建了一个客户端,在 C 中构建了我的服务器。对于我的客户端,我使用 visual studio 2015。当我使用 "step-in/step-out" 调试模式功能时,我的代码执行完美。当客户端尝试下载文件时会出现问题。服务器发送文件的全部内容,客户端接收所有这些内容,但由于某种原因,只有大约 70% 的文件被写入 FileStream。
我的代码如下:
public void download(string baseCom,string downloadPlace)
{
//baseCom is the main command
//downloadPlace is location to download file from including name
sendCommand(baseCom);
FileStream myStream = File.Create(downloadPlace);
int bytesRead = 0;
byte[] myByte = new byte[1024];
do
{
bytesRead = ourSock.Receive(myByte, myByte.Length, 0);
myStream.Write(myByte, 0, bytesRead);
} while ((bytesRead > 0) && (bytesRead == 1024)) ;
myStream.Flush();
myStream.Close();
}
我是 C# 和网络编程的新手,所以非常感谢大家的帮助。我的一部分相信,当 运行 程序定期时,某些数据可能会 "left-over" 保留在套接字流中。
((bytesRead > 0) && (bytesRead == 1024))
似乎是这里的问题。
请求 1024 字节的读取操作并不能保证您将获得 1024 字节。
您可以获得 0 到 1024 之间的任意数量的字节(0 表示传输结束),在这种情况下(假设读取缓冲区只有 768 字节)您就停止读取。
因此,如果在收到一半文件时发生这种情况(全部通过 1024 字节读取),您将不会拥有剩余的一半并保存目前已获取的内容。
请改为:
while (bytesRead > 0);