win32(7)--文件操作

来源:互联网 发布:2017软件测评师真题 编辑:程序博客网 时间:2024/06/02 04:04

一、创建/打开文件、读文件、写文件及文件大小获取和文件偏移:CreateFile、ReadFile、WriteFile、GetFileSize、SetFilePointer。

CreateFile:创建/打开文件

HANDLE WINAPI CreateFile( //返回值是句柄,错误返回INVALID_HANDLE_VALUE(-1)

_In_ LPCWSTR lpFileName, //文件名

_In_ DWORD dwDesiredAccess,//访问文件想要获取的权限,多权限用“|”相连:GENERIC_READ(读权限)、GENERIC_WRITE(写的权限)、GENERIC_EXECUTE(执行权限)、GENERIC_ALL(所有)

_In_ DWORD dwShareMode,//共享模式,0(不共享),FILE_SHARE_READ(共享读)、FILE_SHARE_WRITE(共享写)

_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,//安全属性,默认NULL

_In_ DWORD dwCreationDisposition,//文件不存在的时候的创建选项,见下面

_In_ DWORD dwFlagsAndAttributes,//文件的属性,FILE_ATTRIBUTE_NORMAL(默认属性)、

FILE_ATTRIBUTE_READONLY(只读文件)、FILE_ATTRIBUTE_HIDDEN(隐藏文件)等等。

_In_opt_ HANDLE hTemplateFile //NULL

);

参数:dwCreationDisposition文件不存在的时候的创建选项,类似fopen的r w 等。

  • CREATE_ALWAYS:总是创建,不存在则创建,存在则覆盖,原文件内容丢失;
  • OPEN_EXISTING:文件一定要存在,否则失败
  • CREATE_NEW:不存在则创建,存在则不创建并返回失败
  • OPEN_ALWAYS:如果存在则打开文件,不存在则创建文件
  • TRUNCATE_EXISTING:如果存在则打开文件并清空文件内容,至少要求GENERIC_WRITE权限,不存在则返回失败;

 

ReadFile:读文件(从当前文件位置开始读取)

BOOL WINAPI ReadFile( //返回0失败,非0成功,若实际读取字节数=0也是没读到内容

_In_ HANDLE hFile, //文件的句柄

_Out_writes_bytes_to_opt_(nNumberOfBytesToRead, *lpNumberOfBytesRead) __out_data_source(FILE) LPVOID lpBuffer,//数据缓冲区

_In_ DWORD nNumberOfBytesToRead, //预计的读取字节数

_Out_opt_ LPDWORD lpNumberOfBytesRead, //实际的读取字节数,是指针

_Inout_opt_ LPOVERLAPPED lpOverlapped); //设置为NULL

 

WriteFile:写文件(从当前的文件位置开始写)

BOOL WINAPI WriteFile(//返回0失败,非0成功

_In_ HANDLE hFile, //文件句柄

_In_reads_bytes_opt_(nNumberOfBytesToWrite) LPCVOID lpBuffer,//数据缓冲区

_In_ DWORD nNumberOfBytesToWrite,//预计写入的字节数

_Out_opt_ LPDWORD lpNumberOfBytesWritten,//实际写入字节数,指针

_Inout_opt_ LPOVERLAPPED lpOverlapped);//设置为NULL

 

GetFileSize:获取文件大小

DWORD WINAPI GetFileSize( //返回值,文件大小的低32位

_In_ HANDLE hFile, //文件句柄

_Out_opt_ LPDWORD lpFileSizeHigh);//文件大小的高32位,指针

 

SetFilePointer:设置文件的当前位置指针

DWORD WINAPI SetFilePointer(

_In_ HANDLE hFile, //文件句柄

_In_ LONG lDistanceToMove, //需要位移的值,long类型

_Inout_opt_ PLONG lpDistanceToMoveHigh, //当前文件位置的高32位

_In_ DWORD dwMoveMethod);//偏移的相对位置:FILE_BEGIN(0)、FILE_CURRENT(1)、FILE_END(2)

返回值:失败返回 INVALID_SET_FILE_POINTER(-1),成功返回当前文件指针位置的低32位,当前文件位置指针的高32位存放在lpDistanceToMoveHigh参数中。

 

BOOL WINAPI SetFilePointerEx( //需要位移值大于4字节。(超过-21亿~21亿的范围)

_In_ HANDLE hFile,

_In_ LARGE_INTEGER liDistanceToMove, //一个结构体,8字节长度

_Out_opt_ PLARGE_INTEGER lpNewFilePointer,

_In_ DWORD dwMoveMethod);

 

CloseHandle:关闭文件

CloseHandle(文件句柄)。

二、文件的复制、删除、移动。CopyFile(CopyFileEx)、DeleteFile、MoveFile(MoveFileWithProgress)。

 

CopyFile:复制文件

BOOL WINAPI CopyFileW( //返回非0成功,0失败

_In_ LPCWSTR lpExistingFileName, //源文件

_In_ LPCWSTR lpNewFileName, //目标文件

_In_ BOOL bFailIfExists ); //目标文件存在的情况下,TRUE则不覆盖目标文件,函数返回失败;FALSE则直接覆盖目标文件,函数返回成功。

 

CopyFileEx:带回调函数的文件复制函数

BOOL WINAPI CopyFileExW(

_In_        LPCWSTR lpExistingFileName, //源文件名

_In_        LPCWSTR lpNewFileName, //目标文件名

_In_opt_    LPPROGRESS_ROUTINE lpProgressRoutine, //指向一个回调函数的指针,回调函数用于接收复制进度等信息

_In_opt_    LPVOID lpData, //要传给回调函数的参数数据指针

_When_(pbCancel != NULL, _Pre_satisfies_(*pbCancel == FALSE))

_Inout_opt_ LPBOOL pbCancel,//如果此标志设置为 TRUE 时复制操作,则取消此操作。否则,复制操作将继续完成。

_In_        DWORD dwCopyFlags); //标志:COPY_FILE_FAIL_IF_EXISTS(如果目标文件已存在,复制操作失败)、COPY_FILE_NO_BUFFERING(使用无缓冲的 I/O,绕过系统 I/O 缓存资源执行复制操作。推荐用于非常大的文件传输。)等等。

回调函数:

Typedef DWORD (WINAPI *LPPROGRESS_ROUTINE)(

_In_     LARGE_INTEGER TotalFileSize, //文件字节数

_In_     LARGE_INTEGER TotalBytesTransferred, //复制开始后,复制的字节总数。

_In_     LARGE_INTEGER StreamSize, //以字节为单位,当前的文件流的总大小

_In_     LARGE_INTEGER StreamBytesTransferred,/当前流中的字节数,复制操作开始以来,已从源文件移交到目标文件的总数

_In_     DWORD dwStreamNumber,//当前流的句柄。第一次调用 CopyProgressRoutine 时,流编号是 1。

_In_     DWORD dwCallbackReason,//CALLBACK_CHUNK_FINISHED:数据文件的另一部分被复制。CALLBACK_STREAM_SWITCH:另一个流被创造并且将被复制。这是给出了第一次调用回调例程时的回调原因。

_In_     HANDLE hSourceFile,//源文件的句柄

_In_     HANDLE hDestinationFile,//目标文件的句柄

_In_opt_ LPVOID lpData); //CopyFileEx等函数传递的参数

 

DeleteFile:删除文件

BOOL WINAPI DeleteFileW( //返回非0成功,0失败

_In_ LPCWSTR lpFileName); //删除的文件名

MoveFile:移动文件

BOOL WINAPI MoveFileW( //返回非0成功,0失败

_In_ LPCWSTR lpExistingFileName, //源文件名

_In_ LPCWSTR lpNewFileName); //目标文件名

注意:不支持跨卷移动文件,可以使用CopyFile,然后DeleteFile来实现该功能。

 

MoveFileWithProgress:带回调函数的文件移动

BOOL WINAPI MoveFileWithProgressW(

_In_     LPCWSTR lpExistingFileName,//源文件名

_In_opt_ LPCWSTR lpNewFileName,//目标文件名

_In_opt_ LPPROGRESS_ROUTINE lpProgressRoutine,//回调函数,类似CopyFileEx

_In_opt_ LPVOID lpData,//回调函数的参数指针

_In_     DWORD dwFlags );

dwFlags:标志:(红色为常用的)

MOVEFILE_COPY_ALLOWED:如果文件移动到不同的卷,函数通过使用 CopyFile 和 DeleteFile 函数来模拟这一举动。如果该文件成功复制到一个不同的卷但原始文件不能被删除时,此函数成功留下的源文件。使用此值不能同时用MOVEFILE_DELAY_UNTIL_REBOOT。

MOVEFILE_DELAY_UNTIL_REBOOT:系统并不移动文件,直到重新启动操作系统。立即执行 AUTOCHK 后,但在创建任何分页文件之前,系统将该文件移动。因此,此参数启用的功能从先前启动删除分页文件。如果过程是在用户属于管理员组或本地系统帐户的上下文中,仅可以使用此值。此值不能同时用 MOVEFILE_COPY_ALLOWED。

MOVEFILE_REPLACE_EXISTING:如果文件命名 lpNewFileName 存在,函数将其内容覆盖为lpExistingFileName 文件的内容。如果 lpNewFileName 或 lpExistingFileName 是目录,不能使用此值。

MOVEFILE_WRITE_THROUGH:函数不返回直到文件实际上已经在磁盘上。设置此值保证移动执行如拷贝和删除的操作刷新到磁盘之前,该函数才返回。如果设置MOVEFILE_DELAY_UNTIL_REBOOT 此值没有任何作用。

 

三、文件是否存在、获取文件属性、设置文件属性:PathFileExists、GetFileAttributesSetFileAttributes

 

PathFileExists(文件名),返回非0文件存在,返回0文件不存在。需要头文件(Shlwapi.h)。

 

DWORD WINAPI GetFileAttributesW( _In_ LPCWSTR lpFileName); //成功返回文件属性,失败返回INVALID_FILE_ATTRIBUTES

 

BOOL WINAPI SetFileAttributesW( _In_ LPCWSTR lpFileName,

_In_ DWORD dwFileAttributes  ); //需要设置的文件属性

恒/值描述
FILE_ATTRIBUTE_ARCHIVE
32 (0x20)

一个文件或目录的归档文件或目录。应用程序通常使用此属性标记为备份或删除的文件。 

FILE_ATTRIBUTE_COMPRESSED
2048 (0x800)

被压缩的文件或目录。对于文件,所有文件中的数据被压缩。对于目录,压缩是新创建的文件和子目录的默认。

FILE_ATTRIBUTE_DEVICE
64 (0x40)

此值保留供系统使用。

FILE_ATTRIBUTE_DIRECTORY
16 (0x10)

标识目录的句柄。

FILE_ATTRIBUTE_ENCRYPTED
16384(0 x4000)

加密的文件或目录。 为一个文件,文件中的所有数据流加密。 对于一个 目录中,加密是默认为新创建的文件和子目录。

FILE_ATTRIBUTE_HIDDEN
2(0 x2)

文件或目录是隐藏的。 它不包括在一个普通的目录清单。

FILE_ATTRIBUTE_INTEGRITY_STREAM
32768(0 x8000)

目录或用户数据流配置完整性(仅支持在参考文献卷)。 它不是 包含在一个普通的目录清单。 完整性设置坚持如果是重命名的文件。 如果一个 文件复制目标文件必须完整集如果源文件或目标目录 有完整性。

Windows Server 2008 R2,Windows 7,Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: 这个标志不支持到Windows Server 2012。

FILE_ATTRIBUTE_NORMAL
128(0 x80)

一套文件,没有其他属性,这个属性是有效的只有当单独使用。

FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
8192 (0x2000)

文件或目录不被索引的内容索引服务。

ps:机翻…


四、文件夹操作:目录是否存在、目录是否空目录、创建文件夹、删除空文件夹。PathIsDirectory、PathIsDirectoryEmpty、CreateDirectory、RemoveDirectory。

 

判断目录是否存在PathIsDirectory(目录名称字符串):是目录返回TRUE,不是返回FALSE。需要头文件(Shlwapi.h)。

判断目录是否为空目录PathIsDirectoryEmpty(目录名称字符串):是空目录返回TRUE,不是空返回FALSE。需要头文件(Shlwapi.h)。

 

CreateDirectory:创建文件夹

BOOL WINAPI CreateDirectoryW(

_In_ LPCWSTR lpPathName, //文件夹名称

_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes);//安全属性,默认值NULL

 

 

RemoveDirectory: 删除文件夹

BOOL WINAPI RemoveDirectoryW( _In_ LPCWSTR lpPathName );

 

五、文件和文件夹查找。FindFirstFile、FindNextFileFindClose

 

WIN32_FIND_DATAW结构体

typedef struct _WIN32_FIND_DATAW {

DWORD dwFileAttributes; //文件属性,如FILE_ATTRIBUTE_DIRECTORY表示文件夹

FILETIME ftCreationTime; //文件创建时间

FILETIME ftLastAccessTime; //最后访问时间

FILETIME ftLastWriteTime; //最后修改时间

DWORD nFileSizeHigh; //文件大小高32位

DWORD nFileSizeLow;  //文件大小低32位

DWORD dwReserved0; //保留字

DWORD dwReserved1; //保留字

_Field_z_ WCHAR  cFileName[ MAX_PATH ]; //文件名

_Field_z_ WCHAR  cAlternateFileName[ 14 ]; //文件的替代名称

} WIN32_FIND_DATAW, *PWIN32_FIND_DATAW, *LPWIN32_FIND_DATAW;

 

FindFirstFile:查找第1个文件或文件夹

HANDLE WINAPI FindFirstFileW(

_In_ LPCWSTR lpFileName, //文件名,可以是 *.*啥的

_Out_ LPWIN32_FIND_DATAW lpFindFileData ); //结构体指针

返回值:失败返回INVALID_HANDLE_VALUE(-1),成功返回文件句柄

 

FindNextFile:查找下一个文件或文件夹

BOOL WINAPI FindNextFileW(//找到返回非0,失败返回0

_In_ HANDLE hFindFile, //FindFirstFile返回的文件句柄

_Out_ LPWIN32_FIND_DATAW lpFindFileData ); //结构体指针

 

FindClose:关闭查找

BOOL WINAPI FindClose(_Inout_ HANDLE hFindFile);//FindFirstFile返回的文件句柄

六、获取当前目录、获取windows目录、获取system目录、获取temp目录。

获取当前目录:

TCHAR buf[MAX_PATH] = { 0 };

GetCurrentDirectory(MAX_PATH-1, buf);

得到windows目录

GetWindowsDirectory(buf, MAX_PATH-1);

得到system目录

GetSystemDirectory(buf, MAX_PATH-1);

得到temp目录

GetTempPath(MAX_PATH-1, buf);


原创粉丝点击