01
02
/*
函数功能:读取指定文件内容
参数3:指定的文件名
*/
QByteArray ReadFileContent(Fat12Header& rf, QString p, QString fn)
{
QByteArray ret;
RootEntry re = FindRootEntry(rf, p, fn);
if( re.DIR_Name[0] != '\0' )
{
QVector<ushort> vec = ReadFat(rf, p);
QFile file(p);
if( file.open(QIODevice::ReadOnly) )
{
char buf[512] = {0}; // 每次读一簇,也就是一个扇区的大小
QDataStream in(&file);
int count = 0;
ret.resize(re.DIR_FileSize);//返回值对象的大小,也就是目标文件的大小
// j表示数据簇的编号,i每次读取一个数据簇的大小512字节
// j=vec[j] j的这种改变方式是因为fat表象中记录的是数据簇的地址,
for(int i=0, j=re.DIR_FstClus; j<0xFF7; i+=512, j=vec[j])
{
file.seek(rf.BPB_BytsPerSec * (33 + j - 2)); // 根据偏移地址来算的绝对地址,定位到第"0"簇的位置。
in.readRawData(buf, sizeof(buf)); //每次读取一簇的数据
for(uint k=0; k<sizeof(buf); k++)
{
if( count < ret.size() ) // 确保读取到的是有效的字节,每次拷贝1个字节,count++
{
ret[i+k] = buf[k];//把读到的数据拷贝到返回值数组对象当中
count++;
}
}
}
}
file.close();
}
return ret;
}
03
bp指向目标文件的第一个簇
04
迭代的思想,首先验证加载文件内容的代码是正确的。
05
06
07
08
09
10