我有一个相当有趣的问题。
我创建了一个脚本来压缩并上传(带简历)一些文件到FTP帐户。在我的机器本地工作正常但在生产环境中我收到此错误:
PS> $ftp.Put($fileStream,$file.name,$true);
使用“3”参数调用“Put”的异常:“找不到文件'C:\ ByAndrew \ PowerShell \ Transactions \ System.IO.FileStream'。”
在第1行:char:9
这是脚本:
$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
<<<<<<<<<<<<<<<<<<<< 我不明白这个错误。什么是“无法找到文件'C:\ ByAndrew \ PowerShell \ Transactions \ System.IO.FileStream'。” 我的意思是'路径\对象' 以前有人遇到过这种行为吗?有什么提示吗?
祝你好运, 安德鲁
更新
今天我从生产环境中检查引用的程序集版本: mscoree.dll [2.0.50727.1433] - .net 20 sp1 我当地有[2.0.50727.3053] - .net 20 sp2 为了将此问题排除在外,我用.net 20 sp1查找了一台机器。转载错误 - >将.net更新为2.0 sp2并检查它。同样的问题。这就是为什么我说..我不认为“依赖”是错误的。
此致 安德鲁
答案 0 :(得分:1)
为什么要调用$ file.OpenRead()然后在下一行中创建一个新的FileStream对象?此外,新FileStream的重载都不会将FileInfo对象作为构造函数的第一个参数。我可以看到你使用$ file.FullName作为第一个参数,虽然我会在生成/ dev差异之前将这些行视为可疑...
如果您不需要指示.NET如何打开文件的所有特殊属性,我只会使用.OpenRead()方法 - 它已经返回一个FileStream对象。如果您需要这些选项,请删除OpenRead()行。
此外,在调用.Close()之后包含$ fileStream.Dispose()调用是一个好主意 - 或者甚至代替它,因为Dispose也会关闭流。这也有释放相关句柄的好处。