`
mywebcode
  • 浏览: 998121 次
文章分类
社区版块
存档分类
最新评论

Chapter10-“I/O设备的同步和异步”之文件操作相关

 
阅读更多

  • 获取文件的逻辑大小——GetFileSizeEx函数
    函数原型:
    BOOL WINAPI GetFileSizeEx(
    						__in  HANDLE hFile,
    						__out  PLARGE_INTEGER lpFileSize );
    GetFileSizeEx函数的第一个参数就不多说了,hFile就是CreateFile函数返回的句柄;
    第二个参数lpFileSize是一个指向64bit union的指针.


  • 获取文件的物理大小——GetCompressedFileSize函数
    函数原型:
    DWORD WINAPI GetCompressedFileSize(
                                        __in  LPCTSTR lpFileName,
                                        __out_opt  LPDWORD lpFileSizeHigh );
    该函数的第一个参数lpFileName,注意与GetFileSizeEx函数的差别,GetFileSizeEx的第一个参数是句柄hFile,而该函数的第一个参数是文件名lpFileName;
    第二个参数lpFileSizeHigh,由于文件大小是有64bit来记录的,其中32bit的高位记录在lpFileSizeHigh指向的内容中,而32bit的低位作为函数值返回。

    //一个简单示例:
    ULARGE_INTEGER ulFileSize; 
    ulFileSize.LowPart = GetCompressedFileSize(TEXT("SomeFile.dat"),
    							&ulFileSize.HighPart);
    // 64-bit file size is now in ulFileSize.QuadPart

    同时注意区分GetFileSizeEx获取的逻辑大小和GetCompressedFileSize获取的物理大小,例如一个100KB的文件经过压缩后只占用85KB。调用GetFileSizeEx函数返回的是文件的逻辑大小,即100KB;而调用GetCompressedFileSize函数则返回的是文件占用磁盘的物理大小,即85KB。

    每次用CreateFile文件时,都有一个与文件句柄对应的文件指针,在调用ReadFile和WriteFile之后,文件指针都会前移到相应的位置。

    //示例1
    BYTE pb[10];
    DWORD dwNumBytes;
    HANDLE hFile = CreateFile(TEXT("MyFile.dat"), ...); // 文件指针初始化时是0
    ReadFile(hFile, pb, 10, &dwNumBytes, NULL); // 读取0-9字节
    ReadFile(hFile, pb, 10, &dwNumBytes, NULL); // 读取10-19字节
    
    //示例2
    BYTE pb[10];
    DWORD dwNumBytes;
    HANDLE hFile1 = CreateFile(TEXT("MyFile.dat"), ...); // 文件指针初始化时是0
    HANDLE hFile2 = CreateFile(TEXT("MyFile.dat"), ...); // 文件指针初始化时是0
    //由于每个对象有自己的文件指针,所有两次读取的数据都是0-9字节。
    ReadFile(hFile1, pb, 10, &dwNumBytes, NULL); // 读取0-9字节
    ReadFile(hFile2, pb, 10, &dwNumBytes, NULL); // 读取0-9字节
    
    //示例3
    BYTE pb[10];
    DWORD dwNumBytes;
    HANDLE hFile1 = CreateFile(TEXT("MyFile.dat"), ...); // Pointer set to 0
    HANDLE hFile2;
    //调用DuplicateHandle函数后,hFile1,hFile2共享同一个内核对象,
    //所有无论是用hFile1作为参数还是hFile2,文件指针都会前移的。
    DuplicateHandle(
    				GetCurrentProcess(), hFile1,
    				GetCurrentProcess(), &hFile2,
    				0, FALSE, DUPLICATE_SAME_ACCESS);
    ReadFile(hFile1, pb, 10, &dwNumBytes, NULL); // Reads bytes 0 - 9
    ReadFile(hFile2, pb, 10, &dwNumBytes, NULL); // Reads bytes 10 - 19

  • 文件指针定位函数——SetFilePointerEx函数
    函数原型:
    BOOL WINAPI SetFilePointerEx(
    							__in HANDLE hFile,
    							__in LARGE_INTEGER liDistanceToMove,
    							__out_opt  PLARGE_INTEGER lpNewFilePointer,
    							__in DWORD dwMoveMethod );
    第一个参数hFile就是文件句柄;
    第二个参数liDistanceToMove是移动距离,如果是负数,则表示指针后退,正数则表示指针前移;
    第三个参数lpNewFilePointer,在函数返回时它标示的是文件指针之前的位置。
    第四个参数dwMoveMethod,指定了文件开始移动时文件位置,

Value

Meaning

FILE_BEGIN

0

The starting point is zero or the beginning of the file. If this flag is specified, then theliDistanceToMove parameter is interpreted as an unsigned value.

FILE_CURRENT

1

The start point is the current value of the file pointer.

FILE_END

2

The starting point is the current end-of-file position.

  • 设置文件尾函数——SetEndofFile函数
    SetEndofFile
    函数将当前文件指针所在位置设置为文件尾部,用法简单。



  • 示例:
    int testFile()
    {
    	HANDLE h = CreateFile(TEXT("test.txt"), GENERIC_WRITE,  0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    	if (INVALID_HANDLE_VALUE == h)  
    	{  
    		cout<<"打开文件失败!"<<endl;
    		return -1;
    	}  
    	else  
    	{  
    		LARGE_INTEGER fileSize;
    		TCHAR str[]=TEXT("fuck you");  
    		SetFilePointer(h, 0, NULL, FILE_END);
    		DWORD dwLenWritten;
    		for(int i = 0; i < 4; ++i)
    			WriteFile(h, str, sizeof(str), &dwLenWritten, NULL);
    		GetFileSizeEx(h, &fileSize);
    		cout<<fileSize.QuadPart<<endl;
    		CloseHandle(h); 
    	}
    
    	return 0;  
    }


分享到:
评论

相关推荐

    Parallel I/O for Cluster Computing

    Parallel I/O for Cluster Computing Foreword Introduction Part One - Cluster Computing and I/Os Chapter 1 - Motivating I/O Problems and their Solutions Chapter 2 - Parallel Sorting on ...

    MPEG-4/H.264视频编解码工程实践源码chapter2-chapter10

    Mpeg-4/H.264视频编解码工程实践源码chapter2-chapter10,供大家一次性下载全。

    Developing Drivers with the Microsoft Windows Driver Foundation

    Chapter 8 - I/O Flow and Dispatching Chapter 9 - I/O Targets Chapter 10 - Synchronization Chapter 11 - Driver Tracing and Diagnosability Chapter 12 - WDF Support Objects Chapter 13 - UMDF ...

    《MPEG-4/H.264视频编解码工程实践》的配套光盘代码10

    MPEG-4/H.264视频编解码工程实践》的配套光盘代码10:chapter10

    Foundations of Python Network Programming(3rd).pdf 0分

    Chapter 1: Introduction to Client-Server Networking Chapter 2: UDP Chapter 3: TCP Chapter 4: Socket Names and DNS Chapter 5: Network Data and Network Errors Chapter 6: TLS/SSL Chapter 7: Server ...

    Chapter10-《Ext JS高级程序设计》源代码.rar

    Chapter10-《Ext JS高级程序设计》源代码.rar Chapter9-《Ext JS高级程序设计》源代码.rar Chapter11-《Ext JS高级程序设计》源代码.rar Chapter13-《Ext JS高级程序设计》源代码.rar Chapter14-《Ext JS高级程序...

    IIS 6: The Complete Reference

    Chapter 10 - Encryption Chapter 11 - Logging Part III - IIS Programming Chapter 12 - ASP Programming Chapter 13 - COM Web Programming Chapter 14 - ASP.NET Web Forms Chapter 15 - ASP.NET ...

    machine-learning-101:与机器学习数据集相关的存储库

    与用于机器学习的数据集相关的存储库。 链接到教程博客: : 第1章 关于朴素贝叶斯的理论 编码示例: : 第2章 支持向量机 理论: : 编码: : 第3章 决策树分类器 理论: : 编码: : //medium....

    Painless Docker

    Chapter I - Introduction To Docker & Containers Chapter II - Installation & Configuration Chapter III - Basic Concepts Chapter IV - Advanced Concepts Chapter V - Working With Docker Images Chapter VI ...

    课后练习题-chapter10-14.doc

    课后练习题-chapter10-14.doc

    spring boot 全面的样例代码

    - chapter1:[基本项目构建(可作为工程脚手架),引入web模块,完成一个简单的RESTful API](http://blog.didispace.com/spring-boot-learning-1/) - [使用Intellij中的Spring Initializr来快速构建Spring Boot/...

    VC专题教程

    --- 4.3 线程控制 ------ 4.4 进程/线程间同步 +------ 4.5 进程间通信 +-- 第五章 文件操作 打包下载 +------ 5.1 磁盘文件的打开与关闭 +------ 5.2 磁盘文件的正常读写与异步读写 +------ 5.3 磁盘文件的查找 +--...

    Chapter3-《Ext JS高级程序设计》源代码

    Chapter10-《Ext JS高级程序设计》源代码.rar Chapter9-《Ext JS高级程序设计》源代码.rar Chapter11-《Ext JS高级程序设计》源代码.rar Chapter13-《Ext JS高级程序设计》源代码.rar Chapter14-《Ext JS高级程序...

    Chapter13-《Ext JS高级程序设计》源代码.rar

    Chapter10-《Ext JS高级程序设计》源代码.rar Chapter9-《Ext JS高级程序设计》源代码.rar Chapter11-《Ext JS高级程序设计》源代码.rar Chapter13-《Ext JS高级程序设计》源代码.rar Chapter14-《Ext JS高级程序...

    Chapter9-《Ext JS高级程序设计》源代码.rar

    Chapter10-《Ext JS高级程序设计》源代码.rar Chapter9-《Ext JS高级程序设计》源代码.rar Chapter11-《Ext JS高级程序设计》源代码.rar Chapter13-《Ext JS高级程序设计》源代码.rar Chapter14-《Ext JS高级程序...

    Chapter7-《Ext JS高级程序设计》源代码.rar

    Chapter10-《Ext JS高级程序设计》源代码.rar Chapter9-《Ext JS高级程序设计》源代码.rar Chapter11-《Ext JS高级程序设计》源代码.rar Chapter13-《Ext JS高级程序设计》源代码.rar Chapter14-《Ext JS高级程序...

    Chapter11-《Ext JS高级程序设计》源代码.rar

    Chapter10-《Ext JS高级程序设计》源代码.rar Chapter9-《Ext JS高级程序设计》源代码.rar Chapter11-《Ext JS高级程序设计》源代码.rar Chapter13-《Ext JS高级程序设计》源代码.rar Chapter14-《Ext JS高级程序...

    Chapter8-《Ext JS高级程序设计》源代码.rar

    Chapter10-《Ext JS高级程序设计》源代码.rar Chapter9-《Ext JS高级程序设计》源代码.rar Chapter11-《Ext JS高级程序设计》源代码.rar Chapter13-《Ext JS高级程序设计》源代码.rar Chapter14-《Ext JS高级程序...

    Chapter6-《Ext JS高级程序设计》源代码.rar

    Chapter10-《Ext JS高级程序设计》源代码.rar Chapter9-《Ext JS高级程序设计》源代码.rar Chapter11-《Ext JS高级程序设计》源代码.rar Chapter13-《Ext JS高级程序设计》源代码.rar Chapter14-《Ext JS高级程序...

Global site tag (gtag.js) - Google Analytics