Как я могу одновременно загружать файлы с помощью winscpnet.dll

Как я могу одновременно загружать файлы с помощью библиотеки winscpnet.dll. Я хотел бы установить экземпляры winscp.exe, которые могут работать одновременно, с числом x экземпляров winscp.exe, используя сценарий или С#.

В других потоках упоминалась документация по ссылке ниже, но этот код будет просматривать удаленный сервер и одновременно загружать все файлы в сеансе x, используя session.GetFiles https://winscp.net/eng/docs/library_example_parallel_transfers#powershell

Я хочу сделать то же самое, но хотел бы загружать файлы из каталога с помощью session.PutFiles.

В код winscpnet.dll встроена функция, которая перечисляет удаленный каталог, но ничего не делает для обратного. Прокрутите локальный каталог и запустите пять экземпляров winscp.exe, и когда они закончат, делайте это до тех пор, пока все файлы не будут завершены там. Session.Putfiles передаются.

Причина, по которой это важно, заключается в том, что загрузка их по одной на удаленный sftp-сервер занимает значительно больше времени, чем их одновременная загрузка.


person user6382877    schedule 19.10.2017    source источник


Ответы (2)


Статья, на которую вы ссылались, теперь включает полный код для загрузки в параллельных соединениях по протоколу SFTP на C#. .

person Martin Prikryl    schedule 19.10.2017

Если вам это все еще нужно, поехали.

#Powershell script to upload files from a local dire 
param ( 
$sessionUrl = "sftp://tester:password;fingerprint=ssh-rsa 2048 ba:5d:a4:1b:0a:73:30:cf:90:dd:e3:ef:6c:9e:1d:94@localhost", 
$remotePath = "/", 
$localPath = "C:\Users\your\test\upload", 
$batches = 3 
) 

#Upload data to local Rebex Tiny SFTP 

try 
{ 
    # Load WinSCP .NET assembly 
    $dllPath = (Join-Path $PSScriptRoot "WinSCPnet.dll") 
    # Load WinSCP .NET assembly 
    Add-Type -Path $dllPath 

    $started = Get-Date 

    # Build list of local files and sort them from larges to smallest 
    $files = Get-ChildItem $localPath | Sort-Object Length -Descending 

    # Calculate total size of all files 
    $total = ($files | Measure-Object -Property Length -Sum).Sum 

    # And batch size 
    $batch = [int]($total / $batches) 

    Write-Host ("Will upload {0} files totaling {1} bytes in {2} parallel batches, {3} bytes on average in each" -f $files.Count, $total, $batches, $batch) 

    $start = 0 
    $sum = 0 
    $no = 0 

    for ($i = 0; $i -lt $files.Count; $i++) 
    { 
        $sum += $files[$i].Length 

        # Found enough files for the next batch 
        if (($sum -ge $batch) -or ($i -eq $files.Count - 1)) 
        { 
            Write-Host ("Starting batch {0} to upload {1} files totaling {2}" -f $no, ($i - $start + 1), $sum) 

            $fileList = $files[$start..$i] -join ";" 

            # Start the background job for the batch 
            Start-Job -Name "Batch $no" -ArgumentList $dllPath, $sessionUrl, $localPath, $remotePath, $no, $fileList { 
                param ( 
                    [Parameter(Position = 0)] 
                    $dllPath, 
                    [Parameter(Position = 1)] 
                    $sessionUrl, 
                    [Parameter(Position = 2)] 
                    $localPath, 
                    [Parameter(Position = 3)] 
                    $remotePath, 
                    [Parameter(Position = 4)] 
                    $no, 
                    [Parameter(Position = 5)] 
                    $fileList 
                ) 

                try 
                { 
                    Write-Host ("Starting batch {0}" -f $no) 

                    # Load WinSCP .NET assembly. 
                    # Need to use an absolute path as the Job is started from user's documents folder. 
                    Add-Type -Path $dllPath 

                    # Setup session options 
                    $sessionOptions = New-Object WinSCP.SessionOptions 
                    $sessionOptions.ParseUrl($sessionUrl) 

                    try 
                    { 
                        Write-Host ("Connecting batch {0}..." -f $no) 
                        $session = New-Object WinSCP.Session 

                        $session.Open($sessionOptions) 

                        $files = $fileList -split ";" 

                        # Upload the files selected for this batch 
                        foreach ($file in $files) 
                        { 
                            $localFilePath = "$localPath\$file" 
                            $remoteFilePath = "$remotePath/$file" 
                            Write-Host "Uploading $localFilePath to $remoteFilePath in $no" 

                            $session.PutFiles($session.EscapeFileMask($localFilePath), $remoteFilePath).Check() 
                        } 
                    } 
                    finally 
                    { 
                        # Disconnect, clean up 
                        $session.Dispose() 
                    } 

                    Write-Host ("Batch {0} done" -f $no) 
                } 
                catch [Exception] 
                { 
                    Write-Host $_.Exception.Message 
                    exit 1 
                } 
            } | Out-Null 

            # Reset for the next batch 
            $no++ 
            $sum = 0 
            $start = $i + 1 
        } 
    } 

    Write-Host "Waiting for batches to complete" 
    Get-Job | Receive-Job -Wait 

    Write-Host "Done" 

    $ended = Get-Date 
    Write-Host ("Took {0}" -f (New-TimeSpan -Start $started -End $ended)) 

    exit 0 
} 
catch [Exception] 
{ 
    Write-Host $_.Exception.Message 
    exit 1 
} 
person wp78de    schedule 19.10.2017