i = CH375FileCreate( ); /* 以创建文件的方法创建目录 */ if ( i == ERR_SUCCESS ) { // if ( &FILE_DATA_BUF[0] == &DISK_BASE_BUF[0] ) CH375DirtyBuffer( ); /* 如果FILE_DATA_BUF与DISK_BASE_BUF合用则必须清除磁盘缓冲区 */ DirXramBuf = &FILE_DATA_BUF[0]; /* 文件数据缓冲区 */ DirConstData = ". \x10\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x21\x30\x0\x0\x0\x0\x0\x0.. \x10\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x21\x30\x0\x0\x0\x0\x0\x0"; for ( i = 0x40; i != 0; i -- ) { /* 目录的保留单元,分别指向自身和上级目录 */ *DirXramBuf = *DirConstData; DirXramBuf ++; DirConstData ++; } FILE_DATA_BUF[0x1A] = (UINT8)CH375vStartCluster; /* 自身的起始簇号 */ FILE_DATA_BUF[0x1B] = (UINT8)(CH375vStartCluster>>8); FILE_DATA_BUF[0x14] = (UINT8)(CH375vStartCluster>>16); FILE_DATA_BUF[0x15] = (UINT8)(CH375vStartCluster>>24); FILE_DATA_BUF[0x20+0x1A] = (UINT8)UpDirCluster; /* 上级目录的起始簇号 */ FILE_DATA_BUF[0x20+0x1B] = (UINT8)(UpDirCluster>>8); FILE_DATA_BUF[0x20+0x14] = (UINT8)(UpDirCluster>>16); FILE_DATA_BUF[0x20+0x15] = (UINT8)(UpDirCluster>>24); for ( i = 0xE0; i != 0; i -- ) { /* 清空目录区剩余部分 */ *DirXramBuf = 0; DirXramBuf ++; } for ( i = 0xE0; i != 0; i -- ) { /* 清空目录区剩余部分 */ *DirXramBuf = 0; DirXramBuf ++; } mCmdParam.Write.mSectorCount = 1; i = CH375FileWrite( ); /* 写目录的第一个扇区 */ if ( i == ERR_SUCCESS ) { DirXramBuf = &FILE_DATA_BUF[0]; for ( i = 0x40; i != 0; i -- ) { /* 清空目录区 */ *DirXramBuf = 0; DirXramBuf ++; } for ( j = 1; j != CH375vSecPerClus; j ++ ) { // if ( &FILE_DATA_BUF[0] == &DISK_BASE_BUF[0] ) CH375DirtyBuffer( ); /* 如果FILE_DATA_BUF与DISK_BASE_BUF合用则必须清除磁盘缓冲区 */ mCmdParam.Write.mSectorCount = 1; i = CH375FileWrite( ); /* 清空目录的剩余扇区 */ if ( i != ERR_SUCCESS ) break; } 能不能具体分析一下,上面这段程序的作用,一直看不是很懂,谢谢!
这个就是写一个扇区的.要是详细了解的话必须看以下文件系统的相关知识. 文件路径的要记录下上级目录的相关信息,本目录的相关信息,主要就是起始簇号.程序中: DirConstData = ". \x10\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x21\x30\x0\x0\x0\x0\x0\x0.. \x10\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x21\x30\x0\x0\x0\x0\x0\x0"; for ( i = 0x40; i != 0; i -- ) { /* 目录的保留单元,分别指向自身和上级目录 */ *DirXramBuf = *DirConstData; DirXramBuf ++; DirConstData ++; } FILE_DATA_BUF[0x1A] = (UINT8)CH375vStartCluster; /* 自身的起始簇号 */ FILE_DATA_BUF[0x1B] = (UINT8)(CH375vStartCluster>>8); FILE_DATA_BUF[0x14] = (UINT8)(CH375vStartCluster>>16); FILE_DATA_BUF[0x15] = (UINT8)(CH375vStartCluster>>24); FILE_DATA_BUF[0x20+0x1A] = (UINT8)UpDirCluster; /* 上级目录的起始簇号 */ FILE_DATA_BUF[0x20+0x1B] = (UINT8)(UpDirCluster>>8); FILE_DATA_BUF[0x20+0x14] = (UINT8)(UpDirCluster>>16); FILE_DATA_BUF[0x20+0x15] = (UINT8)(UpDirCluster>>24); 这个信息表是以0X2E,和0X2EX0X2E来表示的,反映到ASIC码上就是.和.. 你可以看到DirConstData 里面有.和.. 两个地方,然后把簇号和起始簇号分别写到文件缓冲区里面,把数据写到目录的第一个扇区里面,然后把文件的相关属性修改为0X10就可以了.
1.把数据写到目录的第一个扇区里面。你指的数据是不是前面保存到文件缓冲区里的簇号和起始簇号? 2.我的程序出现这样一种现象:第一次创建目录可以成功,第二次创建不管创建在哪里,文件的属性都不是文件夹?请问这是为什么?
是的,为了方便你调试和解决你所遇到的问题,你可以看一下你在U盘里到底写了什么数据,分析出错误数据才能找到原因.你用WINHEX软件就可以看到.你可以把U盘格式化好后,新建一个文件夹,看看数据是怎么回事.然后在文件夹下面在建一个文件夹.看看数据是怎么安排的就明白了.你看看你修改后的文件属性是否被写到其他地方了
我在文件夹下面再建文件夹的格式并不是文件夹,但我往这个文件夹里新建TXT后就变成文件夹了 搞不明白,是不是哪里没有操作完成?