今天在调试程序时发现一个 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,粘贴出来与大家共享。有不允许见的也可探讨一下。

WIN32_FIND_DATA 循环获取文件大小BUG的更多相关文章

  1. [WinAPI] API 10 [创建、打开、读写文件,获取文件大小]

    在Windows系统中,创建和打开文件都是使用API函数CreateFile,CreateFile通过指定不同的参数来表示是新建一个文件,打开已经存在的文件,还是重新建立文件等.读写文件最为直接的方式 ...

  2. Java获取文件大小的正确方法(转)

    Java中获取文件大小的正确方法 2014-03-28 14:03 64507人阅读 评论(9) 收藏 举报  分类: Java笔记(36)  研究成果(42)  版权声明:本文为博主原创文章,未经博 ...

  3. Java中获取文件大小的正确方法

    本文出处:http://blog.csdn.net/djy1992/article/details/51146837,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在原始 ...

  4. [转]VC++获取文件大小集锦

    方法一: WIN32_FIND_DATA fileInfo; HANDLE hFind; DWORD fileSize; const char *fileName = 文件的路径及名字; hFind ...

  5. 客户端用javascript获取文件大小

    客户端用javascript获取文件大小 1 ie实现代码如下: <script type="text/javascript" language="javascri ...

  6. python获取文件大小

    python获取文件大小 # !/usr/bin/python3.4 # -*- coding: utf-8 -*- import os # 字节bytes转化kb\m\g def formatSiz ...

  7. ios NSFileManager和NSFileHandle(附:获取文件大小 )

    转自 http://blog.csdn.net/zhibudefeng/article/details/7795946 //file 文件操作 NSFileManager  常见的NSFileMana ...

  8. C/C++多种方法获取文件大小(转)

    源码下载:点击下载 源码如下: #include <iostream> #include <io.h> #include <sys\stat.h> #include ...

  9. js获取文件大小

    var file = urlBox.doc.activeElement.files[0]||urlBox.files[0] ; if (file) { var fileSize = 0; if (fi ...

随机推荐

  1. VB中的Dictionary对象

    VB中的Dictionary对象 Dictionary对象不是VBA或Visual Basic实时语言的具体存在的部分,它是存在于Microsoft Scripting Runtime Library ...

  2. Html.RenderPartial与Html.RenderAction区别(转)

    Html.RenderPartial与Html.RenderAction这两个方法都是用来在界面上嵌入用户控件的. Html.RenderPartial是直接将用户控件嵌入到界面上: <%Htm ...

  3. WEB文件上传下载功能

    WEB文件上传下载在日常工作中经常用到的功能 这里用到JS库 http://files.cnblogs.com/meilibao/ajaxupload.3.5.js 上传代码段(HTML) <% ...

  4. JSP学习笔记(1)

    JSP本质就是一个servlet,当第一次接受到客户端请求时会被编译成对应的servlet,且对应的每个servlet在容器中只要一个实例. 1.1.JSP注释 <%-- JSP注释部分 --& ...

  5. SQL Server 2008 R2 的版本和组件

    SQL Server 2008 R2 的版本和组件 SQL Server 2008 R2   其他版本 SQL Server 2008 SQL Server 2005 SQL Server 2012 ...

  6. PartialViewResult用法

    后台代码 ) { IList<TestModel> lstTestModel = this.GetModelList(categoryid); return PartialView(lst ...

  7. MySQL 表子查询

    MySQL 表子查询 表子查询是指子查询返回的结果集是 N 行 N 列的一个表数据. MySQL 表子查询实例 下面是用于例子的两张原始数据表: article 表: aid title conten ...

  8. ubuntu增加工作分区(workspace)命令

    dconf write  /org/compiz/profiles/unity/plugins/core/hsize 3 dconf write  /org/compiz/profiles/unity ...

  9. Java订单号(时间加流水号)

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  10. $ npm install opencv ? 你试试?! 在windows环境下,使用node.js调用opencv攻略

    博主之前写过一篇文章<html5与EmguCV前后端实现——人脸识别篇>,叙述的是opencv和C#的故事.最近在公司服务器上更新了一套nodejs环境,早就听闻npm上有opencv模块 ...