下面是一段一次性读取读定目录中,下面的所有文件,并传送的程序,是执行正常的  private static int limitFileResponsePackageSize = 8000;  //全局变量,限定单个包大小 private static void SyncFileResponseSubmit(string syncDirectory, string fileInfo, Socket socket, ref Queue<SubmitPackage> queueSubmitPackage)
        {
            PackageFileResponse body = null;            foreach (string remoteFile in fileInfo.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries))
            {
                try
                {
                    string localFile = syncDirectory + remoteFile;
                    if (!File.Exists(localFile))
                    {
                        continue;
                    }
                  
                    using (FileStream stream = new FileStream(localFile, FileMode.Open, FileAccess.Read))
                    {
                        byte[] bufferCurrentPackage = new byte[stream.Length];
                        stream.Read(bufferCurrentPackage, 0, bufferCurrentPackage.Length);
                        body = new PackageFileResponse();
                        body.FileName = remoteFile;
                        body.FileInfo = bufferCurrentPackage;
                        PackageSubmit(socket, ref queueSubmitPackage, PackageType.SyncFileResponse, body);                       
                    }
                }
                catch (ThreadAbortException)
                {
                    throw;
                }
                catch (Exception ex)
                {
                    Tools.TriggerNotifyEvent(DateTime.Now, "SyncProcess.SyncFileResponseSubmit()", ex.Message);
                }
            }
        }
但当把红字读取这一段更成分段读取时(如下面的),执接收端只能得到第一个文件。                    using (FileStream stream = new FileStream(localFile, FileMode.Open, FileAccess.Read))
                    {
                        int offset = 0;
                        int readSize = 0;
                        int remainSize = (int)stream.Length;                        limitcFileResponsePackageSize = Math.Min(limitcFileResponsePackageSize, remainSize);
                        byte[] bufferCurrentPackage = new byte[limitcFileResponsePackageSize];
                        stream.Position = offset;                        while ((readSize = stream.Read(bufferCurrentPackage, 0, limitcFileResponsePackageSize)) > 0)
                        {
                            body = new PackageFileResponse();
                            body.FileName = remoteFile;
                            body.FileInfo = bufferCurrentPackage;
                            PackageSubmit(socket, ref queueSubmitPackage, PackageType.SyncFileResponse, body);                            offset += readSize;
                            remainSize -= readSize;                            stream.Position = offset;                            limitcFileResponsePackageSize = Math.Min(limitcFileResponsePackageSize, remainSize);
                            bufferCurrentPackage = new byte[limitcFileResponsePackageSize];
                        }
                    }
我看了半天,也查找不出原因。谢谢!

解决方案 »

  1.   

    主要关注这段即可:
    //这个一次性读取成功的
    using (FileStream stream = new FileStream(localFile, FileMode.Open, FileAccess.Read))
                        {
                            byte[] bufferCurrentPackage = new byte[stream.Length];
                            stream.Read(bufferCurrentPackage, 0, bufferCurrentPackage.Length);
                            body = new PackageFileResponse();
                            body.FileName = remoteFile;
                            body.FileInfo = bufferCurrentPackage;
                            PackageSubmit(socket, ref queueSubmitPackage, PackageType.SyncFileResponse, body);                       
                        }
    //这个分段读取则接收端只能获取到第一个文件                    using (FileStream stream = new FileStream(localFile, FileMode.Open, FileAccess.Read))
                        {
                            int offset = 0;
                            int readSize = 0;
                            int remainSize = (int)stream.Length;                        limitFileResponsePackageSize = Math.Min(limitFileResponsePackageSize, remainSize);
                            byte[] bufferCurrentPackage = new byte[limitFileResponsePackageSize];
                            stream.Position = offset;                        while ((readSize = stream.Read(bufferCurrentPackage, 0, limitFileResponsePackageSize)) > 0)
                            {
                                body = new PackageFileResponse();
                                body.FileName = remoteFile;
                                body.FileInfo = bufferCurrentPackage;
                                PackageSubmit(socket, ref queueSubmitPackage, PackageType.SyncFileResponse, body);                            offset += readSize;
                                remainSize -= readSize;                            stream.Position = offset;                            limitFileResponsePackageSize = Math.Min(limitFileResponsePackageSize, remainSize);
                                bufferCurrentPackage = new byte[limitFileResponsePackageSize];
                            }