C# Ionic Zip库的AddEntry(string,Stream)方法需要流类的哪些成员
另一个程序员为备份项目编写代码。他正在进行手术,无法询问有关他独自创建的项目的问题。在这个项目中,他利用了ionic zip库(特别是ionic.zip名称空间)。正在使用正确的文件名和文件大小创建zip。但是,这些文件已损坏。我已将问题追溯到流类,他正在发送Ionic Zip的AddEntry()方法: 我已经通过硬编码文件流并用它替换backupSource.StreamData来验证backupSource.StreamData是否存在问题。关于backupSource的一点。StreamData。。。它是BackupSourceBase类的成员,该类派生自从Stream类派生的BackupFileBase类。BackupFileBase正在重写流类的Read()和Write()方法。代码如下:C# Ionic Zip库的AddEntry(string,Stream)方法需要流类的哪些成员,c#,.net,stream,dotnetzip,C#,.net,Stream,Dotnetzip,另一个程序员为备份项目编写代码。他正在进行手术,无法询问有关他独自创建的项目的问题。在这个项目中,他利用了ionic zip库(特别是ionic.zip名称空间)。正在使用正确的文件名和文件大小创建zip。但是,这些文件已损坏。我已将问题追溯到流类,他正在发送Ionic Zip的AddEntry()方法: 我已经通过硬编码文件流并用它替换backupSource.StreamData来验证backupSource.StreamData是否存在问题。关于backupSource的一点。Stream
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;
}
及
我试图弄清楚Ionic Zip库在流类中看到了哪些成员。我真诚地认为问题在于被重写的Read()方法。老实说,我花了一个小时试图弄清楚他的代码在这个方法中做了什么,但我还是不太明白。我很乐意提供更多需要的信息或回答任何问题。我正在使用Visual Studio 2012.Net 4.0框架和Ionic.Zip库版本1.9.1.8
显然,我欢迎任何关于我的其他选择的原因的建议 你试过看图书馆的地图吗?是的,蒂姆,我看过。一个更有经验的程序员可能会很幸运地理解代码,但我发现,要想从代码中剔除并理解它,需要付出艰苦的努力。我是一名初级开发人员,工作不到6个月。谢谢你的回复。
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();
}