CreateFile后为何要CloseHandle?

adamwyb 2010-07-29 11:17:48
MSDN中对于CreateFile有这样一句话:
Use the CloseHandle function to close an object handle returned by CreateFile.
就是说CreateFile后需要用CloseHandle关闭返回的handle。于是我做了个小程序进行测试:


int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hFile = CreateFile(".\\1.txt", GENERIC_WRITE, FILE_SHARE_READ,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
CloseHandle(hFile);
return 0;
}


在CloseHandle(hFile);的位置设置了断点,那么程序运行到这个断点的时候,可以在目录中看到1.txt文件了。但是打开后对其进行写操作,并保存,提示“不能创建文件。。。请确认文件名和路径是否正确”。当我执行完CloseHandle后,就可以保存了。
我的问题是,为什么没有CloseHandle就不能对文件进行操作?
...全文
1285 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jobobo 2010-07-29
  • 打赏
  • 举报
回复
你说的不完全对,你在释放文件句柄(CloseHandle)不能写入,不是因为没有调用CloseHandle,而是你在创建这个文件的时候使用了FILE_SHARE_READ,你如果再加上FILE_SHARE_WRITE的话,其它地方也可以写这个文件的。
由于CreateFile创建的是内核对象,你不使用CloseHandle释放句柄,会造成内核泄露,这是另一个问题。
adamwyb 2010-07-29
  • 打赏
  • 举报
回复
可不可以理解为:HANDLE 就像一把锁,CreateFile后,就得到了开门的锁,然后可以进去做一些事情,这个时候,如果不把这个锁释放(CloseHandle),那么别人(进程)就没办法打开这个门,不能对其(文件)进行操作?
是不是CreateThread返回的句柄,如果不对其释放的话,就没办法调用线程挂起和终止的指令?
ponydph 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 luodx1021 的回复:]
引用 1 楼 stonewater 的回复:
CreateFile已经把文件打开了,FILE_SHARE_READ这个属性表示别的程序可以打开来读,但不能写
CloseHandle就关闭文件,释放了对文件的控制权了

正解,顶
[/Quote]

agree !
luodx1021 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 stonewater 的回复:]
CreateFile已经把文件打开了,FILE_SHARE_READ这个属性表示别的程序可以打开来读,但不能写
CloseHandle就关闭文件,释放了对文件的控制权了
[/Quote]
正解,顶
weixiao 2010-07-29
  • 打赏
  • 举报
回复
1楼的正解, 不close,其它进程无法共享写, 否则两个以上进程同时写就乱了.
xjpzy 2010-07-29
  • 打赏
  • 举报
回复
CreateFile创建了一个内核对象,如果不调用CloseHandle,可能会泄露内核对象
Jobobo 2010-07-29
  • 打赏
  • 举报
回复
楼上说的很对,不能共享写,而且CreateFile创建了一个内核对象,你如果不调用CloseHandle去关闭句柄,那它是无法自己释放的,所以在调用了CreateFile函数后,一定要记得调用CloseHandle。
onlyliu 2010-07-29
  • 打赏
  • 举报
回复
因为 A Win32-based application uses a handle to refer to a resource that has been loaded into memory.

CloseHandle(hFile);是对memory立面的信息进行释放。
stonewater 2010-07-29
  • 打赏
  • 举报
回复
CreateFile已经把文件打开了,FILE_SHARE_READ这个属性表示别的程序可以打开来读,但不能写
CloseHandle就关闭文件,释放了对文件的控制权了
luodx1021 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 adamwyb 的回复:]
引用 13 楼 luodx1021 的回复:
第1个:你打开了文件,当然要关闭。
第2个,你到底是想要文件打开后,别的进程可以写还是不可以写,你说清楚,我们好给你正确的参数。


我想试下可以写的情况
[/Quote]
HANDLE hFile = CreateFile(".\\1.txt", 0, FILE_SHARE_READ,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

CloseHandle(hFile);

这样就可以满足了的要求了。
adamwyb 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 luodx1021 的回复:]
第1个:你打开了文件,当然要关闭。
第2个,你到底是想要文件打开后,别的进程可以写还是不可以写,你说清楚,我们好给你正确的参数。
[/Quote]

我想试下可以写的情况
luodx1021 2010-07-29
  • 打赏
  • 举报
回复
第1个:你打开了文件,当然要关闭。
第2个,你到底是想要文件打开后,别的进程可以写还是不可以写,你说清楚,我们好给你正确的参数。
adamwyb 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jobobo 的回复:]
你说的不完全对,你在释放文件句柄(CloseHandle)不能写入,不是因为没有调用CloseHandle,而是你在创建这个文件的时候使用了FILE_SHARE_READ,你如果再加上FILE_SHARE_WRITE的话,其它地方也可以写这个文件的。
由于CreateFile创建的是内核对象,你不使用CloseHandle释放句柄,会造成内核泄露,这是另一个问题。
[/Quote]

程序改为:


HANDLE hFile = CreateFile(".\\1.txt", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);


仍然出现不能保存的情况
insulted 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jobobo 的回复:]
你说的不完全对,你在释放文件句柄(CloseHandle)不能写入,不是因为没有调用CloseHandle,而是你在创建这个文件的时候使用了FILE_SHARE_READ,你如果再加上FILE_SHARE_WRITE的话,其它地方也可以写这个文件的。
由于CreateFile创建的是内核对象,你不使用CloseHandle释放句柄,会造成内核泄露,这是另一个问题。
[/Quote]

upup!
wltg2001 2010-07-29
  • 打赏
  • 举报
回复
在CloseHandle(hFile);的位置设置了断点,那么程序运行到这个断点的时候,可以在目录中看到1.txt文件了。但是打开后对其进行写操作,并保存,提示“不能创建文件。。。请确认文件名和路径是否正确”。当我执行完CloseHandle后,就可以保存了。
我的问题是,为什么没有CloseHandle就不能对文件进行操作?
===============
你打开了文件,只有CloseHandle后,你的程序才释放了对这个文件的控件权,所以才会出现你所说的情况

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧