You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PowerShell通过SFTP统计远程ZIP压缩包内的文件数量

PowerShell 无下载统计远程SFTP服务器ZIP内文件数实现方案

核心原理

ZIP格式的元数据全部存储在文件末尾的固定结构中,不需要读取前序的压缩数据块即可获取全部文件条目信息,因此仅需远程拉取ZIP末尾的少量数据即可完成统计,无需下载整个压缩包。

分步实现逻辑

  • 依赖SSH.NET库完成SFTP协议的连接与范围读取操作,这是PowerShell生态下最常用的SFTP操作依赖。
  • 第一步:使用主机地址、端口、用户名、密码完成SFTP连接认证。
  • 第二步:调用SFTP文件属性查询接口,获取目标ZIP文件的总大小,无需下载任何文件内容。
  • 第三步:发起范围读取请求,仅拉取ZIP文件末尾的20字节数据,该段为ZIP的中央目录结束标记(EOCD),普通ZIP格式的压缩包总文件数直接存储在该段结构中。
  • 第四步:解析EOCD结构直接获取文件条目总数,即可得到压缩包内的文件数量。如果是ZIP64格式的压缩包,需要额外拉取EOCD前的ZIP64扩展段解析即可,逻辑和普通ZIP一致。

可直接复用的PowerShell代码示例

# 提前通过NuGet安装SSH.NET后导入库,也可直接引用本地dll
Add-Type -Path "本地路径/SSH.NET.dll"

# 替换为你的SFTP连接参数
$sftpHost = "192.168.xxx.xxx"
$sftpPort = 22
$sftpUser = "你的用户名"
$sftpPwd = ConvertTo-SecureString "你的密码" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($sftpUser, $sftpPwd)
$remoteZipPath = "/远程服务器ZIP文件的绝对路径"

# 建立SFTP连接
$sftpClient = New-Object Renci.SshNet.SftpClient($sftpHost, $sftpPort, $cred)
try {
    $sftpClient.Connect()
    # 获取远程ZIP的总大小
    $zipTotalSize = $sftpClient.GetAttributes($remoteZipPath).Size
    # 仅读取末尾20字节的EOCD结构
    $eocdBuffer = New-Object byte[] 20
    $sftpClient.Read($remoteZipPath, $zipTotalSize - 20, $eocdBuffer, 0, 20)
    # 解析EOCD获取文件总数,普通ZIP直接读取第8-10字节的无符号短整型即可
    $fileCount = [BitConverter]::ToUInt16($eocdBuffer, 8)
    Write-Host "远程ZIP内的文件总数为:$fileCount"
}
finally {
    # 释放连接
    $sftpClient.Disconnect()
    $sftpClient.Dispose()
}

边界情况处理

  • 如果压缩包为ZIP64格式(单文件大于4GB、总大小大于4GB或文件数超过65535),EOCD中存储的条目数会被标记为0xFFFF,此时需要额外读取ZIP64的EOCD扩展段解析正确的文件数,处理逻辑和普通ZIP一致,仅需多读取一段几十字节的数据即可。
  • 若ZIP存在加密注释,不影响条目数的统计,无需解密即可完成读取。

内容的提问来源于stack exchange,提问作者user3658390

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:48:03