Windows文件操作
2016-01-26 13:38
211 查看
读写文件
lpFileName:指向一个以0结尾的字符串,该字符串表示要创建和打开对象的名称(对文件来说既为文件名)
dwDesiredAccess:表示要访问对象的类型,可以是GENERIC_READ
GENERIC_WRITE或两者的组合,表示需要读取文件、写文件、读写文件
dwSharedMode:共享方式,表示文件被打开后是否允许其他进程以某种方式再次打开文件,可以是使用下列一些取值或者组合:
0———不允许文件再被打开
FILE_SHARE_DELETE——允许其他进程同时对文件进行删除
FILE_SHARE_READ——允许其他进程同时以读的方式打开文件
FILE_SHARE_WRITE——允许其他进程同时以写的的方式打开文件
lpSecurityAttributes:安全属性,指定返回的文件句柄是否可以被子进程继承,如果参数设置为NULL,则表明无法继承,否则需要将参数指向一个SECURITY_ATTRIBUTES结构。
dwCreationDisposition:表明当文件存在或者不存在的情况下,程序采取的行为,可以是下面值:
CREATE_NEW——创建新文件,如果文件已经存在,函数返回失败
CREATE_ALWAYS——创建新文件,如果文件已经存在则清除原文件
OPEN_EXISTING——打开存在的文件,当文件不存在时,函数会返回失败
OPEN_ALWAYS——如果文件已经存在,则打开,不存在则创建新文件
TRUNCATE_EXISTING——打开文件并将文件截断为0,当文件不存在时返回失败
dwFlagsAndAttributes:指定新建文件的属性以及对文件操作的方式,文件属性可以是下面值的组合
FILE_ATTRIBUTE_NORMAL——普通文件,设置这个属性时,其他属性都不会生效
FILE_ATTRIBUTE_ARCHIVE——设置归档属性
FILE_ATTRIBUTE_HIDDEN——设置隐藏属性
FILE_ATTRIBUTE_READONLY——设置只读属性
FILE_ATTRIBUTE_SYSTEM——设置系统属性
FILE_ATTRIBUTE_TEMPORARY——临时文件,系统会尽量把所有的文件内容保存在内存中加以快速存取读取,程序在不再使用文件的时候需要尽快将它删除
文件操作方式有
FILE_FLAG_WRITE_THROUGH——使用WriteThrough模式,系统不会对文件使用缓存,文件的改变会立刻写入磁盘中
FILE_FLAG_OVERLAPPED——使用异步方式操作文件
FILE_FLAG_DELETE_ON_CLOSE——文件被关闭后立即被操作系统删除
FILE_FLAG_RANDOM_ACCESS——对文件进行随机读写操作(操作系统对该文件的缓冲进行优化)
hTemplateFile:指定了一个文件模板的句柄,该模板的所有属性都会被复制到当前创建的文件中,一般建议设置为NULL
返回值:当打开或者创建文件成功的时候,函数返回一个文件句柄,失败的话,函数的返回值是INVALID_HANDLE_VALUE(注意这个值是-1不是NULL)
使用ReadFile/WriteFile函数来进行读写功能
BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD
nNumberOfBytesToRead, LPWORD lpNumberOfBytesRead,
LPOVERLAPPEND lpOverlapped)
hFile:文件句柄
lpBuffer:一个缓冲区指针,函数会将读出的数据放到这里
nNumberOfBytesToRead:指定需要读入的字节数
lpNumberOfBytesRead:由于函数并不是每次都能读出nNumberOfBytesToRead个字节数,这个参数指向一个dword类型的变量,函数在这里返回实际读入的字节数。
lpOverlapped:指向一个OVERLAPPEND结构,供函数在异步读取文件时使用,在同步读写中这个参数设置为NULL
如果读取文件失败,函数返回0,成功返回非0值,当函数返回非0并且lpNumberOfBytesRead中返回的已读取字节数为0时,表示已经读到文件尾。
向文件中写数据使用WriteFile函数,其参数和ReadFile相同。当使用WriteFile写文件的时候,写入的数据可能被windows暂时保存在内部的高级缓存中,而不是写到磁盘中,如果文件关闭之前计算机突然断电了,那么写入的数据有可能会丢失,所以有时需要保证数据已经写入磁盘中,可以使用FlushFileBuffers函数,这个函数的参数只有一个文件句柄。
Windows为每个打开的文件都会维护一个文件指针,指定在文件中下一个读操作或写操作在什么位置进行,当文件刚被打开的时候,文件指针处于文件的头部
有时候我们需要调整文件指针的位置,这个时候需要使用SetFilePointer函数
DWORD SetFilePointer(HANDLE hFile, LONG IDistanceToMove,
PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod);
hFile:文件句柄
IDistanceToMove:要移动的距离
lpDistanceToMoveHigh:指向一个32位的变量,变量存放移动距离的高32位,这个值和IdistanceToMove一起组成一个64位的距离。在80X86平台上这个值为NULL
dwMoveMethod:移动的模式,也就是指明从什么地方开始移动,可以为FILE_BEGIN、FILE_CURRENT、FILE_END
Windows并没有为我们提供一个GetFilePointer的函数来获取当前文件的指针,我们可以像下面这么来完成这个功能
SetFilePointer ( hFile, 0, NULL, FILE_CURRENT );
最后,关闭文件使用CloseHandle函数,同样只需要传入一个文件句柄
文件属性
DWORD GetFileType (HANDLE hFile)
这个函数用来获取文件的类型,这个类型实际是指传入的文件句柄对应的是什么对象,返回值可以是FILE_TYPE_UNKNOW:未知,FILE_TYPE_DISK:磁盘文件,FILE_TYPE_CHAR:字符设备,FILE_TYPE_PIPE:管道
DWORD GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
第二个参数是用来接收文件长度的指针
BOOL GetFileTime(HANDLE hFile, LPFILETIME lpCreationTime,
LPFILETIME lpLastAccessTime , LPFILETIME lpLastWriteTime)
文件的时间包括三种时间:创建时间、修改时间、访问时间。需要注意的是:参数是一个FILETIME结构体的指针,一般需要使用FileTimeToSystemTime函数来把FILETIME结构体转换成SYSTEMTIME结构。与这个函数相对应的,使用SetFileTime函数来设置文件的时间。
DWORD GetFileAttributes(LPCTSTR lpFileName)
使用这个函数来获取文件的只读、隐藏等属性,注意的是这个函数使用文件名作为输入而不是使用文件句柄。我们根据返回值来判断,如只读文件的返回值为FILE_ATTRIBUTE_READONLY,隐藏的返回值为FILE_ATTRIBUTE_HIDDEN
其他文件操作
拷贝文件
CopyFile/CopyFileEx
BOOL CopyFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, BOOL bFaillfExists)
第一个参数指出源文件的文件名,第二个参数指示目的文件的文件名,第三个参数指定如果目的文件已经存在时所发生的动作,如果TRUE,则拷贝失败,否则,继续拷贝并覆盖原文件
移动文件
MoveFile/MoveFileEx
BOOL MoveFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName)
删除文件
BOOL DeleteFile(LPCTSTR lpFileName)
注意:不能对一个已经打开的文件进行删除,必须首先用CloseHandle函数关闭文件之后才能执行成功
查找文件
需要首先使用FindFirstFile函数,如果函数执行成功,返回一个句柄hFindFile,然后需要用这个句柄调用FindNextFile函数。一般查找文件的时候需要使用如下结构:
hFindFile = FindFirstFile(lpFileName, lpFindFileData);
if ( hFindFile != INVALID_HANDLE_VALUE )
{
do{
//处理找到的文件
}while( FindNextFile ( hFindFile, lpFindFileData) )
}
其中lpFileName代表要查找的文件名,如果文件名中不包含路径,那么在当前的目录中查找,如果包含路径就在指定的路径中取查找,在文件名中可以使用或?通配符。比如.表示所有文件,.txt表示所有文件文件(.txt),a??.*表示所有开始字母是a并且文件长度为3的文件。lpFindFileData指向一个WIN32_FIND_DATA结构,结构包含了Windows查找过程中临时使用的数据和找到的文件名与文件属性等数据。其定义:
typedef struct_WIN32_FIND_DATA {
DWORD dwFileAttributes; //文件属性
FILETIME ftCreationTime; //文件创建时间
FILETIME ftLastAccessTime; //文件最后一次访问时间
FILETIME ftLastWriteTime; //文件最后一次修改时间
DWORD nFileSizeHigh; //文件长度高32位
DWORD nFileSizeLow; //文件长度低32位
DWORD dwReserved0; //系统保留
DWORD dwReserved1; //系统保留
TCHAR cFileName[MAX_PATH]; //长文件名
TCHAR cAlternateFileName[14]; //8.3格式文件名
}WIN32_FIND_DATA, *PWIN32_FIND_DATA
HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwSharedMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreateionDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
lpFileName:指向一个以0结尾的字符串,该字符串表示要创建和打开对象的名称(对文件来说既为文件名)
dwDesiredAccess:表示要访问对象的类型,可以是GENERIC_READ
GENERIC_WRITE或两者的组合,表示需要读取文件、写文件、读写文件
dwSharedMode:共享方式,表示文件被打开后是否允许其他进程以某种方式再次打开文件,可以是使用下列一些取值或者组合:
0———不允许文件再被打开
FILE_SHARE_DELETE——允许其他进程同时对文件进行删除
FILE_SHARE_READ——允许其他进程同时以读的方式打开文件
FILE_SHARE_WRITE——允许其他进程同时以写的的方式打开文件
lpSecurityAttributes:安全属性,指定返回的文件句柄是否可以被子进程继承,如果参数设置为NULL,则表明无法继承,否则需要将参数指向一个SECURITY_ATTRIBUTES结构。
dwCreationDisposition:表明当文件存在或者不存在的情况下,程序采取的行为,可以是下面值:
CREATE_NEW——创建新文件,如果文件已经存在,函数返回失败
CREATE_ALWAYS——创建新文件,如果文件已经存在则清除原文件
OPEN_EXISTING——打开存在的文件,当文件不存在时,函数会返回失败
OPEN_ALWAYS——如果文件已经存在,则打开,不存在则创建新文件
TRUNCATE_EXISTING——打开文件并将文件截断为0,当文件不存在时返回失败
dwFlagsAndAttributes:指定新建文件的属性以及对文件操作的方式,文件属性可以是下面值的组合
FILE_ATTRIBUTE_NORMAL——普通文件,设置这个属性时,其他属性都不会生效
FILE_ATTRIBUTE_ARCHIVE——设置归档属性
FILE_ATTRIBUTE_HIDDEN——设置隐藏属性
FILE_ATTRIBUTE_READONLY——设置只读属性
FILE_ATTRIBUTE_SYSTEM——设置系统属性
FILE_ATTRIBUTE_TEMPORARY——临时文件,系统会尽量把所有的文件内容保存在内存中加以快速存取读取,程序在不再使用文件的时候需要尽快将它删除
文件操作方式有
FILE_FLAG_WRITE_THROUGH——使用WriteThrough模式,系统不会对文件使用缓存,文件的改变会立刻写入磁盘中
FILE_FLAG_OVERLAPPED——使用异步方式操作文件
FILE_FLAG_DELETE_ON_CLOSE——文件被关闭后立即被操作系统删除
FILE_FLAG_RANDOM_ACCESS——对文件进行随机读写操作(操作系统对该文件的缓冲进行优化)
hTemplateFile:指定了一个文件模板的句柄,该模板的所有属性都会被复制到当前创建的文件中,一般建议设置为NULL
返回值:当打开或者创建文件成功的时候,函数返回一个文件句柄,失败的话,函数的返回值是INVALID_HANDLE_VALUE(注意这个值是-1不是NULL)
使用ReadFile/WriteFile函数来进行读写功能
BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD
nNumberOfBytesToRead, LPWORD lpNumberOfBytesRead,
LPOVERLAPPEND lpOverlapped)
hFile:文件句柄
lpBuffer:一个缓冲区指针,函数会将读出的数据放到这里
nNumberOfBytesToRead:指定需要读入的字节数
lpNumberOfBytesRead:由于函数并不是每次都能读出nNumberOfBytesToRead个字节数,这个参数指向一个dword类型的变量,函数在这里返回实际读入的字节数。
lpOverlapped:指向一个OVERLAPPEND结构,供函数在异步读取文件时使用,在同步读写中这个参数设置为NULL
如果读取文件失败,函数返回0,成功返回非0值,当函数返回非0并且lpNumberOfBytesRead中返回的已读取字节数为0时,表示已经读到文件尾。
向文件中写数据使用WriteFile函数,其参数和ReadFile相同。当使用WriteFile写文件的时候,写入的数据可能被windows暂时保存在内部的高级缓存中,而不是写到磁盘中,如果文件关闭之前计算机突然断电了,那么写入的数据有可能会丢失,所以有时需要保证数据已经写入磁盘中,可以使用FlushFileBuffers函数,这个函数的参数只有一个文件句柄。
Windows为每个打开的文件都会维护一个文件指针,指定在文件中下一个读操作或写操作在什么位置进行,当文件刚被打开的时候,文件指针处于文件的头部
有时候我们需要调整文件指针的位置,这个时候需要使用SetFilePointer函数
DWORD SetFilePointer(HANDLE hFile, LONG IDistanceToMove,
PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod);
hFile:文件句柄
IDistanceToMove:要移动的距离
lpDistanceToMoveHigh:指向一个32位的变量,变量存放移动距离的高32位,这个值和IdistanceToMove一起组成一个64位的距离。在80X86平台上这个值为NULL
dwMoveMethod:移动的模式,也就是指明从什么地方开始移动,可以为FILE_BEGIN、FILE_CURRENT、FILE_END
Windows并没有为我们提供一个GetFilePointer的函数来获取当前文件的指针,我们可以像下面这么来完成这个功能
SetFilePointer ( hFile, 0, NULL, FILE_CURRENT );
最后,关闭文件使用CloseHandle函数,同样只需要传入一个文件句柄
文件属性
DWORD GetFileType (HANDLE hFile)
这个函数用来获取文件的类型,这个类型实际是指传入的文件句柄对应的是什么对象,返回值可以是FILE_TYPE_UNKNOW:未知,FILE_TYPE_DISK:磁盘文件,FILE_TYPE_CHAR:字符设备,FILE_TYPE_PIPE:管道
DWORD GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
第二个参数是用来接收文件长度的指针
BOOL GetFileTime(HANDLE hFile, LPFILETIME lpCreationTime,
LPFILETIME lpLastAccessTime , LPFILETIME lpLastWriteTime)
文件的时间包括三种时间:创建时间、修改时间、访问时间。需要注意的是:参数是一个FILETIME结构体的指针,一般需要使用FileTimeToSystemTime函数来把FILETIME结构体转换成SYSTEMTIME结构。与这个函数相对应的,使用SetFileTime函数来设置文件的时间。
DWORD GetFileAttributes(LPCTSTR lpFileName)
使用这个函数来获取文件的只读、隐藏等属性,注意的是这个函数使用文件名作为输入而不是使用文件句柄。我们根据返回值来判断,如只读文件的返回值为FILE_ATTRIBUTE_READONLY,隐藏的返回值为FILE_ATTRIBUTE_HIDDEN
其他文件操作
拷贝文件
CopyFile/CopyFileEx
BOOL CopyFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, BOOL bFaillfExists)
第一个参数指出源文件的文件名,第二个参数指示目的文件的文件名,第三个参数指定如果目的文件已经存在时所发生的动作,如果TRUE,则拷贝失败,否则,继续拷贝并覆盖原文件
移动文件
MoveFile/MoveFileEx
BOOL MoveFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName)
删除文件
BOOL DeleteFile(LPCTSTR lpFileName)
注意:不能对一个已经打开的文件进行删除,必须首先用CloseHandle函数关闭文件之后才能执行成功
查找文件
需要首先使用FindFirstFile函数,如果函数执行成功,返回一个句柄hFindFile,然后需要用这个句柄调用FindNextFile函数。一般查找文件的时候需要使用如下结构:
hFindFile = FindFirstFile(lpFileName, lpFindFileData);
if ( hFindFile != INVALID_HANDLE_VALUE )
{
do{
//处理找到的文件
}while( FindNextFile ( hFindFile, lpFindFileData) )
}
其中lpFileName代表要查找的文件名,如果文件名中不包含路径,那么在当前的目录中查找,如果包含路径就在指定的路径中取查找,在文件名中可以使用或?通配符。比如.表示所有文件,.txt表示所有文件文件(.txt),a??.*表示所有开始字母是a并且文件长度为3的文件。lpFindFileData指向一个WIN32_FIND_DATA结构,结构包含了Windows查找过程中临时使用的数据和找到的文件名与文件属性等数据。其定义:
typedef struct_WIN32_FIND_DATA {
DWORD dwFileAttributes; //文件属性
FILETIME ftCreationTime; //文件创建时间
FILETIME ftLastAccessTime; //文件最后一次访问时间
FILETIME ftLastWriteTime; //文件最后一次修改时间
DWORD nFileSizeHigh; //文件长度高32位
DWORD nFileSizeLow; //文件长度低32位
DWORD dwReserved0; //系统保留
DWORD dwReserved1; //系统保留
TCHAR cFileName[MAX_PATH]; //长文件名
TCHAR cAlternateFileName[14]; //8.3格式文件名
}WIN32_FIND_DATA, *PWIN32_FIND_DATA
相关文章推荐
- sqoop-导入数据出现java.sql.SQLException: Streaming result set com.mysql.jdbc.
- root技术背后android手机内核提取及逆向分析
- 为什么有些人明明看起来友善,却总是独来独往?
- Java web 工作中遇到的一些问题
- linux(2)文件和目录管理(新增,删除,复制,移动,文件和目录权限,文件查找)
- [Leetcode]@python 77. Combinations
- mysql insert中文乱码无法插入ERROR 1366 (HY000): Incorrect string value
- STLINK和JLINK使用SWD四线调试下载STM32
- 【KVM2】xauth:(stdin):1:bad display name "xxx:1" in "add" command解决
- ssh隧道(跳板机/堡垒机)
- jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
- Linux内核的加密函数框架
- VPS选用
- 网站日志分析工具汇总
- 2016-01-26
- JavaScript定时调用函数(SetInterval与setTimeout)
- PHP编码规范/PSR-3
- 2016.1.26个人总结
- .net 签名加密实现的一种简单方法
- centos6.6,kvm安装配置详解,让你秒会kvm