64,682
社区成员
发帖
与我相关
我的任务
分享
class BigFileSpace{
struct DataDef{
int Num;
__int64 Size,Pos,Used;
TStream *Stm;
int Active;
struct BuffDef{
int Id;
char Name[256];
int Len;
TStream *stm;} *Dat[MAXNUM];} DataSpace;
public:
BigFileSpace(){DataSpace.Num=0;DataSpace.Dat=0;}
~BigFileSpace();
int Add(UnicodeString Filename,int Size);
TStream* Seek(__int64 At,int offset);
int Write(void* buf,int);
int Read(void* buf,int);
...
};
~BigFileSpace::BigFileSpace()
{
if(DataSpace.Dat)
for(int i=0;i<DataSpace.Num;++i)
if(DataSpace.Dat[i]->stm){
delete DataSpace.Dat[i]->stm; DataSpace.Dat[i]->stm=0;}
DataSpace.Dat=0;
}
int Add(UnicodeString File,int Size)
{
TStream *stm=0;
if(FileExists(File))
stm = new TFileStream(File,fmOpenReadWrite);
else{
stm = new TFileStream(File,fmCreate);
stm->Size = Size;
stm->position=0;}
DataSpace.Dat[DataSpace.Num]->stm = stm;
strcpy(DataSpace.Dat[DataSpace.Num]->Name,File.c_str());
DataSpace.Dat[DataSpace.Num]->Size = Size;
DataSpace.Num++;
DataSpace.Id = DataSpace.Num;
return 0;
}
int Read(void *Buf,int N)
{
if(Stm->Position+N<Stm->Size)
Stm->Read(buf,N);
else{
int n = Stm->Size-Stm->Position;
Stm->Read(buf,n);
Active++;
Stm = DataSpace.Dat[Active]->Stm;
Stm->Position = 0;
Stm->Read(buf+n,N-n);}
Pos += N;
return 0;
}
TStream* Seek(__int64 At,int Offset)
{
__int64 at=At;
switch(Offset){
case BEGIN: for(int i=0;i<DataSpace.Num;++i){
if(at <DataSpace.Dat[i]->Size){
Pos = At;
DataSpace.Dat[i]->stm->Position = at;
Active = i;
return Stm = DataSpace.Dat[i]->stm;}
at -= DataSpace.Dat[i].Size;}
break;
case CURRENT:
...
}
没环境,大致如此,自己完善吧