有一天,我正在开发BT软件,它有这样的一个功能,就是先把文件的大小分配好,然后再慢慢地往里面对应的位置写入相应的数据。这样的好处,就是可以先把磁盘空间占用起来,以便后面的下载顺利进行。要实现这个功能,就需要创建一个空的文件,然后把文件指针设置到相应大小的位置,然后再调用函数SetEndOfFile来设置文件的结束位置,这样文件就有相应的大小了。在BT软件的开发里,也发现目录的处理时需要详细地记录目录里的文件大小,这就需要使用GetFileSizeEx函数来获取文件的大小。由于BT里的视频文件比较大,有可能几G的,一定要使用GetFileSizeEx函数来处理,这样就可以获取比较大的文件而不出错。
函数FlushFileBuffers和SetFilePointer声明如下:
WINBASEAPI
BOOL
WINAPI
SetEndOfFile(
    __in HANDLE hFile
    );
   
BOOL
WINAPI
GetFileSizeEx(
    __in HANDLE hFile,
    __out PLARGE_INTEGER lpFileSize
    );
hFile是文件句柄。
lpFileSize是获取文件返回的大小。
调用函数的例子如下:
#001  //创建、写入、读取文件。
#002  //蔡军生 2007/10/23 QQ:9073204 深圳
#003  void CreateFileDemo(void)
#004  {
#005         //
#006         HANDLE hFile = ::CreateFile(_T("CreateFileDemo.txt"),     //创建文件的名称。
#007               GENERIC_WRITE|GENERIC_READ,          // 写和读文件。
#008               0,                      // 不共享读写。
#009               NULL,                   // 缺省安全属性。
#010               CREATE_ALWAYS,          // 如果文件存在,也创建。
#011               FILE_ATTRIBUTE_NORMAL, // 一般的文件。      
#012               NULL);                 // 模板文件为空。
#013 
#014         if (hFile == INVALID_HANDLE_VALUE)
#015         {
#016               //
#017               OutputDebugString(_T("CreateFile fail!\r\n"));
#018         }
#019 
#020         //往文件里写数据。
#021         const int BUFSIZE = 4096;
#022         char chBuffer[BUFSIZE];         
#023         memcpy(chBuffer,"Test",4);
#024         DWORD dwWritenSize = 0;
#025         BOOL bRet = ::WriteFile(hFile,chBuffer,4,&dwWritenSize,NULL);
#026         if (bRet)
#027         {
#028               //
#029               OutputDebugString(_T("WriteFile 写文件成功\r\n"));
#030         }
#031 
#032         //先把写文件缓冲区的数据强制写入磁盘。
#033         FlushFileBuffers(hFile);
#034 
#035         //
#036         //从文件里读取数据。
#037         LONG lDistance = 0;
#038         DWORD dwPtr = SetFilePointer(hFile, lDistance, NULL, FILE_BEGIN);
#039         if (dwPtr == INVALID_SET_FILE_POINTER)
#040         {
#041               //获取出错码。
#042               DWORD dwError = GetLastError() ;
#043               //处理出错。           
#044         }
#045 
#046         DWORD dwReadSize = 0;
#047         bRet = ::ReadFile(hFile,chBuffer,4,&dwReadSize,NULL);
#048         if (bRet)
#049         {
#050               //
#051               OutputDebugString(_T("ReadFile 读文件成功\r\n"));
#052         }
#053         else
#054         {
#055               //获取出错码。
#056               DWORD dwError = GetLastError();
#057               //处理出错。           
#058               TCHAR chErrorBuf[1024];
#059               wsprintf(chErrorBuf,_T("GetLastError()=%d\r\n"),dwError);
#060               OutputDebugString(chErrorBuf);
#061         }
#062 
#063         //
#064         //
#065         //移动文件指针到新的位置。
#066         lDistance = 3;
#067         dwPtr = SetFilePointer(hFile, lDistance, NULL, FILE_BEGIN);
#068 
#069        //设置文件新的结束位置。
#070        ::SetEndOfFile(hFile);
#071 
#072         //获取文件的大小。
#073        LARGE_INTEGER liFileSize;
#074        ::GetFileSizeEx(hFile,&liFileSize);
#075 
#076         TCHAR chTemp[128];
#077         wsprintf(chTemp,_T("GetFileSizeEx()=%d\r\n"),liFileSize);
#078         OutputDebugString(chTemp);
#079  
#080 
#081         //关闭文件。
#082         if (hFile != INVALID_HANDLE_VALUE)
#083         {
#084               //
#085               CloseHandle(hFile);
#086         }
#087 
#088  }

转载于:https://www.cnblogs.com/lancidie/archive/2011/03/18/1988122.html

Windows API一日一练(56)SetEndOfFile和GetFileSizeEx函数相关推荐

  1. Windows API一日一练(20)LoadIcon和LoadCursor函数-程序图标设置和鼠标的样式

    主目录传送门 https://blog.csdn.net/zb774095236/article/details/108291755 本次学习的源码模板下载: 1.百度云:https://pan.ba ...

  2. Windows API一日一练 59 CreateFileMapping和MapViewOfFile函数

    在开发软件过程里,也经常碰到进程间共享数据的需求.比如 A 进程创建计算数据, B 进程进行显示数据的图形.这样的开发方式可以把一个大程序分开成独立的小程序,提高软件的成功率,也可以更加适合团队一起开 ...

  3. Windows API一日一练(59)CreateFileMapping和MapViewOfFile函数

    在开发软件过程里,也经常碰到进程间共享数据的需求.比如 A 进程创建计算数据, B 进程进行显示数据的图形.这样的开发方式可以把一个大程序分开成独立的小程序,提高软件的成功率,也可以更加适合团队一起开 ...

  4. Windows API一日一练(10-12)GetMessage TranslateMessage DispatchMessage函数

    主目录传送门 https://blog.csdn.net/zb774095236/article/details/108291755 本次学习的源码模板下载: 1.https://pan.baidu. ...

  5. Windows API一日一练(29)SelectObject和DeleteObject函数

    Windows 显示设备的属性,共有下面几种:位图.画刷.字体.画笔.区域.如果要设置它们到当前设备里,就需要使用 SelectObject 函数,比如上面介绍的字体设置,就会用到这个函数.当你创建一 ...

  6. Windows API一日一练 29 SelectObject和DeleteObject函数

    Windows 显示设备的属性,共有下面几种:位图.画刷.字体.画笔.区域.如果要设置它们到当前设备里,就需要使用 SelectObject 函数,比如上面介绍的字体设置,就会用到这个函数.当你创建一 ...

  7. Windows API一日一练(70)GetSystemTime和GetLocalTime函数

    时间是一个非常重要的信息,比如写LOG时,就需要把时间输出来,跟踪程序是什么时候出错的.或者当你开发一个银行交易系统时,就要记录当前交易的时间,以便后面可以输出报表,打印给信用卡用户.根据不同的需求, ...

  8. Windows API一日一练(47)CreateSemaphore和ReleaseSemaphore函数

    在开发软件的过程中,多线程的程序往往需要实现相互通讯,比如几个线程添加一个消息到队列里,而另一个线程在睡眠时,就需要唤醒那个线程来处理事情.在这其中,就需要使用到信号量来进行同步.CreateSema ...

  9. Windows API一日一练 47 CreateSemaphore和ReleaseSemaphore函数

    在开发软件的过程中,多线程的程序往往需要实现相互通讯,比如几个线程添加一个消息到队列里,而另一个线程在睡眠时,就需要唤醒那个线程来处理事情.在这其中,就需要使用到信号量来进行同步.CreateSema ...

最新文章

  1. Java gdal .mif/.mid文件读取
  2. elasticsearch-查询基础篇
  3. 在 k8s 上最小化安装 KubeSphere
  4. 深入浅出InfoPath——设计讨论版之文本域篇
  5. JDK 8中的流驱动的集合功能
  6. 匿名内部类探究——它是一个实例
  7. C# 关闭当前窗口打开另一窗口
  8. FFmpeg实现多段小视频合成
  9. Spring源码之bean的属性填充populateBean方法解读
  10. adminLTE模态框弹出页面样例
  11. 什么是电子商务——百科
  12. 英文单词乱序后还原 c语言,乱序背单词_有谁也用《不背单词》这个软件吗怎么可以改变背单词的顺序有顺序倒序和乱序的_淘题吧...
  13. 浮窗---创建系统浮窗(可拖动)
  14. ESP8266 alios things 自带 linkkitapp OTA 更新失败
  15. vue2和vue3响应式原理
  16. 汇编实验5 DOS、BIOS调用
  17. BeautifulSoup实战
  18. SAP OO面向对象理论知识(部分一)
  19. 可怜了,这帮苦逼的人肉运维,还有...
  20. 【Altium designer】走线、线条绘制多边形如何切换直角 / 45度 / 圆弧

热门文章

  1. 马斯克因何财报会议怒爆粗口?明明是史上最佳Q1业绩,股价还一度大涨10%
  2. 马斯克的中国救星,特斯拉上海工厂内部首度曝光,数百台机器人维持疫情期间生产...
  3. AI到底如何改变教育?好未来重金押注AI的背后逻辑
  4. spring-boot启动源码学习-1
  5. iptables规则备份和恢复,任务计划chkconfig工具systemd管理服务
  6. 读书笔记之MySQL技术内幕
  7. 创建topic验证kafka集群
  8. Sahi (2) —— https/SSL配置(102 Tutorial)
  9. [转]C#多线程学习(四) 多线程的自动管理(线程池)
  10. WinAPI: CreateDirectoryEx - 根据模版建立文件夹