一.C-Runtime 函数
1. _tfopen函数。
一般用于客户端,只能独享打开的文件,不能以共享的方式打开。
FILE *fopen(
const char* filename,
const char* mode
);
FILE *_wfopen(
const wchar_t* filename,
const wchar_t* mode
);
说明:
filename:指定文件绝对路径名。
Mode:指定访问文件的类型
l “r” 读文件。如果文件不存在或者不能只找到,返回NULL指针。
l “w” 写文件。如果文件存在,覆盖掉所有的内容。如果不存在,创建之。
l “a” 添加数据。在文件末尾添加新的数据,如果文件不存在,创建之。EOF标记保持原来的位置。用MS-DOS Type命令的话,只能显示原来的数据,新添加的数据将不会显示出来。
l “r+” 打开文件,获得读写权限。文件必须存在。
l “w+” 打开文件,获得读写权限。如果文件存在,内容清空。不存在,创建之。
l “a+” 添加数据。和”a”一样添加数据,区别是”a+”会更新EOF标记的位置。Type命令可以显示去全部的数据。
注:以下标记可以和上面的组合来使用~~
l t 文本模式打开文件。
l b 二进制模式打开文件。
l c 启用委托模式。如果调用fflush,_flushall文件缓存的数据直接写入文件。
l n 重置委托模式,即还原到”no_commit”模式。
2. _fsopen函数
可以设置共享模式,一般用于服务器端。
Files opened by fopen_s and _wfopen_s are not sharable. If you require that a file be sharable, use _fsopen, _wfsopen with the appropriate sharing mode constant (for example, _SH_DENYNO for read/write sharing).
FILE *_fsopen( const char *filename, const char *mode, int shflag ); FILE *_wfsopen( const wchar_t *filename, const wchar_t *mode, int shflag ); |
说明:
filename:指定文件绝对路径名。同fopen
Mode:指定访问文件的类型. 同fopen
Shflag:共享模式:
l _SH_COMPAT 设置兼容模式(16位应用程序)
l _SH_DENYNO 可读写
l _SH_DENYRD 不可读,可写。
l _SH_DENYRW 不可读写。
l _SH_DENYWR 不可写,可读。
English
#define _SH_DENYRW 0x10 /* deny read/write mode */
#define _SH_DENYWR 0x20 /* deny write mode */
#define _SH_DENYRD 0x30 /* deny read mode */
#define _SH_DENYNO 0x40 /* deny none mode */
#define _SH_SECURE 0x80 /* secure mode */=share read access only if read-only
The argument shflag is a constant expression consisting of one of the following manifest constants, defined in SHARE.H:
_SH_COMPAT
Sets Compatibility mode for 16-bit applications
_SH_DENYNO
Permits read and write access
_SH_DENYRD
Denies read access to file
_SH_DENYRW
Denies read and write access to file
_SH_DENYWR
Denies write access to file
_fsopen是mscrt特定的.通过看vs2008/2010下CRT的源码我们可以看到 fopen、fopen_s都是通过调用_fsopen来实现的:
Function Required Header Optional Headers Compatibility
_fsopen <stdio.h> <share.h>1 Win 95, Win NT
_wfsopen <stdio.h> or <wchar.h> <share.h>1 Win NT
FILE * fopen(const char *file, const char *mode)
{
return( _fsopen(file, mode, _SH_DENYNO) );
}
errno_t fopen_s(FILE ** pfile, const char *file, const char *mode)
{
_VALIDATE_RETURN_ERRCODE((pfile != NULL), EINVAL);
*pfile = _fsopen(file, mode, _SH_SECURE);
if(*pfile != NULL)
return 0;
return errno;
}
useful links:
https://blog.51cto.com/4651077/1622303
3. fread 函数
从文件流中读取数据。
size_t fread(
void* buffer,
size_t size,
size_t count,
FILE* stream
);
说明:
Buffer: 存储数据的缓冲区。
Size: 一次读多少个字节。
Count: 读取次数。
Stream: FILE 结构的指针。
注:可以用while语句进行循环读取操作,用feof函数判断是否到了文件结尾,ferror函数判断是读取文件错误。
4. fwrite函数
写入数据到文件流中。
size_t fwrite(
const void* buffer,
size_t size,
size_t count,
FILE* stream
);
说明:
Buffer: 即将写入的数据。
Size: 一次写入多少个字节。
Count: 写入次数。
Stream: FILE 结构的指针。
注:可以用while语句进行循环写入操作。
5.stat函数和fstat函数
Stat获得文件属性,此文件不需要打开,fstat获得一个打开的文件的属性。
int _stat(
const char *path,
struct _stat *buffer
);
说明:
path: 文件路径。
buffer: 获得属性的结构体地址。
二.Win32函数
1. CreateFile函数
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
说明:
lpFileName: 指定文件路径。
dwDesireAccess: 指定访问权限。
值 | 描述 |
0 | 查询文件的属性,并不需要访问这个文件(如果大文件,load进来会很慢) |
GENERIC_READ | 指定读权限,可以和GENERIC_WRITE组合成读写权限。 |
GENERIC_WRITE | 指定写权限,可以和GENERIC_READ组合成读写权限。 |
dwShareMode: 指定共享模式。
值 | 描述 |
0 | 不共享 |
FILE_SHARE_READ | 读共享,可以和FILE_SHARE_WRITE组合成读写共享. |
FILE_SHARE_WRITE | 写共享,可以和FILE_SHARE_READ组合成读写共享。 |
lpSecurityAttributes: 安全模式,忽略,设置成NULL
dwCreationDesposition: 行为设置
值 | 描述 |
CREATE_NEW | 创建一个新的文件,如果文件已经存在,创建失败。 |
CREATE_ALWAYS | 创建新文件,如果文件存在,覆盖掉老的文件内容和属性。 |
OPEN_EXISTING | 打开一个文件,如果文件不存在,函数返回失败。 |
OPEN_ALWAYS | 如果文件存在,打开此文件,如果文件不存在,创建新的文件。 |
TRUNCATE_EXISTING | 打开一个文件,并将文件内容清空。并且至少指定GENERIC_WRITE 权限。如果文件不存在,函数返回失败。 |
dwFlagsAndAttributes: 设置文件的属性
值 | 描述 |
FILE_ATTRIBUTE_ARCHIVE | 指定文件将被入档,应用程序用来标记成将被备份和或者将移除的 |
FILE_ATTRIBUTE_COMPRESSED | 指定文件或者文件夹为压缩的。 |
FILE_ATTRIBUTE_HIDDEN | 指定文件是隐藏的 |
FILE_ATTRIBUTE_NORMAL | 正常属性 |
FILE_ATTRIBUTE_READONLY | 指定文件是只读的 |
FILE_ATTRIBUTE_SYSTEM | 指定文件是系统文件 |
FILE_ATTRIBUTE_ROMMODULE | 指定文件是DLL文件 |
FILE_ATTRIBUTE_TEMPORARY | 不支持. |
hTemplateFile: NULL
2. ReadFile函数
读取文件数据。
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
hFile: 文件句柄
lpBuffer: 接受读取数据的缓冲区
nNumberOfBytesRead: 读取的字节数
lpNumberOfBytesRead: 实际读取的字节数
lpOverLapped: NULL;
3. WriteFile 写文件
写入数据到文件中。
BOOL WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);
hFile: 文件句柄
lpBuffer: 将写入数据的缓冲区
nNumberOfBytesRead: 写入的字节数
lpNumberOfBytesRead: 实际写入的字节数
lpOverLapped: NULL;