大家好,又见面了,我是你们的朋友全栈君。
一、百度百科解释:在文件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
以上就是什么是句柄的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号