您的位置:首页 > 其它

Windows文件操作

2016-01-26 13:38 211 查看
读写文件

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: