博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WIN32_FIND_DATA 循环获取文件大小BUG
阅读量:5912 次
发布时间:2019-06-19

本文共 2169 字,大约阅读时间需要 7 分钟。

今天在调试程序时发现一个 WIN32_FIND_DATA 的BUG,在循环读取一个目录下的图片文件时,发现结构体中 nFileSizeLow 和 nFileSizeHigh 值 == 0的情况。即能获取到文件名称,但读出的文件大小为0的尴尬情况。但其实。图片文件是正常的,大小从80K~170K的都有,比較诡异,与各位分享一下。

   typedef struct _WIN32_FIND_DATAW {

    DWORD dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;
    DWORD dwReserved0;
    DWORD dwReserved1;
    WCHAR  cFileName[ MAX_PATH ];
    WCHAR  cAlternateFileName[ 14 ];
#ifdef _MAC
    DWORD dwFileType;
    DWORD dwCreatorType;
    WORD  wFinderFlags;
#endif
} WIN32_FIND_DATAW, *PWIN32_FIND_DATAW, *LPWIN32_FIND_DATAW;

现场情况例如以下:在磁盘上指定一个文件文件夹,有其它的进程不定时的往该文件夹下放入指定格式的JPG文件,而当前进程会循环去检索该文件夹,发现指定格式的JPG文件,就读取并做处理。代码例如以下:

WIN32_FIND_DATA data, cjpg;

      HANDLE hFind = NULL;
      String c_jpgname;
      bool bok = true;

      for(hFind = FindFirstFile((pic_store_path + "*.jpg").c_str(), &data);

        hFind && bok && FileExists(pic_store_path + data.cFileName); bok = FindNextFile(hFind, &data))
      {
             c_jpgname = data.cFileName;

  //问题出如今此处,我想检索一下读取的每一个文件大小,小于5K的图片觉得是有问题的,须要处理。蓝色部分是代码

          if(data.nFileSizeLow < 5120 && data.nFileSizeHigh == 0)

             {
write_log("[uploadXML][%d,%d][%s].", data.nFileSizeHigh, data.nFileSizeLow, c_jpgname);                        

write_log("[uploadXML] 图片异常,存入ERROR文件夹。

");

                        if(FileExists(pic_error_path + data.cFileName))
                        {
                                DeleteFile(pic_error_path + data.cFileName);
                        }
                        //图片大小异常。存放到ERROR目录
                        MoveFile((pic_store_path + data.cFileName).c_str(), (pic_error_path + data.cFileName).c_str());
                continue;
             }

     //实际的文件处理代码

     }

     if(hFind)

      {
                FindClose(hFind);
      } else
      {
                Sleep(100);
      }

但在測试结果时发现。有大小为80K~178K大小不等的图片也会放到ERROR文件夹下,这时的打印大小为 [0,0],在ERROR文件夹下查看这些文件并没有什么异常,当把这些图片放到正确文件夹下继续运行的话,就不会打印大小为0了。

       仅仅好进行改动将大小为0的情况。例外处理。

       if(data.nFileSizeLow < 5120 && data.nFileSizeHigh == 0)

             {
                write_log("[uploadXML][%d,%d][%s].", data.nFileSizeHigh, data.nFileSizeLow, c_jpgname);
                if(data.nFileSizeLow == 0)
                {
                        Sleep(30);
                }
                else
                {
                        write_log("[uploadXML] 图片异常,存入ERROR文件夹。");
                        if(FileExists(pic_error_path + data.cFileName))
                        {
                                DeleteFile(pic_error_path + data.cFileName);
                        }
                        //图片大小异常。存放到ERROR目录
                        MoveFile((pic_store_path + data.cFileName).c_str(), (pic_error_path + data.cFileName).c_str());
                }
                continue;
             }     

这样改动后。那些正常图片就不会放到ERROR文件夹下了。

       只是原因还不是非常清晰,感觉这是一个BUG,粘贴出来与大家共享。有不允许见的也可探讨一下。

   

转载地址:http://abmpx.baihongyu.com/

你可能感兴趣的文章
Python方法(一) - 类的内部方法
查看>>
flutter初探,从零开始搭建一个app
查看>>
深入理解 Javascript 之 JS的解析与执行过程
查看>>
Mycat的实践一:初始Mycat
查看>>
redis ----分布式锁
查看>>
Mac如何实现免密登录阿里云服务器
查看>>
Java知识点总结(JDBC-事务)
查看>>
小程序根据索引滚动指定的位置
查看>>
JavaScript基础系列--打败this
查看>>
如何开启MySQL慢查询日志
查看>>
windows一键部署java项目
查看>>
用 Go 来了解一下 Redis 通讯协议
查看>>
《深入浅出mysql》学习笔记
查看>>
CSS预编译语言Less的用法总结
查看>>
行内元素的padding和margin是否有效
查看>>
Java内存模型
查看>>
Fabric记录
查看>>
javascript引擎——V8
查看>>
mysql中or和in的效率
查看>>
聊聊NettyConnector的start及shutdown
查看>>