📄 file.c
字号:
功能: 写入U盘文件.
-----------------------------------------------------------------------------------*/
UBYTE WriterUsbFile(UHWORD writeLength,UBYTE *pBuffer)
{
UHWORD len,i,j;
UBYTE bSuccess,bStop,step,SecCnt2Write,bUpdate;
if(!DiskFlags.UDiskOK)
return false;
if(!ThisFile.bFileOpen)
return false;
if(writeLength>32768)
return false;
ThisFile.bFileOpen=0;
bSuccess=1;
bStop=0;
bUpdate=1;
j=0;
if(ThisFile.StartCluster<1)
{
ThisFile.StartCluster=CreateClusterLink(0x00000000);
ThisFile.LengthInByte=0;
ThisFile.ClusterPointer=ThisFile.StartCluster;
ThisFile.SectorPointer=FirstSectorofCluster(ThisFile.StartCluster);
ThisFile.OffsetofSector=0;
ThisFile.SectorofCluster=0;
ThisFile.pointer=0;
ThisFile.FatSectorPointer=0;
}
if(ThisFile.OffsetofSector>0)
{
if(writeLength+ThisFile.OffsetofSector>DeviceInfo.BPB_BytesPerSec)
len=DeviceInfo.BPB_BytesPerSec;
else
len=writeLength+ThisFile.OffsetofSector;
if(!RBC_Read(ThisFile.SectorPointer,1,DBUF))
return false;
len=len-ThisFile.OffsetofSector;
for(i=0;i<len;i++)
DBUF[ThisFile.OffsetofSector+i]=*(pBuffer+i);
if(!RBC_Write(ThisFile.SectorPointer,1,DBUF))
return false;
ThisFile.OffsetofSector=ThisFile.OffsetofSector+len;
step=ThisFile.OffsetofSector/DeviceInfo.BPB_BytesPerSec;
writeLength-=len;
j+=len;
ThisFile.pointer+=len;
if(step>0)
FileInfoUpdate(step);
}
while(writeLength>0)
{
if(bUpdate==1)
{
StartSec2Write=ThisFile.SectorPointer;
BufStartAddress=pBuffer+j;
SecCnt2Write=0;
bUpdate=0;
}
step=(writeLength-1)/DeviceInfo.BPB_BytesPerSec+1;
if(step+ThisFile.SectorofCluster<DeviceInfo.BPB_SecPerClus+1)
{
SecCnt2Write+=step;
len=writeLength;
ThisFile.OffsetofSector=len;
writeLength-=len;
j+=len;
ThisFile.pointer+=len;
if(!RBC_Write(StartSec2Write,SecCnt2Write,BufStartAddress))
return false;
step=ThisFile.OffsetofSector/DeviceInfo.BPB_BytesPerSec;
FileInfoUpdate(step);
}
else
{
while(step+ThisFile.SectorofCluster>DeviceInfo.BPB_SecPerClus)
{
step=DeviceInfo.BPB_SecPerClus-ThisFile.SectorofCluster;
SecCnt2Write+=step;
len=step*DeviceInfo.BPB_BytesPerSec;
ThisFile.OffsetofSector=len;
writeLength-=len;
j+=len;
ThisFile.pointer+=len;
OldClusterPointer=ThisFile.ClusterPointer;
FileInfoUpdate(step);
if(ThisFile.ClusterPointer!=OldClusterPointer+1)
{
if(!RBC_Write(StartSec2Write,SecCnt2Write,BufStartAddress))
return false;
bUpdate=1;
break;
}
if(SecCnt2Write>63) // 如果超过每次最大写的数量
{
if(!RBC_Write(StartSec2Write,SecCnt2Write,BufStartAddress))
return false;
bUpdate=1;
break;
}
step=(writeLength-1)/DeviceInfo.BPB_BytesPerSec+1;
}
}
}
WriteFileEnd();
j=0;
ThisFile.bFileOpen=1;
return true;
}
/*-----------------------------------------------------------------------------------
名称: void UsbSaveFile(UBYTE *fileName);
功能: U盘文件储存.
-----------------------------------------------------------------------------------*/
void UsbSaveFile(UBYTE *fileName)
{
UBYTE idata i;
UWORD idata lenth;
((UBYTE*)&lenth)[0] = InOutBuf[18];
((UBYTE*)&lenth)[1] = InOutBuf[19];
((UBYTE*)&lenth)[2] = InOutBuf[20];
((UBYTE*)&lenth)[3] = InOutBuf[21];
lenth += 22;
for(i=0;i<8;i++)
UsbItemBuf[i] = fileName[i];
UsbItemBuf[8] = 'M';
UsbItemBuf[9] = 'I';
UsbItemBuf[10] = 'D';
UsbItemBuf[11] = 0x20;
UsbItemBuf[12] = 0x18;
UsbItemBuf[13] = 0x75;
UsbItemBuf[14] = 0xCD;
UsbItemBuf[15] = 0xB4;
UsbItemBuf[16] = 0xE2;
UsbItemBuf[17] = 0x2E;
UsbItemBuf[18] = 0xE2;
UsbItemBuf[19] = 0x20;
UsbItemBuf[20] = 0x20;
UsbItemBuf[21] = 0xCE;
UsbItemBuf[22] = 0xB4;
UsbItemBuf[23] = 0xE2;
UsbItemBuf[24] = 0x20;
UsbItemBuf[25] = 0x20;
UsbItemBuf[26] = 0x20;
UsbItemBuf[27] = 0x20;
UsbItemBuf[28] = 0x20;
UsbItemBuf[29] = 0x20;
UsbItemBuf[30] = 0x20;
UsbItemBuf[31] = 0x20;
RemoveUsbFile(&UsbItemBuf);
CreateUsbFile(&UsbItemBuf);
WriterUsbFile(lenth,InOutBuf);
}
/*-----------------------------------------------------------------------------------
名称: UHWORD ReadtUsbList(UBYTE *pBuffer);
功能: 读取U盘根目录.
-----------------------------------------------------------------------------------*/
UHWORD ReadtUsbList(UBYTE *pBuffer)
{
UHWORD idata i,item,sector;
UBYTE idata j,k;
UWORD idata sectorToRead,dirClusterPointer;
if(!DiskFlags.UDiskOK)
return false;
item = 0;
sector = 0;
dirClusterPointer = ThisDir.StartCluster;
for(;;)
{
if(!SeekSectorToRead(&dirClusterPointer,§or,§orToRead))
return false;
if(!RBC_Read(sectorToRead,1,DBUF))
return false;
for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
{
if(DBUF[i]==0x00)
return(item/32);
else if(DBUF[i]==0xE5)
continue;
else if((DBUF[i]&0x40==0x40)&&(DBUF[i+11]&0x0f==0x0f))
{
j=(DBUF[i]&0x0F)*32;
if((DBUF[i+8+j]=='M')&&(DBUF[i+9+j]=='I')&&(DBUF[i+10+j]=='D'))
{
for(k=0;k<32;k++)
pBuffer[item++] = DBUF[i+j+k];
}
i = i+j;
}
else
{
if((DBUF[i+8]=='M')&&(DBUF[i+9]=='I')&&(DBUF[i+10]=='D'))
{
for(k=0;k<32;k++)
pBuffer[item++] = DBUF[i+k];
}
}
}
}
return(item/32);
}
/*-----------------------------------------------------------------------------------
名称: UBYTE OpenUsbFile(UBYTE *pBuffer);
功能: 打开U盘文件.
-----------------------------------------------------------------------------------*/
UBYTE OpenUsbFile(UBYTE *pBuffer)
{
UHWORD i,sector;
UBYTE j,bstop;
UWORD sectorToRead,dirClusterPointer;
PDIR_STRUC pDir;
if(!DiskFlags.UDiskOK)
return false;
bstop = 0;
sector = 0;
ThisFile.bFileOpen = 0;
dirClusterPointer = ThisDir.StartCluster;
for(;;)
{
if(!SeekSectorToRead(&dirClusterPointer,§or,§orToRead))
return false;
if(!RBC_Read(sectorToRead,1,DBUF))
return false;
for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
{
if(DBUF[i]==0x00)
return false;
j=0;
while(DBUF[i+j]==*(pBuffer+j))
{
j=j+1;
if(j>10)
break;
}
if(j>10)
{
for(j=0;j<32;j++)
UsbItemBuf[j]=DBUF[i+j];
ThisFile.bFileOpen=1;
bstop=1;
break;
}
}
if(bstop==1)
break;
}
pDir=(PDIR_STRUC)UsbItemBuf;
if(DiskFlags.bIsFat32==0)
ThisFile.StartCluster=SwapINT16(pDir->DIR_FstClusLO);
else
ThisFile.StartCluster=MakeWord(UsbItemBuf[21],UsbItemBuf[20],UsbItemBuf[27],UsbItemBuf[26]);
ThisFile.LengthInByte=SwapINT32(pDir->DIR_FileSize);
ThisFile.ClusterPointer=ThisFile.StartCluster;
ThisFile.SectorPointer=FirstSectorofCluster(ThisFile.StartCluster);
ThisFile.OffsetofSector=0;
ThisFile.SectorofCluster=0;
ThisFile.pointer=0;
for(j=0;j<11;j++)
ThisFile.FileName[j]=*(pBuffer+j);
FreeClusterNum=DeviceInfo.FSI_Nxt_Free;
FreeSecNum=ThisFatSecNum(DeviceInfo.FSI_Nxt_Free);
if(!RBC_Read(FreeSecNum,1,CurFatSector))
return false;
return true;
}
/*-----------------------------------------------------------------------------------
名称: UBYTE ReadUsbFile(UHWORD readLength,UBYTE *pBuffer);
功能: 读取U盘文件.
-----------------------------------------------------------------------------------*/
UBYTE ReadUsbFile(UHWORD readLength,UBYTE *pBuffer)
{
UHWORD idata len,i,j;
UBYTE idata bSuccess;
if(!DiskFlags.UDiskOK)
return false;
if(!ThisFile.bFileOpen)
return false;
j=0;
bSuccess=1;
ThisFile.bFileOpen=0;
if(readLength>RAM_SIZE)
return false;
if(readLength+ThisFile.pointer>ThisFile.LengthInByte)
return false;
while(readLength>0)
{
if(readLength+ThisFile.OffsetofSector>DeviceInfo.BPB_BytesPerSec)
len = DeviceInfo.BPB_BytesPerSec;
else
len = readLength+ThisFile.OffsetofSector;
if(ThisFile.OffsetofSector>0)
{
if(RBC_Read(ThisFile.SectorPointer,1,DBUF))
{
len=len-ThisFile.OffsetofSector;
for(i=0;i<len;i++)
*(pBuffer+i)=DBUF[ThisFile.OffsetofSector+i];
ThisFile.OffsetofSector=ThisFile.OffsetofSector+len;
}
else
return false;
}
else
{
if(!RBC_Read(ThisFile.SectorPointer,1,pBuffer+j))
return false;
ThisFile.OffsetofSector=len;
}
readLength -= len;
j += len;
if(ThisFile.OffsetofSector>DeviceInfo.BPB_BytesPerSec-1)
{
ThisFile.OffsetofSector-=DeviceInfo.BPB_BytesPerSec;
ThisFile.SectorofCluster+=1;
if(ThisFile.SectorofCluster>DeviceInfo.BPB_SecPerClus-1)
{
ThisFile.SectorofCluster=0;
ThisFile.ClusterPointer=GetNextClusterNum(ThisFile.ClusterPointer);
if(DiskFlags.bIsFat32==0)
{
if(ThisFile.ClusterPointer>0xffef)
return false;
}
else
{
if(ThisFile.ClusterPointer>0x0ffffff8)
return false;
}
ThisFile.SectorPointer=FirstSectorofCluster(ThisFile.ClusterPointer);
}
else
ThisFile.SectorPointer=ThisFile.SectorPointer+1;
}
}
ThisFile.bFileOpen=1;
ThisFile.pointer += j;
return true;
}
/*-----------------------------------------------------------------------------------
名称: UBYTE FileOpenDisk(UHWORD Point);
功能: 根据序号打开磁盘文件到RAM.
-----------------------------------------------------------------------------------*/
UBYTE FileOpenDisk(UHWORD Point)
{
UBYTE idata i;
UHWORD idata len;
Point *= 32;
for(i=0;i<8;i++)
InputFileName[i] = InOutBuf[Point+i];
if(OpenUsbFile(&InOutBuf[Point]))
{
len = MakeWord(InOutBuf[Point+31],InOutBuf[Point+30],InOutBuf[Point+29],InOutBuf[Point+28]);
if(ReadUsbFile(len,InOutBuf))
return true;
else
return false;
}
else
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -