WIN32_FIND_DATA 循环获取文件大小BUG

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

时间: 2024-11-09 22:15:54

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

WIN32_FIND_DATA 循环获取文件大小的BUG

今天在调试程序时发现一个 WIN32_FIND_DATA 的BUG,在循环读取一个文件夹下的图片文件时,发现结构体中 nFileSizeLow 和 nFileSizeHigh 值 == 0的情况,即能获取到文件名,但读出的文件大小为0的尴尬情况.但事实上,图片文件是正常的,大小从80K~170K的都有,比较诡异,与各位分享一下.  typedef struct _WIN32_FIND_DATAW { DWORD dwFileAttributes; FILETIME ftCreationTime;

【转】Java中获取文件大小的正确方法

本文出处:http://blog.csdn.net/chaijunkun/article/details/22387305,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在原始出处查看此文. 今天写代码时需要实现获取文件大小的功能,目前有两种实现方法,一种是使用File的length()方法:另外一种是使用 FileInputStream的available()方法,当InputStream未进行read操作时,available()的大小应该是等于 文件大小的.但

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

方法一: WIN32_FIND_DATA fileInfo; HANDLE hFind; DWORD fileSize; const char *fileName = 文件的路径及名字; hFind = FindFirstFile(fileName ,&fileInfo); if(hFind != INVALID_HANDLE_VALUE) fileSize = fileInfo.nFileSizeLow; FindClose(hFind); 方法二: HANDLE hFile; // the

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

转自 http://blog.csdn.net/zhibudefeng/article/details/7795946 //file 文件操作 NSFileManager 常见的NSFileManager文件的方法: -(BOOL)contentsAtPath:path                从文件中读取数据 -(BOOL)createFileAtPath:path contents:(BOOL)data attributes:attr      向一个文件写入数据 -(BOOL)rem

win10 uwp 从StorageFile获取文件大小

本文主要:获取文件大小 private async Task<ulong> FileSize(Windows.Storage.StorageFile file) { var size = await file.GetBasicPropertiesAsync(); return size.Size; }//32ddd4227a66713e1329214424c4be9b 在群里看到有大神问我就写出,虽然少,在没看到他们说之前没想到,九幽开发者:53078485 参见:http://stackov

C/C++ 获取文件大小

面试的时候面试官提到了怎样获取文件的大小,现在总结如下: 在C语言中测试文件的大小,主要使用二个标准函数. 1.fseek 函数原型:int fseek ( FILE * stream, long int offset, int origin ); 参数说明:stream,文件流指针:offest,偏移量:orgin,原(始位置.其中orgin的可选值有SEEK_SET(文件开始).SEEK_CUR(文件指针当前位置).SEEK_END(文件结尾). 函数说明:对于二进制模式打开的流,新的流位置

Linux命令:cp、time、cut、awk 、获取文件大小命令

最近写了一个shell脚本,用到了cp.time.cut.awk命令,把他们的使用方法给写下来: 1.cp和mv cp命令:用来完成文件的复制,从源文件夹复制到目标文件夹.执行后源文件夹和目标文件夹均有源文件. mv 命令:用来移动文件.执行后,源文件夹中没有源文件.我经常用mv命令来重命名文件 注意:cp命令源文件夹与目标文件夹不能使同一个:而在mv中可以是同一个. 命令解析: #cp [-R] 源文件 目标文件夹 cp -R 参数 ---当复制整个文件夹时使用. #mv 源文件 目标文件夹

C# 获取文件大小,创建时间,文件信息,FileInfo类的属性表

C# 获取文件大小,创建时间,文件信息,FileInfo类的属性表 2011-12-13 09:00:40| 分类: C# |举报|字号 订阅 OpenFileDialog openFileDialog1 = new OpenFileDialog(); if(openFileDialog1.ShowDialog() == DialogResult.OK) { openFileDialog1.FileName; System.IO.FileInfo file = new System.IO.Fil

【MFC】获取文件大小的方法

[转载]原文地址:http://blog.csdn.net/coderwu/article/details/5652056 MFC 下可以通过 CFileStatus 获取文件大小. 1 ULONGLONG size; 2 CString strFilePath; 3 CFileStatus fileStatus; 4 5 if (CFile::GetStatus(strFilePath, fileStatus)) 6 { 7 size = fileStatus.m_size; 8 }