浏览代码

Refactor InternalUploadFile
Update SftpUploadAsyncResult with actual number of bytes that was already written to the server

olegkap_cp 13 年之前
父节点
当前提交
0124ab2fee
共有 1 个文件被更改,包括 26 次插入45 次删除
  1. 26 45
      Renci.SshClient/Renci.SshNet/SftpClient.cs

+ 26 - 45
Renci.SshClient/Renci.SshNet/SftpClient.cs

@@ -1314,43 +1314,23 @@ namespace Renci.SshNet
 
             var buffer = new byte[this.BufferSize];
 
-            var uploadCompleted = false;
-
+            var bytesRead = input.Read(buffer, 0, buffer.Length);
             var expectedResponses = 0;
             var expectedResponsesLock = new object();
 
             do
             {
-                var bytesRead = input.Read(buffer, 0, buffer.Length);
-
-                if (bytesRead < this.BufferSize)
+                if (bytesRead > 0)
                 {
-                    var data = new byte[bytesRead];
-                    Buffer.BlockCopy(buffer, 0, data, 0, bytesRead);
-                    using (var wait = new AutoResetEvent(false))
+                    if (bytesRead < this.BufferSize)
                     {
-                        this._sftpSession.RequestWrite(handle, offset, data, wait, (s) =>
-                        {
-                            if (s.StatusCode == StatusCodes.Ok)
-                            {
-                                lock (expectedResponsesLock)
-                                {
-                                    expectedResponses--;
-                                    System.Diagnostics.Debug.WriteLine(expectedResponses);
-                                    Monitor.Pulse(expectedResponsesLock);
-                                }
-                            }
-                        });
-                        lock (expectedResponsesLock)
-                        {
-                            expectedResponses++;
-                            System.Diagnostics.Debug.WriteLine(expectedResponses);
-                        }
+                        //  Replace buffer for last chunk of data
+                        var data = new byte[bytesRead];
+                        Buffer.BlockCopy(buffer, 0, data, 0, bytesRead);
+                        buffer = data;
                     }
-                    uploadCompleted = true;
-                }
-                else
-                {
+
+                    var writtenBytes = offset + (ulong)buffer.Length;
                     this._sftpSession.RequestWrite(handle, offset, buffer, null, (s) =>
                     {
                         if (s.StatusCode == StatusCodes.Ok)
@@ -1358,7 +1338,13 @@ namespace Renci.SshNet
                             lock (expectedResponsesLock)
                             {
                                 expectedResponses--;
-                                System.Diagnostics.Debug.WriteLine(expectedResponses);
+
+                                //  Call callback to report number of bytes written
+                                if (asynchResult != null)
+                                {
+                                    asynchResult.Update(offset);
+                                }
+
                                 Monitor.Pulse(expectedResponsesLock);
                             }
                         }
@@ -1366,27 +1352,22 @@ namespace Renci.SshNet
                     lock (expectedResponsesLock)
                     {
                         expectedResponses++;
-                        System.Diagnostics.Debug.WriteLine(expectedResponses);
                     }
-                }
 
-                offset += (uint)bytesRead;
-
-                //  Call callback to report number of bytes read
-                if (asynchResult != null)
-                {
-                    asynchResult.Update(offset);
-                }
 
-            } while (!uploadCompleted);
+                    offset += (uint)bytesRead;
 
-            while (expectedResponses > 0)
-            {
-                lock (expectedResponsesLock)
+                    bytesRead = input.Read(buffer, 0, buffer.Length);
+                }
+                else if (expectedResponses > 0)
                 {
-                    Monitor.Wait(expectedResponsesLock);
+                    //  Wait for expectedResponses to change
+                    lock (expectedResponsesLock)
+                    {
+                        Monitor.Wait(expectedResponsesLock);
+                    }
                 }
-            }
+            } while (expectedResponses > 0);
 
             this._sftpSession.RequestClose(handle);
         }