关于CH376修改文件创建时间的问题

前面打了很多字,详细的描写了调试的过程,点提交提示我没有登录,有点累了,简单描述一下吧


文件创建、读写都没问题,修改文件创建时间不成功,所有想到的方法试过,时间一直都是2004/1/1,什么原因,

1、修改宏的时间,失败

2、使用例程,失败

3、自己写函数,失败


宏时间:

#ifndef    DEF_WILDCARD_CHAR
#define    DEF_WILDCARD_CHAR        0x2A            /* 路径名的通配符 '*' */
#define    DEF_SEPAR_CHAR1        0x5C            /* 路径名的分隔符 '\' */
#define    DEF_SEPAR_CHAR2        0x2F            /* 路径名的分隔符 '/' */
#define    DEF_FILE_YEAR            2017            /* 默认文件日期: 2004年 */
#define    DEF_FILE_MONTH            12                /* 默认文件日期: 1月 */
#define    DEF_FILE_DATE            1                /* 默认文件日期: 1日 */
#endif

例程:

UINT8    SetFileCreateTime( PUINT8 iFileName, UINT16 iCreateDate, UINT16 iCreateTime )
{
    UINT8    s;
    
    printf("iFileName : %s\r\n", iFileName);
    s = CH376FileOpen( iFileName );  /* 打开文件 */
    if ( s == USB_INT_SUCCESS ) {
        /* 文件读写操作等... */
        s = CH376DirInfoRead( );  /* 读取当前文件的目录信息FAT_DIR_INFO,将相关数据调到内存中 */
        if ( s == USB_INT_SUCCESS ) {
            buf[0] = (UINT8)iCreateTime;  /* 文件创建的时间,低8位在前 */
            buf[1] = (UINT8)(iCreateTime>>8);  /* 文件创建的时间,高8位在后 */
            CH376WriteOfsBlock( buf, STRUCT_OFFSET( FAT_DIR_INFO, DIR_CrtTime ), 2 );  /* 向内部缓冲区偏移地址DIR_CrtTime写入2个字节 */
            buf[0] = (UINT8)iCreateDate;  /* 文件创建的日期,低8位在前 */
            buf[1] = (UINT8)(iCreateDate>>8);  /* 文件创建的日期,高8位在后 */
            CH376WriteOfsBlock( buf, STRUCT_OFFSET( FAT_DIR_INFO, DIR_CrtDate ), 2 );  /* 向内部缓冲区偏移地址DIR_CrtDate写入2个字节 */
            s = CH376DirInfoSave( );  /* 保存文件的目录信息 */
            if ( s == USB_INT_SUCCESS ) {  /* 成功修改并保存 */
                /* 文件读写操作等... */
            }
            s = CH376DirInfoRead( );  /* 读取当前文件的目录信息FAT_DIR_INFO,将相关数据调到内存中 */
        }
        CH376FileClose( FALSE );  /* 关闭文件 */
    }
    return( s );
}


哪一步出错?返回值多少?DirInfo可以读到吗? 

另外,头文件不要修改。


这个网站很蛋疼,好不容易写好了,又要重新登录,好累耶这样,这是特性还是bug啊,求解释。。。。以后每次写少点好了


返回值都没有问题,为0x14,头文件我只修改了时间,应该没关系,然而修改那里并没有用,那个宏怎么找都找不到哪里用到了,使用编译器工具查找发现,时间的这个宏并没有用上


我描述一下我的理解

首先使用 CH376DirInfoRead( ),CH376得到指令后将属性信息放入该芯片内部缓存区,然后返操作成功的指令,接着使用CH376WriteOfsBlock( buf, STRUCT_OFFSET( FAT_DIR_INFO, DIR_CrtTime ), 2 )函数,将buf内的数据写进对应缓存区的偏移地址,编译地址用宏 STRUCT_OFFSET( FAT_DIR_INFO, DIR_CrtTime )得到应该是CH376内部的缓存区数据格式与结构体FAT_DIR_INFO的结构是一致的,然后写CH376DirInfoSave( )指令,CH376将缓存区内的数据写进文件,然后等待返回参数,此时一个流程的操作完毕

这次聪明了,先复制在提交,果然要重登。。。


这样操作一遍的话,按理来说应该可以修改文件创建的时间,在论坛里找了找,对于时间好像都没遇到什么问题,关于这类问题的解决也没有找到,可能是我的代码具体哪里还是出错了


急求解决,如果解决我一定会在帖子里回复已解决,希望这个帖子不要沉!!!各位大大前辈们,麻烦帮帮忙吧,这是产品设计的缺陷啊,而且这个缺陷很明显,不可以有


注意文件中修改时间与创建时间的区别,查看文件属性。

修改时间属性,不是通过头文件修改的。


抱歉各位,久等了,继续该帖,前几天在整理代码,同时还要上课,可能并不会持续登录这里,更重要的是并没有什么调试的头绪,所以只能暂时搁浅了,希望各位可以提出各种调试的方式,我会一一尝试的




多谢 jie 回复,之前我并不知道修改头文件没什么用,我只是根据头文件中的注释来进行操作,后来仔细查看才发现,头文件关于设置创建时间的宏根本没有用上,可能是需要结合自己编写代码去实现


还是关于修改时间和创建时间的问题,根据参考文档里面及例程,所用的函数都是修改文件的创建时间,如果文件根本没有创建时间,修改可以成功吗?可为什么函数返回的值时0x14


用库创建的文件默认情况下,是只有修改时间的(2004-),创建时间未填写。但是表项是存在的,所以一定是可以修改的。所有函数的执行结果都是0x14吗(包括CH376DirInfoRead、CH376DirInfoSave),CH376DirInfoRead之后,是可以把32字节表项全部读出来的,你读读看,能否读出?


不对,我直接在函数里进行打印,像这样
UINT8    SetFileCreateTime( PUINT8 iFileName, UINT16 iCreateDate, UINT16 iCreateTime )
{
    UINT8    s;
    
    printf("iFileName : %s\r\n", iFileName);
    s = CH376FileOpen( iFileName );  /* 打开文件 */
    if ( s == USB_INT_SUCCESS ) {
        /* 文件读写操作等... */
        s = CH376DirInfoRead( );  /* 读取当前文件的目录信息FAT_DIR_INFO,将相关数据调到内存中 */
        printf("CH376DirInfoRead: %d\r\n",s);
 //       s = CH376ReadBlock( buf );                                                  /* 读取枚举到的文件的FAT_DIR_INFO结构,返回长度总是sizeof( FAT_DIR_INFO ) */
//        pDir = (P_FAT_DIR_INFO)buf;
       
//        printf("CH376ReadBlock: %d\r\n",s);
       
 //       printf("DIR_CrtTime :%x\r\n",pDir->DIR_CrtTime);
//        printf("DIR_WrtTime :%x\r\n",pDir->DIR_WrtTime);
        
        if ( s == USB_INT_SUCCESS ) {
            buf[0] = (UINT8)iCreateTime;  /* 文件创建的时间,低8位在前 */
            buf[1] = (UINT8)(iCreateTime>>8);  /* 文件创建的时间,高8位在后 */
            CH376WriteOfsBlock( buf, STRUCT_OFFSET( FAT_DIR_INFO, DIR_CrtTime ), 2 );  /* 向内部缓冲区偏移地址DIR_CrtTime写入2个字节 */
            buf[0] = (UINT8)iCreateDate;  /* 文件创建的日期,低8位在前 */
            buf[1] = (UINT8)(iCreateDate>>8);  /* 文件创建的日期,高8位在后 */
            CH376WriteOfsBlock( buf, STRUCT_OFFSET( FAT_DIR_INFO, DIR_CrtDate ), 2 );  /* 向内部缓冲区偏移地址DIR_CrtDate写入2个字节 */
            s = CH376DirInfoSave( );  /* 保存文件的目录信息 */
            if ( s == USB_INT_SUCCESS ) {  /* 成功修改并保存 */
                /* 文件读写操作等... */
            }
            //s = CH376DirInfoRead( );  /* 读取当前文件的目录信息FAT_DIR_INFO,将相关数据调到内存中 */
        }
        CH376FileClose( FALSE );  /* 关闭文件 */
    }
    return( s );
}


上面我就直接贴代码了,发现问题:

CH376DirInfoRead()返回的值实际上是0x20,但是如果根据函数的逻辑,进行s = CH376DirInfoRead( );操作后并不会在对s进行赋值了的,因此函数返回的值应该是0x20,但实际上,整个SetFileCreateTime函数放回的值却是0x14,期间s=0x20时并不会进入if语句,这是为何?



 s = SetFileCreateTime(TarName,  MAKE_FILE_DATE(2017 , 12, 14),MAKE_FILE_TIME(20,8,0) );
 printf("Modify_Fil_Creat_time is %02X\r\n",s);

调用后返回的值却是0x14


噢,搞错,打印格式错了,直接打印整型了,,16进制应该就是0x14,这样就更不知道问题了


        s = CH376DirInfoRead( ); 
        printf("CH376DirInfoRead: %x\r\n",s);
        
        s = CH376ReadBlock( buf );   
        pDir = (P_FAT_DIR_INFO)buf;
        
        printf("CH376ReadBlock: %x\r\n",s);
        
        printf("DIR_CrtTime :%x\r\n",pDir->DIR_CrtTime);
        printf("DIR_WrtTime :%x\r\n",pDir->DIR_WrtTime);


CH376DirInfoRead()返回的值是0x14

CH376ReadBlock()返回的值是0x20


只有登录才能回复,可以选择微信账号登录