另一位程序员为备份项目编写代码。他外出接受手术,无法询问有关他独自制作的项目的问题。在项目中,他使用离子zip库(特别是Ionic.Zip命名空间。)使用正确的文件名和文件大小创建zip。但是,文件已损坏。我已经将问题追溯到他发送Ionic Zip的AddEntry()方法的流类:
zip.AddEntry(backupSource.FullPath, backupSource.StreamData);
zip.Save();
我已经通过硬编码文件流并用它替换backupSource.StreamData来验证backupSource.StreamData是个问题。关于backupSource.StreamData的一点内容......它是BackupSourceBase类的成员,它派生自一个派生自Stream类的BackupFileBase类。 BackupFileBase重写了Stream类的Read()和Write()方法。这是代码:
public override int Read(byte[] buffer, int offset, int count)
{
byte[] internalBuffer = new byte[count];
GCHandle pinnedArray = GCHandle.Alloc(internalBuffer, GCHandleType.Pinned);
IntPtr ptr = pinnedArray.AddrOfPinnedObject();
uint lpNumberOfBytesRead = 0;
bool ret = Kernel32.BackupRead(FileHandle.DangerousGetHandle(), ptr, (uint)count, out lpNumberOfBytesRead, false, true, ref lpContext);
int err = Marshal.GetLastWin32Error();
Array.Copy(internalBuffer, 0, buffer, offset, lpNumberOfBytesRead);
pinnedArray.Free();
return (int)lpNumberOfBytesRead;
}
public override long Seek(long offset, SeekOrigin origin)
{
int fileLow = LoWord(offset);
int fileHigh = HiWord(offset);
Kernel32.SetFilePointer(FileHandle, fileLow, out fileHigh, origin);
return Position;
}
和
public override void Write(byte[] buffer, int offset, int count)
{
byte[] internalBuffer = new byte[count];
Array.Copy(buffer, offset, internalBuffer, 0, count);
GCHandle pinnedArray = GCHandle.Alloc(internalBuffer, GCHandleType.Pinned);
IntPtr ptr = pinnedArray.AddrOfPinnedObject();
uint lpNumberOfBytesWritten = 0;
bool ret = Kernel32.BackupWrite(FileHandle.DangerousGetHandle(), ptr, (uint)count, out lpNumberOfBytesWritten, false, true, ref lpContext);
pinnedArray.Free();
}
我试图弄清楚Ionic Zip库在Stream类中看到的成员。我真诚地相信问题是被覆盖的Read()方法。说实话,我花了一个小时试图找出他的代码在该方法中做了什么,但是并没有完全明白。我很乐意提供所需的更多信息或回答任何问题。我正在使用Visual Studio 2012 .Net 4.0框架和Ionic.Zip库版本1.9.1.8
显然,我欢迎任何可能导致我的选择的建议。