Windows——CreatFile使用

15 篇文章 0 订阅

作者:小 琛

CreateFileW和CreateFileA

Windows下函数,大多都有两种实现,Windows本身通过UNICODE(是否位UNICODE)宏来区分使用哪一个API

#ifdef UNICODE
#define CreateFile  CreateFileW
#else
#define CreateFile  CreateFileA
#endif // !UNICODE

作用(使用场景)

创建或打开文件或 I/O 设备。最常用的 I/O 设备如下:文件、文件流、目录、物理磁盘、控制台缓冲区、磁带驱动器、通信资源、邮槽和管道。该函数返回一个句柄,根据文件或设备以及指定的标志和属性,该句柄可用于访问文件或设备以进行各种类型的 I/O。

个人使用心得:更多的时候,我们用它来打开一个已存在的设备

参数解析

HANDLE CreateFileW(
  [in]           LPCSTR                lpFileName,
  [in]           DWORD                 dwDesiredAccess,
  [in]           DWORD                 dwShareMode,
  [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  [in]           DWORD                 dwCreationDisposition,
  [in]           DWORD                 dwFlagsAndAttributes,
  [in, optional] HANDLE                hTemplateFile
);
  • [in] lpFileName
    要打开或添加的设备名称,此函数的 ANSI 版本(CreateFileA)中,名称仅限于MAX_PATH字符。要将此限制扩展到 32,767 个宽字符,请使用此 Unicode 版本的函数并在路径前添加“\?\”。
  • [in] dwDesiredAccess
    对文件或设备的请求权限,例如:读、写、读||写(GENERIC_READ、 GENERIC_WRITE、GENERIC_READ | GENERIC_WRITE)。
  • [in] dwShareMode
    文件或设备请求的共享模式,可以是read、write、both、delete、all these或none(参考下表)。
含义
0如果文件或设备请求删除、读取或写入访问权限,则阻止对文件或设备的后续打开操作。
FILE_SHARE_DELETE启用对文件或设备的后续打开操作以请求删除访问权限。
FILE_SHARE_READ启用对文件或设备的后续打开操作以请求读取访问权限。
FILE_SHARE_WRITE启用对文件或设备的后续打开操作以请求写入访问权限。

注意,dwDesiredAccess和dwShareMode可能出现冲突,例如第一个程序将某设备dwShareMode设定了FILE_SHARE_READ,后续请求该设备的仅仅可以有GENERIC_READ权限,而不能有GENERIC_WRITE。

  • [in, optional] lpSecurityAttributes

一个指向SECURITY_ATTRIBUTES 结构的指针,该结构包含两个独立但相关的数据成员:一个可选的安全描述符和一个布尔值,用于确定返回的句柄是否可以被子进程继承。

此参数可以为NULL,且通常设置为NULL

如果此参数为NULL ,则CreateFile返回的句柄 不能被应用程序可能创建的任何子进程继承,并且与返回的句柄关联的文件或设备将获得默认的安全描述符。

结构的lpSecurityDescriptor成员为文件或设备指定 SECURITY_DESCRIPTOR。如果此成员为NULL,则为与返回句柄关联的文件或设备分配一个默认安全描述符。

CreateFile在打开现有文件或设备时忽略 lpSecurityDescriptor成员,但继续使用bInheritHandle成员。
结构的bInheritHandle成员指定返回的句柄是否可以被继承。

  • [in] dwCreationDisposition

对存在或不存在的文件或设备执行的操作。

对于文件以外的设备,此参数通常设置为OPEN_EXISTING

含义
CREATE_ALWAYS总是创建一个新文件。
CREATE_NEW仅当不存在时创建
FILE_SHARE_READ启用对文件或设备的后续打开操作以请求读取访问权限。
OPEN_EXISTING打开一个已经存在的设备

注意:通常使用的是OPEN_EXISTING,如果指定的文件或设备不存在,则函数失败并且最后一个错误代码设置为 ERROR_FILE_NOT_FOUND (2)。

博主在开发的时候,遇到一种情况,使用它打开service,出现了433的错误码,这个问题是Windows关于service的错误,具体解决看这篇博文 关于Windows service

  • [in] dwFlagsAndAttributes
    文件或设备属性和标志,FILE_ATTRIBUTE_NORMAL是文件最常见的默认值。

  • [in, optional] hTemplateFile
    具有GENERIC_READ访问权限的模板文件的有效句柄。模板文件为正在创建的文件提供文件属性和扩展属性。
    此参数可以为NULL。打开现有文件时,CreateFile 会忽略此参数。

返回值

如果函数成功,则返回值是指定文件、设备、命名管道或邮槽的打开句柄。

如果函数失败,则返回值为INVALID_HANDLE_VALUE。要获取扩展的错误信息,请调用GetLastError。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我理解了你的问题。实验5主要是让学生熟悉Windows 2000/XP中的文件管理API,并通过编写一个程序来实现文件的复制操作。下面是一些相关的信息: 1. 创建文件:使用CreateFile函数创建文件,它的原型如下: HANDLE CreateFile( LPCSTR lpFileName, // 文件名 DWORD dwDesiredAccess, // 访问模式 DWORD dwShareMode, // 共享模式 LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性 DWORD dwCreationDisposition,// 创建方式 DWORD dwFlagsAndAttributes, // 文件属性 HANDLE hTemplateFile // 模板文件 ); 其中,lpFileName为文件名,dwDesiredAccess为访问模式,如GENERIC_READ、GENERIC_WRITE等。dwCreationDisposition表示创建方式,如CREATE_ALWAYS、OPEN_EXISTING等。dwShareMode表示共享模式,如FILE_SHARE_READ、FILE_SHARE_WRITE等。 2. 读取文件:使用ReadFile函数读取文件,它的原型如下: BOOL ReadFile( HANDLE hFile, // 文件句柄 LPVOID lpBuffer, // 读取缓冲区 DWORD nNumberOfBytesToRead, // 读取字节数 LPDWORD lpNumberOfBytesRead, // 实际读取字节数 LPOVERLAPPED lpOverlapped // 重叠结构体 ); 其中,hFile为文件句柄,lpBuffer为读取缓冲区,nNumberOfBytesToRead为读取字节数,lpNumberOfBytesRead为实际读取字节数。 3. 写入文件:使用WriteFile函数写入文件,它的原型如下: BOOL WriteFile( HANDLE hFile, // 文件句柄 LPCVOID lpBuffer, // 写入缓冲区 DWORD nNumberOfBytesToWrite, // 写入字节数 LPDWORD lpNumberOfBytesWritten, // 实际写入字节数 LPOVERLAPPED lpOverlapped // 重叠结构体 ); 其中,hFile为文件句柄,lpBuffer为写入缓冲区,nNumberOfBytesToWrite为写入字节数,lpNumberOfBytesWritten为实际写入字节数。 通过使用CreateFile、ReadFile和WriteFile函数,我们可以实现文件的复制操作。具体实现可以参考以下代码: ```c++ #include <windows.h> #include <iostream> using namespace std; int main() { HANDLE hFileSrc = CreateFile("src.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); HANDLE hFileDst = CreateFile("dst.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFileSrc != INVALID_HANDLE_VALUE && hFileDst != INVALID_HANDLE_VALUE) { char buf[1024]; DWORD dwRead; DWORD dwWritten; while (ReadFile(hFileSrc, buf, sizeof(buf), &dwRead, NULL) && dwRead > 0) { WriteFile(hFileDst, buf, dwRead, &dwWritten, NULL); } CloseHandle(hFileSrc); CloseHandle(hFileDst); cout << "File copied successfully!" << endl; } else { cout << "Failed to open file!" << endl; } return 0; } ``` 以上代码实现了将src.txt文件复制到dst.txt文件中的操作。其中,hFileSrc和hFileDst分别为源文件和目标文件的句柄,buf为缓冲区,dwRead和dwWritten分别为实际读取和写入的字节数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值