none
_findfirst, _findnext API获取Linux SMB目录的奇怪问题 RRS feed

  • 常规讨论

  •  目标:在Windows中利用API来获得远端Linux的共享目录,该共享通过SMB服务来实现。远端目录使用utf-8编码,Windows端使用_findfirst, _findnext API来获取目录名,然后将utf-8转为gb2312后显示
     问题:英文目录可以正常显示,中文目录会出现部分乱码。如下图所示:

    正常的中文目录本该是:

    用网络抓包工具抓到了SMB包,发现包中传递的字节是正确的,如下图,e5 88 98 e4 ba a6 e8 8f b2为“刘亦菲”三个字的utf-8编码:

    在VC2005中编程,查看

    struct   _finddata_t   FileFind;

    struct _finddata64i32_t {

            unsigned    attrib;

            __time64_t  time_create;    /* -1 for FAT file systems */

            __time64_t  time_access;    /* -1 for FAT file systems */

            __time64_t  time_write;

            _fsize_t    size;

            char        name[260];}
    查看name的内存值,为e5 88 98 e4 ba a6 e8 8f, 丢失了最后的b2
    VC中的抓图:

    VS2005中的相关代码如下:
     struct   _finddata_t   FileFind;
     ZeroMemory(&FileFind,sizeof(_finddata_t));

     char ConstBuff[MAX_PATH];
     strcpy(ConstBuff,Path);
     
     int   done=0,handle,id=1;
     char FullPath[MAX_PATH] = "\\\\";
     strcat(FullPath,Path);
     strcat(FullPath,"/*.*");
     
     if((handle=_findfirst(FullPath,&FileFind))==-1)
     {
      #ifdef DEBUG
      printf("empty folder");
      #endif  
     }
     else
     {
      do  
      {   
       if(strcmp(FileFind.name,"..") || strcmp(FileFind.name,"."))
       {    

        printf("%s\n",FileFind.name);
        
        if   ((_A_SUBDIR==FileFind.attrib))//folder
        {  

        }  
        else
         //file
        { 

        }
        #ifdef DEBUG    
        printf("%s\n",FileFind.name);
        #endif
       }
       ZeroMemory(&FileFind,sizeof(_finddata_t));
      }while(!(done=_findnext(handle,&FileFind)));
      _findclose(handle);
     }//end no empty else

    疑问:为什么API获得的目录会比实际的丢了一个字节
    希望能得到诸位高手的指点!不胜感激!


    };

     

    2009年12月28日 6:50

全部回复