C# 使用chilkat验证从FTP下载的非常大的.zip文件(约12 GB)

C# 使用chilkat验证从FTP下载的非常大的.zip文件(约12 GB),c#,validation,zip,chilkat,C#,Validation,Zip,Chilkat,我正在使用chilkat从FTP服务器下载大型.zip文件。。 文件大小通常在12-13GB左右,下载后我需要验证文件是否损坏 我正在尝试使用ICSharpCode.SharpZipLib.Zip 像这样 ZipFile zip=新ZipFile路径; bool isValidZip=zip.TestArchivetrue,TestStrategy.findfirsor,null 但是验证需要很长时间,甚至崩溃 有没有更快的解决办法 一些FTP服务器已实现哈希命令,请参阅。在ftp提示符下发出帮

我正在使用chilkat从FTP服务器下载大型.zip文件。。 文件大小通常在12-13GB左右,下载后我需要验证文件是否损坏

我正在尝试使用ICSharpCode.SharpZipLib.Zip

像这样 ZipFile zip=新ZipFile路径; bool isValidZip=zip.TestArchivetrue,TestStrategy.findfirsor,null

但是验证需要很长时间,甚至崩溃


有没有更快的解决办法

一些FTP服务器已实现哈希命令,请参阅。在ftp提示符下发出帮助,以获取所有可用命令的列表,并查看您的服务器是否支持哈希命令。否则,您必须坚持zip测试。

如果客户正在上传到FTP,那么客户也可以上传SHA256哈希。例如,如果客户上载x.zip,则计算x.zip的SHA256,并同时上载x.zip.SHA256。然后,您的应用程序可以下载x.zip和x.zip.sha256,然后使用Chilkat.Crypt2.HashFile对x.zip进行散列并检查x.zip.sha256

如果无法获得预期的散列值,则可以首先根据服务器上的数据检查文件大小。FTP服务器在提供文件信息的方式上可能有所不同。较旧的服务器将提供人类可读的目录列表命令,而较新的服务器(即过去10年内)支持MLSD。如果可能,Chilkat将使用MLSD。较旧的FTP服务器可能会提供准确的非精确文件大小信息,而MLSD将是准确的。您可以调用Ftp2.Feat方法来检查是否支持MLSD。如果是这样,那么您可以首先验证下载文件的大小。如果它不是预期的大小,那么您可以跳过任何剩余的验证,因为您已经知道它是无效的。您可以设置Ftp2.AutoGetSizeForProgress=true,然后在使用MLSD且下载的总字节数不等于预期下载大小时,Chilkat将不会返回成功状态

假设字节数相等,或者如果无法获得准确的字节数,并且没有预期的哈希,则可以测试zip是否有效。第一个选项是调用Chilkat.Zip.OpenZip方法。打开.zip将遍历zip的本地文件头和中心目录头。如果.zip已损坏,将捕获大多数错误。更全面的检查只有通过实际解压缩zip中每个文件的数据才能实现——这可能就是SharpZipLib花费如此长时间的原因。验证压缩数据的唯一方法是实际执行解压缩。损坏的字节可能会导致解压缩程序遇到不可能的内部状态,这显然是损坏。此外,未压缩数据的CRC-32存储在.zip中的每个本地文件头中。检查CRC-32需要解压缩。SharpZipLib肯定在CRC-32解压后检查它,它可能试图在内存中解压并耗尽内存。OpenZip不会检查CRC-32,因为它没有解压缩。您可以调用Chilkat.Unzip来解压到文件系统,解压操作也会检查CRC-32

无论如何。。您可能认为检查字节计数并能够成功调用Chilkat.Zip.OpenZip就足以进行验证检查


否则,如果要处理大文件,最好在系统体系结构中使用并行的.sha256文件设计验证。

FTP上是否提供文件哈希?不太可能。。另外,我忘了提到的是,客户上传到FTP,即使在上传之后,它也可能是无效的,所以我需要下载它,并确认它是否有效。您是否有可能在FTP上运行服务?我的第一个想法是进行服务器端验证和散列。因此,基本上,我会将FTP拆分为一个供客户使用的上传目录,然后让服务进行验证和散列。如果成功,将两者移动到下载目录。如果验证失败,我会将其移动到一个特殊目录,并通知负责的用户组。大致是这样的。老实说,作为其客户,我在FTP方面无能为力,在这方面很难做任何事情。。