曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 7691|回复: 1
打印 上一主题 下一主题

[文件与IO] CreateFile() -- 打开与创建文件

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2011-9-10 12:54:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CreateFile() 函数用以打开和创建文件,函数原型声明如下:
HANDLE WINAPI CreateFile(
  __in      LPCTSTR lpFileName,
  __in      DWORD dwDesiredAccess,
  __in      DWORD dwShareMode,
  __in_opt  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  __in      DWORD dwCreationDisposition,
  __in      DWORD dwFlagsAndAttributes,
  __in_opt  HANDLE hTemplateFile
);
在 Windows 中,创建和打开文件的 API 都是 CreateFile() 函数,并通过指定不同的参数来表示是创建一个文件,打开已存在的文件,还是重新建立文件等。

第 1 个参数 lpFileName 是个输入参数,表示操作的对象文件的相对路径或绝对路径。

第 2 个参数 dwDesiredAccess 是个输入参数,指名对文件对象的操作存取方式,比如是 GENERIC_READ(读文件),GENERIC_WRITE(写文件) 。

第 3 个参数 dwShareMode 是个输入参数,表示共享模式。指名与其他进程是否共享该文件,可以是共享读(FILE_SHARE_READ),共享写(FILE_SHARE_WRITE),共享删除(FILE_SHARE_DELETE)。如果指名多个属性,那么可用 "|" 将几个属性做或运算。如果本进程需要独占本文件,那么就将该参数设置为 0 。

第 4 个参数 lpSecurityAttributes  是一个指向 SECURITY_ATTRIBUTES 结构的指针,表示本文件句柄的安全属性,能影响其是否可被子进程继承等操作。如果设为 NULL,则子进程不能继承本句柄。该结构并不常用。

第 5 个参数 dwCreationDisposition 是个输入参数,表示操作模式。

第 6 个参数 dwFlagsAndAttributes 是个输入参数,是文件属性和文件标志。

第 7 个参数 hTemplateFile 是个输入参数,当存取权限包括 GENERIC_WRITE 时,可以设置为一个模板文件的句柄,一般情况下该参数可设为 NULL ,表示不使用模板文件。

函数的参数选项众多,下面主要列出比较重要且常用的几个进行说明。

dwShareMode
0 -- 文件不能共享,且本进程不能在这个文件上打开第 2 个 HANDLE 。
FILE_SHARE_READ -- 其他进程,包括进行本调用进程,可以打开这个文件并进行并发访问。
FILE_SHARE_WRITE -- 允许并发写文件。

lpSecurityAttributes
该参数指向一个 LPSECURITY_ATTRIBUTES 结构,一般使用中可置为 NULL 。

dwCreationDisposition
该参数指定是否创建文件,覆盖现有文件等。选项有以下几个:

1. CREATE_NEW
创建新文件,如果指定的文件已经存在那么失败。

2. CREATE_ALWAYS
创建新文件,如果文件存在则重建该文件,清楚文件内容及文件属性;如果文件不存在,则创建一个个新文件。

3. OPEN_EXISTING
打开现有文件,如果文件不存在则失败。

4. OPEN_ALWAYS
如果文件存在,则打开文件;如果不存在,则创建它,此时等同于 CREATE_NEW。

5. TRUNCATE_EXISTING
将文件长度置为 0.使用该选项时,必须至少指定 GENERIC_WRITE 访问权限,如果文件不存在时则失败,对于已经存在的文件,则该文件的内容会被全部销毁。

dwFlagsAndAttributes
该参数指定文件的属性和长度,一共有 32 个标志和属性。属性是文件的特征,且与打开的文件句柄形成对照,如果打开的是现有文件,那么这些标志将被忽略。以下几个是比较常见且重要的属性和标志值。

1. FILE_ATTRIBUTE_NORMAL
该属性只可在不设置其他属性(可以设置标志)时才能使用。

2. FILE_ATTRIBUTE_READONLY
只读文件,应用程序不能写也不能删除文件。

3. FILE_ATTRIBUTE_ARCHIVE
存档文件

4. FILE_ATTRIBUTE_ENCRYPTED
加密文件

5. FILE_ATTRIBUTE_HIDDEN
隐藏文件


6. FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
没有使用内容索引服务


7. FILE_ATTRIBUTE_OFFLINE
离线存储文件

8. FILE_ATTRIBUTE_SYSTEM
系统文件

9. FILE_ATTRIBUTE_TEMPORARY
临时文件

dwFlagsAndAttributes

1.FILE_FLAG_DELETE_ON_CLOSE
对临时文件有用,当最后一个打开的句柄被关闭时,Windows 会删除这个文件。

2.FILE_FLAG_OVERLAPPED
以异步 I/O 方式创建可打开文件,这个属性标志对异步 I/O 比较重要。

3.FILE_FLAG_RANDOM_ACCESS
设置该属性标志时,在程序对文件进行随机访问时,Windows 会尝试优化文件缓存。

4.FILE_FLAG_SEQUENTIAL_SCAN
该属性标志表示文件用于顺序访问,Windows 将相应的优化缓存。

5.FILE_FLAG_BACKUP_SEMANTICS
打开和创建文件是为了进行备份和恢复操作。

6.FILE_FLAG_NO_BUFFERING
不使用系统缓存(cahing,不同于硬件缓存)

5.FILE_FLAG_NO_BUFFERING
不使用系统缓存(cahing,不同于硬件缓存)

7.FILE_FLAG_NO_RECALL
远程存储

8.FILE_FLAG_WRITE_THROUGH
存取文件时,对磁盘进行直接操作,不经过缓存

9.FILE_FLAG_POSIX_SEMANTICS
按照 POSIX 规则存取

10.FILE_FLAG_OPEN_REPARSE_POINT
系统将禁止 NTFS 文件系统的“再解析”行为

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
沙发
 楼主| 发表于 2011-9-19 17:00:47 | 只看该作者

dwShareMode 参数取值的一些说明

可以利用下面的代码做一下相关实验:
[C++] 纯文本查看 复制代码
int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE fh;
    TCHAR String[] = _T("Hello, world."), c; //Buffer[8] = _T("12345678"), c;
    int command;
    OVERLAPPED ov = {0, 0, 0, 0, NULL};
    DWORD nRead = 0, nWrite = 0;

    if (argc < 2) {
        _tprintf (_T("No file name and command"));
        exit (EXIT_FAILURE);
    }

    //command = _ttoi(argv[2]);

    fh = CreateFile (argv[1], GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    if (fh == INVALID_HANDLE_VALUE) {
        _tprintf (_T("Cannot open file\\n"));
        exit (1);
    }

    _tprintf (_T("\\nType any character to release the share lock"));
    _tscanf (_T("%c"), &c);
    _tprintf (_T("Ok, exit now\\n"));


    return 0;
}

在上面代码中,会按照你设定的模式去打开一个文件,它等待你按下任意键后程序退出,所以可以利用这个停歇的时间对第 3 个参数,即 dwShareMode 赋予不同值进行测试。

当 dwShareMode  为 0 时,不允许其它进程读,写,删除该文件。比如我此时用 UE 打开 argv[1] 代表的文件,那么会得到提示:


当 dwShareMode   设为 FILE_SHARE_READ 时,其它进程不能写该文件,只能读取。同样用 UE 来测试写入并保存时会发现:


同样可以测试  FILE_SHARE_WRITE  和 FILE_SHARE_DELETE 的情况。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 16:55 , Processed in 0.080746 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表