Windows核心编程【10】小结

Windows API——CFile, read, write,typeBinary函数 文件操作API和CFile类 在VC中,操作文件的方法有两种,一是利用一些API函数来创建,打开,读写文件,另外一个是利用MFC的CFile类,CFile封装了对文件的一般操作。下面酒主要介绍如何利用这两种方法操作文件。 1.创建或打开一个文件 API函数CreateFile可打开和创建文件、管道、邮槽、通信服务、设备以及控制台,但是在此时只是介绍用这个函数怎么实现创建和打开一个文件。 HANDL... 阅读详情

第十章 同步设备I/O与异步设备I/O

1、本章介绍的技术可以用来设计高性能、伸缩性好、响应性好,而且健壮的应用。一个伸缩性好的应用程序在处理大量并发操作时和处理少数并发操作时同样高效。
2、在Windows应用程序中,线程是最好的工具,可以用来对工作进行划分。
3、通过I/O完成端口,可以让线程在读取设备和写入设备的时候不必等待设备的响应,从而显著地提高吞吐量。
4、I/O完成端口最初被设计用来处理设备I/O,但这么多年来,MS已经构架出了越来越多能够非常好地适应I/O完成端口模型的操作系统设施。其中一个例子就是作业内核对象,它对进程进行监视并向I/O完成端口发送事件通知。
5、I/O完成端口也可以和设备I/O完全无关,简单地说,它是一种有无数用途的绝佳的线程间通信机制。


一、打开和关闭设备

1、Windows的优势之一是它所支持的设备数量。就这里讨论而言,把设备定义为能够与之进行通信的任何东西。各种设备及其常见用途:

2、本章将讨论应用程序如何与这些设备进行通信而不必等待设备响应。Windows极可能的对开发人员隐藏设备之间的差异。虽然不比过分关心设备的类型,但各个设备之间线程存在着差异。
3、下表列出了各种设备以及用来打开它们的函数

4、上表中的每个函数都返回一个用来标识设备的句柄,可以将该句柄传给许多函数来与设备进行通信。
5、在完成对设备的操作后,必须将其关闭。对大多数设备来说,最常用的CloseHandle;如果是套接字,那么closesocket。可以调用GetFileType来查处设备的类型。返回值如下表

6、CreateFile函数(MSDN更加详细也更新 http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx)当然可以用来创建和打开磁盘文件,但同样可以打开许多其他设备。其需要许多函数,这使得我们在打开设备的时候有相当大的灵活性。
7、调用CreateFile的时候,参数pszName即表示设备的类型,也表示该类设备的某个实例。
8、参数dwDesiredAccess用来指定我们想以何种方式来和设备进行数据传输。可以传入下表列出的4个普遍使用的标志。某些类型的设备还支持额外的访问控制标志。例如,当打开一个文件的时候,我们可以指定诸如FILE_READ_ATTRIBUTES之类的访问标志。

9、参数dwShareMode用来指定设备共享特权(device-sharing privilege)。当我们仍然打开着一个设备的时候(也就是说,我们尚未调用CloseHandle来关闭设备),该参数可以控制其他的CreateFile调用,能够以何种方式来打开设备。下表列出了一些可以的值:

10、在打开一个文件的时候,传入的路径名最长不超过MAX_PATH(在winDef.h中被定义为260)个字符。但是,调用CreateFileW(Unicode版本)并给路径名加上“\\?\”前缀,可以超越这个限制。CreateFileW会把前缀去除,它允许我们传入的路径名长度超过32000个Unicode字符。但需要注意的是,在使用这个前缀的时候,必须使用完整的路径名,系统不会对诸如“.”和“..”之类的相对路径进行处理。此外,路径中的每个独立的组成部分仍然不能超过MAX_PATH个字符。
11、参数psa指向SECURITY_ATTRIBUTES结构,用来指定安全信息以及我们是否希望CreateFile返回的句柄能够被继承。只有当我们在具备安全性的文件系统(比如NTFS)中创建文件的时候,才会用到结构内部的安全描述符,在其他所有情况下,该安全描述符会被忽略。
12、参数dwCreationDesposition对文件的含义更重大。下表列出了可选值。

调用CreateFile来打开文件之外的其他设备时,必须将OPEN_EXISTING传给dwCreationDisposition参数。
13、dwFlagsAndAttributes参数有两个用途:其一,它允许我们设置一些标志来微调与设备之间的通信;其二,如果设备是一个文件,还能够设置文件的属性。这些通信标志中的大多数都是一个信号,用来告诉系统我们打算一何种方式来访问设备。这样系统就可以对缓存算法进行优化,来帮助我们提高应用程序的效率。
14、下面的CreateFile的高速缓存标志,主要关注文件系统对象。
a、FILE_FLAG_NO_BUFFERING,则合格标志表示在访问文件的时候不要使用任何数据缓存。一般情况下,文件数据的一部分会在内存中出现两次:高速缓存管理器有一个缓存,当我们在调用某些函数(比如ReadFile)的时候,我们自己会有一个缓存。系统高速缓存管理器的速度的提升是通过从文件中读取超出实际需要的数据量来达到的。如果我们不再从文件中读取数据,那么可能会浪费内存。通过指定FILE_FLAG_NO_BUFFERING标志,高速高速缓存管理器不要对任何数据进行缓存——我们会自己对数据进行缓存。这取决于我们正在做什么。则合格标志可以提高应用程序的性能和内存的使用效率。由于文件系统的设备驱动程序会讲文件数据直接写入到我们提供的缓存中,因此必
须遵循一定的规则:在访问文件的时候,使用的偏移量必须正好是磁盘卷的扇区大小的整数倍(用GetDiskFreeSpace函数来确定磁盘卷的扇区大小);读取/写入文件的字节数必须正好是扇区大小的整数倍;必须确保缓存在进程地址空间中的起始地址正好是扇区大小的整数倍。
b、FILE_FLAG_SEQUENTIAL_SCAN和FILE_FLAG_RANDOM_ACCESS,只有当我们允许系统对文件数据进行缓存的时候,这些标志才会有用。如果指定了FILE_FLAG_NO_BUFFERING标志,那么这两个标志都会被忽略。如果指定了FILE_FLAG_SEQUENTIAL_SCAN标志,那么系统会认为我们将顺序地访问文件。会先预读部分数据。但是如果我们要随机读取(会重新设置文件指针),那么还是指定FILE_FLAG_RANDOM_ACCESS标志。这标志是告诉系统不要提前读取文件数据。
c、为了对一个文件进行管理,高速缓存管理器必须为该文件保存一些内部数据结构——文件越大,所需的数据结构就越多。在出力非常大的文件时,高速缓存管理器可能无法分配它所需的内部数据结构,从而导致打开文件失败。为了访问非常大的文件,必须用FILE_FLAG_NO_BUFFERING标志来打开文件。
d、FILE_FLAG_WRITE_THROUGH,这是最后一个与高速缓存有关的标志。它禁止对文件写入操作进行缓存以减少数据丢失的可能性。当指定这个标志的时候,系统会将所有对文件的修改直接写入到磁盘中。但是,系统仍然会在内部的缓存中保存文件数据,这样文件读取操作会继续使用缓存中的数据(如果可供使用的话),而不必直接从磁盘中读取数据。如果用这个标志来打开网络服务器上的文件,那么只有在数据已经被写入服务器的磁盘之后,各个Windows文件写入函数才会返回到调用线程。
15、用来对高速缓存之外的各种行为进行定制。
a、FILE_FLAG_DELETE_ON_CLOSE,使用这个标志可以让文件系统在文件所有的句柄都被关闭后,删除该文件。这个标志通常和FILE_ATTRIBUTES_TEMPORARY属性一起使用。当这两个标志一起使用的时候,应用程序可以创建一个临时文件,想文件中写入数据,从文件中读取数据,最后关闭文件。当关闭文件的时候,系统胡i自动删除该文件。
b、FILE_FLAG_BACKUP_SEMANTICS,这个标志一般用于备份和恢复软件。在打开或创建人和文件之前,为了确保试图打开文件或创建文件的进程具有所需的访问特权,系统通常会执行安全性检查。但是,备份和恢复软件有一定的特殊性,它们会跳过某些文件安全性检查。当指定该标志的时候,系统会检查调用者的存取令牌(access token)是否具备对文件和目录进行备份/恢复的特权。如果调用者具备相应的特权,那么系统会允许它打开文件。也可以用该标志来打开一个目录的句柄。
c、FILE_FLAG_POSIX_SEMANTICS,区分文件大小写的方式来查找文件名。
d、FILE_FLAG_OPEN_REPARSE_POINT,该标志告诉系统忽略文件的重解析属性(即reparse attribute,如果有的话)。重解析属性允许一个文件系统过滤器对打开文件、读取文件、写入文件以及关闭文件这些行为进行修改。通常这样的修改行为是我们想要的,因此不推荐使用该标志。
e、FILE_FLAG_OPEN_NO_RECALL,该标志告诉系统不要将文件内容从脱机存储器(既是offline storage,比如磁带)回复到联机存储器(既是online storage,比如硬盘)。当文件很长时间没有被访问的时候,系统可以将文件内容转移到脱机存储器,从而腾出硬盘空间。(?)当系统执行这个操作的时候,并不会销毁硬盘上的文件,而只是销毁文件中的数据。当文件被打开的时候,系统会自动地从脱机存储器中恢复到文件数据。而该标志告诉系统不要恢复数据,这会导致系统对脱机存储媒介进行I/O操作。
f、FILE_FLAG_OVERLAPPED,这个标志告诉系统我们想要以异步方式来访问设备。打开设备的默认方式是同步I/O(既是没有指定该标志的)。
16、还有文件属性标志,见下表。除非我们正在创建一个新文件,且传给hFileTemplate参数的值为NULL,否则系统会完全忽略dwFlagsAndAttributes参数所指定的这些标志。


17、如果要创建临时文件,那么应该使用FILE_ATTRIBUTES_TEMPORARY标志。这样,CreteFile会尽量将文件数据保存在内存中,而不是在磁盘上,这使得访问文件的内容变得更快。如果内存不够,那么系统会被迫开始讲数据写入到硬盘中。

18、除了所有这些通信标志和属性标志,还有其他一些标志,当打开一个命名管道的时候,这些标志可以运行我们对安全服务质量(security quality of service)进行控制。
19、CreateFile的最后一个参数hFileTemplate,既可以标志一个已经打开的文件的句柄,也可以是NULL。如果标志一个文件句柄,那么会完全忽略dwFlagsAndAttributes参数,并转而使用hFileTemplate所标识的文件的属性。为了能够让函数以这种方式工作,hFileTemplate标识的文件必须是一个已经用GENERIC_READ标志打开的文
零基础如何入门MATLAB(适用于所有编程语言)?(建议收藏) 网上看过很多回答,都没有回答到点子上,举个例子: 大而空: 这个知友的回答我认为是写的相对来说比较好的: 作为一个不新的新手,这里给大家推荐一下我是如何入门MATLAB的。 根据我的个人经验,看项目代码学MATLAB是最有效的学习方式,同样,这也适合所有编程语言。 步骤: 1.对于零基础的小白,首先必须了解MATLAB的基本语法及基础知识。 这里重点推荐慕课上刘卫国老师的科学计算与MATLAB语言,课程链接:https://www.icourse163.org/course/CSU-1002475002 阅读详情

相关推荐

MATLAB编程语言简介

MATLAB的代码具有很强的兼容性。当我们写一个代码时,我们可以把它应用于不同的场合。同时它拥有大量功能丰富的代码库工具和功能强大的模块,可以帮助我们提高代码安全性。我们不需要担心程序出错或故障,因为我们不需要经常更换程序或模块来运行软件。只要编写程序并运行就会发生故障并导致严重后果。而且如果程序出错或有故障,我们可以随时查找原因并及时采取措施。我们能大大减少运行过程中所需要做各种操作,而且非常方便。它不仅可以提供多种输入输出类型供用户选择并支持多种编程语言和程序。还具有快速编写功能并提供快速下载服务、系统

戴子雯的博客 5480

音速启动 文件夹保护推断

朋友让我看看 音速启动的文件夹保护原理.于是download下来,运行,设置待保护的文件夹,加密.退出程序,然后试图进入该文件夹,弹出输入密码.故意输错.进不了,等等,咋弹出个文件被其他应用程序打开?运行icesword.exe,果然隐藏了一个进程vsenfolder.exe.杀掉,再进入被保护的文件夹,无须再输入密码.其后关机重启,居然被保护的文件夹又提示输入密码了.再运行iceswor

ZHENG017的专栏 2776

基于MATLAB编程语言的一维非稳态导热问题计算机仿真程序设计

基于matlab开发了一个一维非稳态导热计算程序,可以自定义参数。

zhaolp945的博客 1989

CreateFileFILE_FLAG_NO_BUFFERING 问题

最近在写数据恢复的软件,同时要对24块硬盘的数据进行操作,然后写入一个16T 的存储中。 由于在平常的时候没有考虑到系统缓存的问题,只知道 我每次 重复跑数据的时候 往往第二次的比第一次的快上好多。 情况 就这么发生了。服务器的内存是16G,由于数据量太大了,执行完一个任务要好几天。不知不觉中发现系统内存爆满了,查找了所有存在的进程检查其占用的内存 没哟发现有异常的。当时 认为有可能是系统做的

king1076的专栏 3562

error:CreateFile()函数使用了FILE_FLAG_NO_BUFFERING后就不能使用SetFilePointer了

转子csdn论坛: 我要读取一个大文件,为了不影响性能,故CreateFile()函数包含了标志。 HANDLE hFile=NULL; hFile=CreateFile(m_chFileName, GENERIC_READ, FILE_SHARE_READ,                       NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMA

勿忘初心,安得始终 3352

实验七:使用无缓冲的方式实现文件读\写

一:实验目的 (1)熟悉Windows系统文件读\写相关API。 (2)掌握无缓冲方式实现文件读\写相关参数的设置。 二:实验准备知识:相关API函数介绍 文件创建 函数CreateFile( ) 用于创建一个新文件,如果文件已经存在,则得到该文件的句柄。该函数的参数dwFalgsAndAttributes决定了文件的传输方式,对于普通的文件传输,可将参数设置为FILE_ATTRIBUTE_NORMAL;而若设置为FILE_FLAG_NO_BUFFERING,表示不使用高速缓存进行文件传输;若同时使用标

YuTinH的博客 2413

Matlab:Matlab编程语言的简介、安装、学习路线(几十项代码编程案例分析)之详细攻略

​ Matlab:Matlab编程语言的简介、安装、学习路线(几十项代码编程案例分析)之详细攻略 目录 Matlab编程语言的简介 Matlab编程语言的安装 Matlab编程语言的学习路线​​​​​​​ 原文链接:Matlab:Matlab编程语言的简介、安装、学习路线(几十项代码编程案例分析)之详细攻略_听雪闻歌的博客-CSDN博客 Matlab编程语言的简介 Matlab是matrix&laborat

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 3万+

计算机怎么理解编程语言,你觉得自己很懂编程语言?随口能说出几个?但是你真的有理解它吗...

编程语言是一种形式语言,具有一组提供所需输出的指令。为了在机器上实现各种算法,我们开始使用编程语言。一组特定的指令用于可编程机器,而不是一般的编程语言。计算机编程语言用于与计算机通信。每一种编程语言都基于一定的句法和语义规则。计算机使用数字表示。只有理解0或1的存在作为关闭或开启。因此,为了与计算机通信,我们必须以二进制语言给出指令,但这几乎是不可能的,所以我们需要编程语言来拯救我们。我们按照编程...

weixin_42303522的博客 817

Matlab 用途(我的理解)

Matlab优点: 1.高效的数值计算功能。目前其他编程语言以及其他类似的数学软件无可替代; 2.完备的计算结果和编程可视化功能。这一点其他软件,无可替代; 3.接近数学表达式的自然化m语言。非常易于学习和掌握;Matlab软件就是一个编程开发环境,自带的m语言简单易用,有编程开发经验的人应该是非常容易掌握的,支持面向对象编程。 4.功能丰富的应用工具箱与Help系统,目前Matlab

Keep trying, keep going 7万+

热门编程语言间的差异

热门编程语言对比 1. C 用途 操作系统开发 软件开发 硬件设计开发 优点 C 语言高度可移动,在不同平台上运行几乎不需要做修改; C 语言基于变量、宏命令、函数和架构,几乎可以嵌入所有线代微型处理器; 几乎所有编程语言都是由 C 实现,学会 C 之后学习其他语言就较为简单。 缺点 C 语言没有运行时检查机制; C 语言不支持面向对象编程; 对于小白来说学习难度较大。 2. C++ 用途 软件开发 搜索引擎 操作系统 游戏开发 优点 熟练掌握 C++ 有利于理解其他编程语言例如 Java

SuanCaiyu1806的博客 2万+

2023十大最牛编程语言排行榜以及各语言的优缺点

我们掌握不了所有的编程语言,但我们掌握的语言越多,在未来的发展与可塑性上就越强,就越容易受到企业的青睐,如果是作为自由开发者的话,也就越会有客户和开发团队与我们合作。 考虑到这一点,希望各位小伙伴能规划好自己的学习计划,并开始一一学习,以成为某一细分领域的技术专家或者某个蓬勃发展领域的顶级专家。

易编橙 · 终身成长社群,相遇已是上上签! 4万+

世界主流编程语言有哪些优势呢

世界主流编程语言有哪些优势呢 Java C C++ Python Visual Basic NET MATLAB 让我们先来看看近期编程语言排行吧 从图表上明显看出java在近几年跃居第一位,c语言并无增长优势,而近几年虽然python人工智能传的很火爆,但由于大多时机还不够成熟等原因python的应用还未普及...

qq_42731531的博客 942

matlab与python编程语言的异同(1)

matlab与python编程语言的异同 1. printf( ) M为printf ,P为print 2. M每一句后面需要加上;表示结束 。 P不用。 3. M中 if…else…end 。P中 if (表达式):…else(表达式): 4.M中,访问元素使用(),Python中,访问列表元素,使用的是[ ]; ...

塘朗晨光 3033

matlab char数组转double_你可能不知道的MATLAB入门技巧#第二话

第二话1-梳理一下MATLAB中的字符char、符号变量symbol和数值型变量double等的区别。经过图图长时间调研,发现大家对这三个概念不是很清楚,这突出反映在函数的使用上,比如在只接受数值型变量,例如x=1,的函数中传入了符号型变量syms x。2-深入理解和区分一下函数文件和脚本文件,比如一个函数文件中是否可以定义多个function。PART 1 字符 | 符号变量 | 数值变量字符—...

weixin_30231153的博客 6487

AI人工智能的5种绝佳编程语言

如今,人们期望AI程序员掌握多种语言,因为AI的开发者们是在跨学科环境中工作而不是在一个孤岛上。在AI项目中更多的是涉及Python,R,Java,Lisp,Prolog,Julia等语言的综合使用 是的,你没看错,没有一种单独的“ AI语言”可以被视为最佳编程语言。 因此,让我们讨论一些流行的语言,这些语言正在全球AI项目中流行和使用。了解这些可以帮助你尽快成为更专业的AI工程师。 1)Python: 在AI,ML和数据分析的所有其他语言中,它排名第一。建议你在需要快速编码时使用。 Py..

创帆云的博客 1万+

MATLAB解决假币问题的算法设计

在当今金融与商业交易中,货币是日常活动的基础。然而,假币的流通对于经济系统的安全性和稳定性构成重大威胁。本章将对假币问题进行概述,并探讨解决假币问题时所面临的优化挑战。假币问题指的是在货币流通中,假币和真币混合流通的问题。这不仅影响了货币的价值和信用,还可能导致整个经济体系的混乱。假币的存在不仅使商家和消费者受到经济损失,同时也给金融机构带来了巨大的鉴别和处理成本。MATLAB是Matrix Laboratory的缩写,最初由Cleve Moler教授在1980年代开发。

weixin_35636570的博客 722

MATLAB实现遗传算法解决TSP问题的教程

遗传算法(Genetic Algorithms, GAs)是一种模拟自然选择和遗传学原理的搜索优化算法。它是由John Holland及其学生和同事在1975年首次提出的。遗传算法属于全局优化算法,特别适用于在复杂的搜索空间中寻找最优解。它借鉴了生物进化中“适者生存”的理论,通过选择、交叉(杂交)和变异三个主要操作不断迭代,逐步提升种群的适应度,直至找到满足条件的最优解。MATLAB,全称为Matrix Laboratory,是MathWorks公司推出的一款高性能数值计算和可视化软件。

weixin_35459464的博客 636
上一篇: 看雪转载——OllyDBG 入门系列(五)-消息断点及 RUN 跟踪
下一篇: C++ sizeof 使用规则及陷阱分析
BetaBin
博客等级 码龄15年 155粉丝 121原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值