zoukankan      html  css  js  c++  java
  • 编写测试:VC下获取文件大小的4种方法

    代码参考自lailx的博客:获取文件大小的4种方法(http://www.cnblogs.com/lailx/archive/2011/11/20/2256550.html
     
     1 // TestGetFileSize.cpp : Defines the entry point for the console application.
     2 //
     3 
     4 #include "stdafx.h"
     5 #include <iostream>
     6 #include <windows.h>
     7 #include <io.h>
     8 #include <sys\stat.h>
     9 
    10 using namespace std;
    11 
    12 size_t GetFileSize1(LPCTSTR lpszFileName)
    13 {
    14    size_t nResult = 0;
    15    HANDLE handle = CreateFile(lpszFileName, FILE_READ_EA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
    16    if (handle != INVALID_HANDLE_VALUE)
    17    {
    18        nResult = GetFileSize(handle, NULL);
    19        CloseHandle(handle);
    20    }
    21    return nResult;
    22 }
    23 
    24 size_t GetFileSize2(LPCTSTR lpszFileName)
    25 {
    26    size_t nResult = 0;
    27    WIN32_FIND_DATA fileInfo; 
    28    HANDLE hFind; 
    29    hFind = FindFirstFile(lpszFileName, &fileInfo); 
    30    if(hFind != INVALID_HANDLE_VALUE) 
    31        nResult = fileInfo.nFileSizeLow; 
    32    FindClose(hFind); 
    33    return nResult;
    34 }
    35 
    36 size_t GetFileSize3(LPCTSTR lpszFileName)
    37 {
    38    size_t nResult = 0;
    39    FILE* file = fopen(lpszFileName, "r");
    40    if (file)
    41    {
    42        nResult = filelength(fileno(file));
    43        fclose(file);
    44    }
    45    return nResult;
    46 }
    47 
    48 size_t GetFileSize4(LPCTSTR lpszFileName)
    49 {
    50    size_t nResult = 0;
    51    struct _stat info;
    52    _stat(lpszFileName, &info);
    53    nResult = info.st_size;
    54    return nResult;
    55 }
    56 
    57 DWORD Test(size_t (*pFunc)(LPCTSTR), LPCTSTR lpszFileName)
    58 {
    59    DWORD dwResult = 0;
    60    size_t nFileSize = 0;
    61    DWORD tick = GetTickCount();
    62    for (int i=0; i<10000; i++)
    63    {
    64        nFileSize = pFunc(lpszFileName);
    65 //     cout<<"FileSize = "<<nFileSize<<endl;
    66    }
    67    dwResult = GetTickCount() - tick;
    68    cout<<"Cost: "<<dwResult<<endl;
    69    return dwResult;
    70 }
    71 
    72 
    73 int main(int argc, char* argv[])
    74 {
    75    char *szFileName = "G:\\1.txt";
    76    DWORD dwCost[4] = {0};
    77    
    78    dwCost[0] = Test(GetFileSize1, szFileName);
    79    system("pause");
    80    
    81    dwCost[1] = Test(GetFileSize2, szFileName);
    82    system("pause");
    83    
    84    dwCost[2] = Test(GetFileSize3, szFileName);
    85    system("pause");
    86    
    87    dwCost[3] = Test(GetFileSize4, szFileName);
    88    system("pause");
    89    
    90    return 0;
    91 }


    测试结果:

     
    当目标文件正在被写入的时候,体积逐渐增大,但测试发现第GetFileSize2()、GetFileSize4()返回的文件大小是固定不变的,因此在需要监视文件大小时,这两种方法不可取。
     
  • 相关阅读:
    VC++学习(1):Windows程序内部运行原理
    VC++学习(9):定制应用程序外观
    VC++学习(7):对话框编程
    VC++学习(3):MFC框架程序剖析
    VC++学习(5):文本编程
    VC++学习(4):简单绘图
    DbgPrint/KdPrint输出格式控制
    常用的正则表达式
    使用geoserver+openLayers加载google地图
    retunValue与opener的用法
  • 原文地址:https://www.cnblogs.com/ddgg/p/2932335.html
Copyright © 2011-2022 走看看