Powershell FTP Загрузить с резюме - PullRequest
0 голосов
/ 16 сентября 2011

У меня довольно интересная проблема.

Я создал скрипт для архивирования и загрузки (с резюме) некоторых файлов на учетную запись FTP.Локально на моем компьютере это работает нормально, но в производственной среде я получаю эту ошибку:

PS> $ftp.Put($fileStream,$file.name,$true);

Исключение вызывает "Put" с аргументом (ами) "3": "Не удалось найти файл" C: \ ByAndrew\ PowerShell \ Transactions \ System.IO.FileStream '. "

В строке: 1 символ: 9

  • $ ftp.Put (<<<< $ fileStream, $ file.name, $ true); </li>

Вот скрипт:

$xml = New-Object XML

$xml.Load(".\settings.xml")

[void][Reflection.Assembly]::LoadFrom("D:\Work\Projects\ProjectIndyFTP\Bin\Indy.Sockets.dll")

$ftp = new-object Indy.Sockets.FTP

$ftp.Host = $xml.list.ftp.server

$ftp.Port = $xml.list.ftp.port

$ftp.Username = $xml.list.ftp.user

$ftp.Password = $xml.list.ftp.pass

$ftp.ConnectTimeout = 600

$ftp.Connect()

$file = Get-Item "D:\Work\Projects\ProjectIndyFTP\TestFolder\TestFiles\testfile5M.bin"
#$fileStream = $file.OpenRead()
$fileStream = New-Object System.IO.FileStream($file,[System.IO.FileMode]::Open,[System.IO.FileAccess]::Read,[System.IO.FileShare]::ReadWrite)
$ftp.Put($fileStream,$file.name,$true);
$fileStream.Close()
$ftp.Quit()
exit

<<<<<<<<<<<<<<<<<<<< Iне понимаю ошибку.Что с "Не удалось найти файл 'C: \ ByAndrew \ PowerShell \ Transactions \ System.IO.FileStream'."Я имею в виду «путь \ объект» Кто-нибудь сталкивался с таким поведением раньше?Любые советы? </p>

С уважением, Эндрю


Обновления:

Сегодня я проверил ссылочную версию сборки из производственной среды: mscoree.dll [2.0.50727.1433] - .net 20 sp1 Локально у меня был [2.0.50727.3053] - .net 20 sp2 Чтобы исключить это как проблему, я искал машину с .net 20 sp1.воспроизвел ошибку -> обновил .net до 2.0 sp2 и проверил.Та же проблема.Вот почему я сказал ... Я не думаю, что "зависимость" является ошибочной.

С уважением, Эндрю

1 Ответ

1 голос
/ 17 сентября 2011

Почему вы вызываете $ file.OpenRead (), а затем в следующей строке создаете новый объект FileStream? Кроме того, ни одна из перегрузок для нового FileStream не принимает объект FileInfo в качестве первого аргумента конструктора. Я мог бы видеть, что вы используете $ file.FullName в качестве первого аргумента, хотя я бы посмотрел на эти строки как на подозрительные, прежде чем даже попадать в различия между производством и разработкой ...

Если вам не нужны все специальные атрибуты, указывающие .NET, как открывать файл, я бы просто использовал метод .OpenRead () - он уже возвращает объект FileStream. Если вам нужны эти параметры, удалите строку OpenRead ().

Кроме того, было бы неплохо добавить вызов $ fileStream.Dispose () после вашего вызова .Close () или даже вместо него, так как Dispose также закроет поток. Это также дает преимущество освобождения связанной ручки.

...