• 什么是句柄


    一、 百度百科解释:

    在文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件的路径来打开文件。该函数取回一个顺序号,即文件句柄(file handle),该文件句柄对于打开的文件是唯一的识别依据。要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将文件句柄在内存中的地址和要拷贝的字节数传送给操作系统。当完成任务后,再通过调用系统函数来关闭该文件。

    一个句柄就是你给一个文件,设备,套接字(socket)或管道的一个名字, 以便帮助你记住你正处理的名字, 并隐藏某些缓存等的复杂性

    二、文件句柄和文件描述符

    在我们日常编程中经常会遇到文件描述符(file descriptor)和文件句柄(file handler)这两个概念,特别是需要开发跨平台(跨windows和linux)项目的时候会被这两个概念搞得很头痛,所以下面来说说它们是什么东西及它们的区别与联系。参考博客

    python文件管理

    一.文件处理流程

    1,打开文件,得到文件句柄并赋值给一个变量
    2,通过句柄对文件进行操作
    3,关闭文件

    二.基本操作

    打开模式
    文件句柄 = open(‘文件路径’, ‘模式’, 指定编码)
    打开文件的模式有:
    r ,只读模式【默认模式,文件必须存在,不存在则报错】
    w,只写模式【不可读;不存在则创建;存在则清空内容】
    x, 只写模式【不可读;不存在则创建,存在则报错】
    a, 追加模式【可读;不存在则创建;存在则只追加内容】
    “+” 表示可以同时读写某个文件
    r+, 读写【可读,可写】
    w+,写读【可读,可写】
    x+ ,写读【可读,可写】
    a+, 写读【可读,可写】
    “b”表示以字节的方式操作
    rb 或 r+b
    wb 或 w+b
    xb 或 w+b
    ab 或 a+b
    注:以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 os
    os.remove(‘a.txt’) #删除a.txt文件
    os.rename(‘.a.txt.swp’, ‘a.txt’) #重命名.a.txt.swp文件为a.txt

     

    另外的解释:

    句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,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://blog.csdn.net/lezeqe/article/details/87519776

    https://blog.csdn.net/wyx0224/article/details/83385168

    https://blog.csdn.net/Bobdragery/article/details/93143203

  • 相关阅读:
    弱网测试—Network-Emulator-Toolkit工具
    chmod修改权限
    mysql:on duplicate key update与replace into
    mysql:批量更新
    linux:磁碟与档案系统管理
    linux:指令与档案的搜索
    linux:问题
    linux:档案与目录管理
    linux:档案权限
    linux:习惯
  • 原文地址:https://www.cnblogs.com/annatest/p/14307143.html
Copyright © 2020-2023  润新知