今天在调试程序时发现一个 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. nyoj 623

    #include <iostream> using namespace std; int main() { int a[51][51],b[51][51],c[51][51],i,j,k, ...

  2. 粘帖屏幕截图到web页面插件 screenshot-paste

    在很多场合下,我们可能有这样的需求:提供个屏幕截图上传到系统,作为一个凭证.传统的操作方式是:屏幕截图,保存文件到本地,在web页面上选择本地文件并上传,这里至少需要三步.有没有可能直接将截图粘帖到w ...

  3. maven第7章生命周期和插件

    maven插件用到哪些思想? 7.7 从命令行调用插件 目标前缀和插件前缀是一个意思. 在本地搭建maven环境,熟悉maven的环境.

  4. .Net程序员 Solr-5.3之旅 (二)Solr 安装

    阅读目录 引言 Solr5.3环境搭建 Solr5.3创建第一个Core 结尾 引言 一个糟糕的设计有好的表现形式,它会被判死缓,一个好的设计有糟糕的表现形式,它会被判死刑立即执行. 以上摘自一个设计 ...

  5. new Option()——实现时间联动

    //1.动态创建select function createSelect(){ var mySelect = document.createElement("select"); m ...

  6. linux下zip命令使用

    linux zip命令 zip -r myfile.zip ./*将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzipunzip -o ...

  7. CentOS重启与关机

    Linux centos关机与重启命令详解与实战 Linux centos重启命令: 1.reboot 2.shutdown -r now 立刻重启(root用户使用) 3.shutdown -r 1 ...

  8. eclipse中的web-inf下没有web.xml

  9. css布局之三栏布局

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  10. 【转载】经典10道c/c++语言经典笔试题(含全部所有参考答案)

    经典10道c/c++语言经典笔试题(含全部所有参考答案) 1. 下面这段代码的输出是多少(在32位机上). char *p; char *q[20]; char *m[20][20]; int (*n ...