今天在调试程序时发现一个 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. 汉字转拼音(pinyin4j-2.5.0.jar)

    import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinCase ...

  2. oracle、db2、sybase大型数据库面试总结

    1. oracle数据库单例.多例模式. 数据库创建之后会有一系列为该数据库提供服务的内存空间和后台进程,称为该数据库的实例. 每一个数据库至少会有一个实例为其服务. 2. mysql获取字段的长度用 ...

  3. 注意 reader["yjID"] == DBNull.Value而不是null

    自己做的项目吃的大亏,由于原始数据yjID这个字段里面什么都没有,所以,这个地方报错,说是字符串格式不支持,应该为DBNull.Value而不是null,DBNull.Value代表数据库(用的acc ...

  4. MySQL数据库my.cnf配置文件注释详解

    我们知道,在MySQL数据库安装完成后,要对my.cnf配置文件进行适当的修改才能充分利用MySQL数据库的功能.但是对于初学者来说,修改my.cnf配置文件似乎是一个比较难的过程.为了解决这个问题, ...

  5. Shell中逻辑判断

    [ 条件1 -a 条件2 ]   当1和2都真时才为真 [ 条件1 -o 条件2 ]   当1和2其中一个为真即为真 [ ! 条件 ]           取反   &&     与 ...

  6. 常用命令常用sql:SHOWVARIABLESLIKE'character%'

    mysql学习笔记-常用命令 常用sql: SHOW VARIABLES LIKE 'character%';查看字符集SHOW VARIABLES LIKE 'collation_%';show e ...

  7. ionic开发环境搭建

    Advanced HTML5 mobile development framework and SDK. Build incredible mobile apps with web technolog ...

  8. 你好,C++(13)这道单选题的答案是A、B、C还是D?3.7 枚举类型

    3.7  枚举类型 除了之前我们介绍的数值数据和文字数据之外,在现实世界中,常常还会遇到这样一类数据:一道单选题的答案只能是A.B.C.D四个选项中的某一个:红绿灯的颜色只能是红色,绿色和黄色中的某一 ...

  9. Oracle 11g安装攻略

    Oracle 11g安装攻略 本攻略是以Win7-32位系统中安装Oracle 11g为示例,安装前大家需要确认以下几点: 你的内存足够大且没有问题,因为Oracle非常吃内存. 你的系统已经激活. ...

  10. 关于latex的使用随笔

    1.the context after paragraph topic to new line /paragraph{xxxx}~{} 2.关于表格中文本过长自动换行问题的解决 P.S.:直接贴一段写 ...