0

0

什么是句柄

雪夜

雪夜

发布时间:2025-08-30 08:17:31

|

834人浏览过

|

来源于php中文网

原创

大家好,又见面了,我是你们的朋友全栈君。

一、百度百科解释:在文件I/O操作中,若要从文件读取数据,应用程序首先需调用操作系统函数,并传递文件名以及选择一个到该文件的路径来打开文件。此函数会返回一个顺序号,即文件句柄(file handle),它是打开文件的唯一识别依据。要从文件中读取数据块,应用程序需调用ReadFile函数,并将文件句柄在内存中的地址及要拷贝的字节数传送给操作系统。任务完成后,通过调用系统函数关闭该文件。

句柄是一个给文件、设备、套接字或管道命名的方式,帮助你记住正在处理的对象,并隐藏某些缓存等复杂性。

二、文件句柄与文件描述符在日常编程中,我们常常会遇到文件描述符(file descriptor)和文件句柄(file handler)这两个概念,尤其是在开发跨平台(如Windows和Linux)的项目时,这两个概念常常让人头疼。下面我们来探讨它们是什么以及它们的区别与联系。参考博客

Python文件管理一.文件处理流程1.打开文件,获取文件句柄并赋值给变量。2.通过句柄对文件进行操作。3.关闭文件。

二.基本操作打开模式文件句柄 = open('文件路径', '模式', 指定编码)打开文件的模式有:r,只读模式【默认模式,文件必须存在,否则报错】w,只写模式【不可读;不存在则创建;存在则清空内容】x,只写模式【不可读;不存在则创建,存在则报错】a,追加模式【可读;不存在则创建;存在则只追加内容】“+”表示可以同时读写某个文件r+,读写【可读,可写】w+,写读【可读,可写】x+,写读【可读,可写】a+,写读【可读,可写】“b”表示以字节的方式操作rb或r+wb或w+xb或x+ab或a+注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码操作(1)读1、f.read() #按字符读文件2、f.readline() #按行读文件3、f.readlines() #按行读所有文件内容(2)写f.write() #在当前光标后开始写文件(3)刷到硬盘f.flush() #立即刷到硬盘(4)关闭文件f.close() #关闭文件(5)光标移动f.read() #按字符读取文件,光标按字符移动f.seek() #按字节读取文件,光标按字节移动;f.seek( ,whence) #whence默认为0,代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。f.truncate() #默认从当前光标位置截断,后面内容删除,可传入参数,指该字节处截断f.tell() #获取文件当前位置(6)上下文管理with open('文件路径', '模式') as f: #执行完操作后自动删除f pass(7)扩展 复制图片(视频)文件:read_file = open('a.jpg','rb')write_file = open('a.copy.jpg' , 'wb')write_file.write(read_file.read())read_file.close()write_file.close()文件修改:import osos.remove('a.txt') #删除a.txt文件os.rename('.a.txt.swp', 'a.txt') #重命名.a.txt.swp文件为a.txt

另外的解释:

句柄是Windows用来标识应用程序创建或使用的对象的唯一整数,Windows使用各种句柄来标识应用程序实例、窗口、控制、位图、GDI对象等。Windows的句柄类似于C语言中的文件句柄。

从上述定义中我们可以看出,句柄是一个标识符,用来标识对象或项目,它就像我们的姓名,每个人都有唯一的姓名,但也可能存在同名的情况。从数据类型来看,它是一个16位的无符号整数。应用程序通常通过调用Windows函数获得一个句柄,然后其他Windows函数可以使用该句柄来引用相应的对象。

这里需要说明:

1.这里将句柄所能标识的所有东西(如窗口、文件、画笔等)统称为“对象”。

2.图中一个小横框表示一定大小的内存区域,并不代表一个字节,如标有0X00000AC6的横框表示4个字节。

3.图解的目的是为了直观易懂,所以不一定与源码完全对应,会有一定的简化。

让我们先看图,再解释。

什么是句柄什么是句柄 其中,图1是程序运行到某时刻时的内存快照,图2是程序往后运行到另一时刻时的内存快照。红色部分标出了两次的变化。

简单解释:

Windows是一个基于虚拟内存的操作系统,很多时候,进程的代码和数据并不全部装入内存,进程的某一段装入内存后,还可能被换出到外存,当再次需要时,再装入内存。两次装入的地址绝大多数情况下是不一样的。也就是说,同一对象在内存中的地址会变化。(对于虚拟内存不是很了解的读者,可以参考有关操作系统方面的书籍)那么,程序怎么才能准确地访问到对象呢?为了解决这个问题,Windows引入了句柄。

阿里云-虚拟数字人
阿里云-虚拟数字人

阿里云-虚拟数字人是什么? ...

下载

系统为每个进程在内存中分配一定的区域,用来存放各个句柄,即一个个32位无符号整型值(32位操作系统中)。每个32位无符号整型值相当于一个指针,指向内存中的另一个区域(我们不妨称之为区域A)。而区域A中存放的正是对象在内存中的地址。当对象在内存中的位置发生变化时,区域A的值被更新,变为当前时刻对象在内存中的地址,而在这个过程中,区域A的位置以及对应句柄的值是不发生变化的。这种机制,用一种形象的说法可以表述为:有一个固定的地址(句柄),指向一个固定的位置(区域A),而区域A中的值可以动态地变化,它时刻记录着当前时刻对象在内存中的地址。这样,无论对象的位置在内存中如何变化,只要我们掌握了句柄的值,就可以找到区域A,进而找到该对象。而句柄的值在程序本次运行期间是绝对不变的,我们(即系统)当然可以掌握它。这就是以不变应万变,按图索骥,顺藤摸瓜。

所以,我们可以这样理解Windows句柄:

数值上,是一个32位无符号整型值(32位系统下);逻辑上,相当于指针的指针;形象理解上,是Windows中各个对象的一个唯一的、固定不变的ID;作用上,Windows使用句柄来标识诸如窗口、位图、画笔等对象,并通过句柄找到这些对象。

下面,关于句柄,再交代一些关键性细节:

1.所谓“唯一”、“不变”是指在程序的一次运行中。如果本次运行完,关闭程序,再次启动程序运行,那么这次运行中,同一对象的句柄的值和上次运行时比较,一般是不一样的。

其实这理解起来也很自然,所谓“一把归一把,这把是这把,那把是那把,两者不相干”(“把”是形象的说法,就像打牌一样,这里指程序的一次运行)。

2.句柄是对象生成时系统指定的,属性是只读的,程序员不能修改句柄。

3.不同的系统中,句柄的大小(字节数)是不同的,可以使用sizeof()来计算句柄的大小。

4.通过句柄,程序员只能调用系统提供的服务(即API调用),不能像使用指针那样,做其它的事。

参考:

https://www.php.cn/link/03d6eca3411c476c682d10e85428c967

https://www.php.cn/link/aa669fe24aabb489080c05a96e7f594b

https://www.php.cn/link/4b7a9b570d5cca47a756a4a69317ba91

发布者:全栈程序员栈长,转载请注明出处:https://www.php.cn/link/08b41ec0a7a71415ee6b932e222d8af3

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

715

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

625

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

739

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1235

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

575

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

698

2023.08.11

桌面文件位置介绍
桌面文件位置介绍

本专题整合了桌面文件相关教程,阅读专题下面的文章了解更多内容。

0

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 3.9万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 0.9万人学习

微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号