1 BOOL GetFileSizeEx(
2 HANDLE hFile,
3 PLARGE_INTEGER lpFileSize
4 );
参数:lpFileSize: 输出参数,指向储存文件大小的一个 LARGE_INTEGER 联合体。
1 #if defined(MIDL_PASS)
2 typedef struct _LARGE_INTEGER {
3 #else // MIDL_PASS
4 typedef union _LARGE_INTEGER {
5 struct {
6 DWORD LowPart;
7 LONG HighPart;
8 } DUMMYSTRUCTNAME;
9 struct {
10 DWORD LowPart;
11 LONG HighPart;
12 } u;
13 #endif //MIDL_PASS
14 LONGLONG QuadPart;
15 } LARGE_INTEGER;
LARGE_INTEGER 大整数结构体的解析 头文件“WinNT.h”
定义如下
1 #if defined(MIDL_PASS)
2 typedef struct _LARGE_INTEGER {
3 #else // MIDL_PASS
4 typedef union _LARGE_INTEGER {
5 struct {
6 DWORD LowPart;
7 LONG HighPart;
8 } DUMMYSTRUCTNAME;
9 struct {
10 DWORD LowPart;
11 LONG HighPart;
12 } u;
13 #endif //MIDL_PASS
14 LONGLONG QuadPart;
15 } LARGE_INTEGER;
解释:根据预编译指令若定义宏 MIDL_PASS,则将 结构体命名为 LARGE_INTEGER,若未定义宏 MIDL_PASS,则将联合体命名为 LARGE_INTEGER。
实际上如果编译器具有内置支持64位整数,使用 QuadPart 成员中存储的64位整数。否则,使用 LowPart 和 HighPart 成员的存储的64位整数。
在不支持内置64位情况下,即,采用联合体结构。联合体有两部分组成,DUMMYSTRUCTNAME 和 u:因为联合的长度取决于最长的数据成员的长度,相当于成员公用内存。
①、在小端的情况下,因为低32位数字在前,高32位在后:
如果将这个64位大整数赋值 0x1234:
1 LARGE_INTEGER data;
2 data.LowPart = 0x34;
3 data.HighPart = 0x12;
②、在大端的情况下,高32位数字在前,低32位在后:
如果将这个64位大整数赋值 0x1234:
1 LARGE_INTEGER data;
2 data.u.LowPart = 0x34;
3 data.u.HighPart = 0x12;
8、WriteFile 函数
简介:
从文件指针指向的位置开始将数据写入到一个文件中, 且支持同步和异步操作。
如果文件打开方式没有指明 FILE_FLAG_OVERLAPPED,当程序调用成功时,它将实际写入文件的字节数保存到 lpNumberOfBytesWriten 指明的地址空间中。
如果文件要交互使用的话,当函数调用完毕时要记得调整文件指针。
声明:
1 BOOL WriteFile(
2 HANDLE hFile,
3 LPCVOID lpBuffer,
4 DWORD nNumberOfBytesToWrite,
5 LPDWORD lpNumberOfBytesWritten,
6 LPOVERLAPPED lpOverlapped
7 );
参数说明:
hFile:需要写入数据的已打开的文件句柄,这个句柄所关联的文件必须拥有 GENERIC_WRITE 访问权限属性的文件;
lpBuffer:要写入到文件的缓冲区首地址;
nNumberOfBytesToWrite:要写入数据的字节数量。如写入零字节,表示什么都不写入,但会更新文件的“上一次修改时间”;
lpNumberOfBytesWritten:实际写入文件的字节数量,此变量是用来返回的 ;
lpOverlapped:倘若在指定 FILE_FLAG_OVERLAPPED 标志的前提下打开文件,指针不能为空,这个参数就必须引用一个特殊的结构。那个结构定义了一次异步写操作。否则,该参数应置为空;
返回值:
函数执行成功,返回TRUE,否则返回FALSE,更多错误信息还请调用 GetLastError 获取错误码。
9、ReadFile 函数
简介:
从文件指针指向的位置开始将文件数据读入内存中, 且支持同步和异步操作。
如果文件打开方式没有指明 FILE_FLAG_OVERLAPPED 的话,当程序调用成功时,它将实际读出文件的字节数保存到 lpNumberOfBytesRead 指明的地址空间中。
从文件中读出数据,与 C语言的 fread函数相比,这个函数要灵活的多,适用的场景也很多。该函数能够操作通信设备、管道、套接字以及邮槽。
声明:
1 BOOL ReadFile (
2 HANDLE hFile,
3 LPVOID lpBuffer,
4 DWORD nNumberOfBytesToRead,
5 LPDWORD lpNumberOfBytesRead,
6 LPOVERLAPPED lpOverlapped
7 );
参数: hFile:需要读入数据的文件指针,这个指针指向的文件必须是 GENERIC_READ 访问属性的文件; lpBuffer:接收读入文件数据的缓冲区; nNumberOfBytesToRead:指定要读取的字节数; lpNumberOfBytesRead:指向一个DWORD类型变量的指针,用来接收实际读取的字节数(实际读取的字节数很可能比要读取的字节数小); lpOverlapped:OVERLAPPED 结构体指针,如果文件是以 FILE_FLAG_OVERLAPPED 方式打开的话,那么这个指针就不能为 NULL。FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作,或者说异步操作,以后会讲解到。
返回值: 函数调用成功,返回TRUE, 调用失败,返回FALSE,如果要获得更多的错误信息,请调用 GetLastError 函数。 |
10、SetFilePointer 函数
简介:
使用 SetFilePointer 函数设置文件当前的读写位置。
声明:
1 DWORD SetFilePointer(
2 HANDLE hFile,
3 LONG lDistanceToMove,
4 PLONG lpDistanceToMoveHigh,
5 DWORD dwMoveMethod
6 );
参数:
hFile:已打开的文件句柄,必须拥有 GENERIC_READ 或者 GENERIC_WRITE 访问权限;
lDistanceToMove:低32位的有符号的(有负有正)的值,指定要移动文件指针的字节数。如果lpDistanceToMoveHigh不为NULL,则lpDistanceToMoveHigh和lDistanceToMove将形成一个指定要移动的距离的单个64位有符号值。 如果lpDistanceToMoveHigh为NULL,则lDistanceToMove是一个32位有符号值。 lDistanceToMove的正值在文件中向前移动文件指针,负值则向后移动文件指针。
lpDistanceToMoveHigh:指向要移动的有符号64位距离的高32位。 如果你不需要高位的32位,这个指针必须设置为NULL。 当非NULL时,该参数还接收文件指针新值的高位DWORD。
dwMoveMethod:设置文件指针的移动起点的位置:FILE_BEGIN=>从文件头开始往后移动,FILE_CURRENT=>从文件的当前指针位置开始移动,FILE_END=>从文件尾部开始往前移动。
返回值:
如果SetFilePointer函数成功并且lpDistanceToMoveHigh为NULL,则返回值是新文件指针的低位DWORD。 如果lpDistanceToMoveHigh不为NULL,则函数返回新文件指针的低位DWORD,并将新文件指针的高位DWORD放入该参数指向的LONG中。
如果函数失败并且lpDistanceToMoveHigh为NULL,则返回值为INVALID_SET_FILE_POINTER。 要获得扩展的错误信息,请调用GetLastError。
如果函数失败,并且lpDistanceToMoveHigh非空,则返回值为INVALID_SET_FILE_POINTER。 但是,由于INVALID_SET_FILE_POINTER是新文件指针的低位DWORD的有效值,因此必须检查GetLastError以确定是否发生错误。 如果发生错误,GetLastError返回非NO_ERROR值。
如果新文件指针的值为负值,则函数失败,文件指针不移动,GetLastError返回的代码为ERROR_NEGATIVE_SEEK。
11、SetFilePointerEx 函数
简介:
使用 SetFilePointerEx 函数设置文件当前的读写位置。
声明:
1 BOOL SetFilePointerEx(
2 HANDLE hFile,
3 LARGE_INTEGER liDistanceToMove,
4 PLARGE_INTEGER pliNewFilePointer,
5 DWORD dwMoveMethod
6 );
参数:
hFile:已打开的文件句柄,必须拥有 GENERIC_READ 或者 GENERIC_WRITE 访问权限;
liDistanceToMove:标识文件指针要移动多少个字节;
pliNewFilePointer:系统会在pliNewFilePointer参数指向的 LARGE_INTEGER 结构体中保存文件指针的新值;
dwMoveMethod:标识移动文件指针的三种方式,FILE_BEGIN、FILE_CURRENT、FILE_END,解释详见:SetFilePointer 函数说明:https://www.cctry.com/thread-298383-1-1.html
返回值:
函数执行成功返回TRUE,函数执行失败返回FALSE,获得更多错误信息请调用:GetLastError
12、 CreateDirectory 函数
简介:
CreateDirectory 函数创建一个新的单一层级的目录。 如果底层文件系统支持文件和目录的安全性,则该函数将指定的安全描述符应用于新目录。
如需自动建立多层级目录请使用:MakeSureDirectoryPathExists 函数。
声明:
1 BOOL CreateDirectory(
2 LPCTSTR lpPathName,
3 LPSECURITY_ATTRIBUTES lpSecurityAttributes
4 );
参数:
lpPathName:指向一个以空字符结尾的字符串,指定要创建的目录的路径。
lpSecurityAttributes:指向SECURITY_ATTRIBUTES结构的指针。 该结构的lpSecurityDescriptor成员为新目录指定安全描述符。 如果lpSecurityAttributes为NULL,则该目录将获取默认的安全描述符。 目标文件系统必须支持文件和目录的安全性才能使此参数有效。
返回值:
如果函数成功,返回值为TRUE。
如果函数失败,返回值为FALSE。 要获得更多的错误信息,请调用GetLastError。
13、RemoveDirectory 函数
简介:
RemoveDirectory 函数删除一个现有的不包含任何文件的空目录。要删除非空目录请调用:SHFileOperation
声明:
1 BOOL RemoveDirectory(
2 LPCTSTR lpPathName
3 );
参数:
lpPathName:指向一个以空字符结尾的字符串,指定要删除的目录的路径。 路径必须指定一个空目录,并且调用进程必须具有对目录的删除访问权限。
返回值:
如果函数成功,返回值为TRUE。
如果函数失败,返回值为FALSE。 要获得更多的错误信息,请调用GetLastError。
14、FindFirstFile 函数
简介:
根据文件名查找文件。该函数到一个文件夹(包括子文件夹)去搜索指定文件,如果要使用附加属性去搜索文件的话 可以使用FindFirstFileEx函数。
声明:
1 HANDLE FindFirstFile(
2 LPCTSTR lpFileName,
3 LPWIN32_FIND_DATA lpFindFileData
4 );
参数:
lpFileName:要搜索的文件名,支持通配符:
C:\Windows\*.* //在C:\Windows目录中查找所有文件;
C:\Windows\System32\*.dll //在 C:\Windows\System32 目录中查找所有dll类型的文件;
C:\Windows\System.ini //在 C:\Windows 目录中查找 System.ini 文件;
C:\Windows\a???.* //在 C:\Windows 目录中查找所有以a开头的文件名长度为4个字符的文件;
Test.dat //在当前目录查找 Test.dat 文件
*.* //在当前目录查找所有文件
lpFindFileData:WIN32_FIND_DATA 类型,该结构用于装载与找到的文件有关的信息。该结构可用于后续的遍历与搜索。
结构 WIN32_FIND_DATA 的成员变量里包含了以上文件的各种属性:
结构的内容如下:
1 typedef struct _WIN32_FIND_DATA
2 {
3 DWORD dwFileAttributes; //文件属性
4 FILETIME ftCreationTime; //文件创建时间
5 FILETIME ftLastAccessTime; //文件最后一次访问时间
6 FILETIME ftLastWriteTime; //文件最后一次修改时间
7 DWORD nFileSizeHigh; //文件长度高32位
8 DWORD nFileSizeLow; //文件长度低32位
9 DWORD dwReserved0; //系统保留
10 DWORD dwReserved1; //系统保留
11 TCHAR cFileName[MAX_PATH]; //长文件名
12 TCHAR cAlternateFileName[14]; //8.3格式文件名
13 } WIN32_FIND_DATA, *PWIN32_FIND_DATA;
在使用这个结构时不能手工修改这个结构中的任何数据,结构对于开发人员来说只能作为一个只读数据,其所有的成员变量都会由系统完成填写。
返回值:
如果函数成功,返回一个 HANDLE 类型的文件搜索句柄,搜索/遍历完成后,应用 FindClose 函数关闭这个句柄;
如果函数失败,返回值为 INVALID_HANDLE_VALUE。 要获得更多的错误信息,请调用GetLastError。
15、FindNextFile 函数
简介:
可以用来遍历目录或文件,判断当前目录下是否有下一个目录或文件。
声明:
1 BOOL FindNextFile(
2 HANDLE hFindFile,
3 LPWIN32_FIND_DATA lpFindFileData
4 );
参数:
hFindFile:上一次查找返回的搜索文件句柄
lpFindFileData:WIN32_FIND_DATA 类型,该结构用于装载与找到的文件有关的信息。该结构可用于后续的遍历与搜索。
结构 WIN32_FIND_DATA 的成员变量里包含了以上文件的各种属性:
返回值:
如果函数成功,返回值为 TRUE;
如果函数失败,返回值为 FALSE,如果不再有与指定条件相符的文件,调用 GetLastError 会返回 ERROR_NO_MORE_FILES 错误码,要获得更多的错误信息,请调用GetLastError。