替换运行中的文件(深入浅出)
- 格式:doc
- 大小:48.00 KB
- 文档页数:5
[深入浅出]深入浅出、深入深出、浅入浅出、浅入深出[深入浅出]深入浅出、深入深出、浅入浅出、浅入深出篇一 : 深入浅出、深入深出、浅入浅出、浅入深出在网上读到这样一段话:世界上有四种老师,第一种是讲课能深入浅出,很深奥的道理,他能讲得浅显易懂,很受学生的欢迎,这是最好的老师;第二种是深入深出,这样的老师很有学问,但缺乏好的教学方法,不能把深奥的学问讲得浅显易懂,学生学起来就费劲,这也算是好老师;第三种是浅入浅出,这样的老师本身学问不深,但却实事求是,把自己懂的东西讲出来,这也能基本保证质量,也算是个好老师;最糟糕的是第四种老师,浅入深出,本身并无多大学问,却装腔作势,把本来很浅近的道理讲得玄而又玄,让人听不懂。
对比一下,我大概属于第三种。
一般我搞不懂的东西,我会避开不讲,只讲自己弄懂的东西;弄懂多少就讲多少。
学生问我问题,我会结合自己的切身经历告诉他自己碰到同样的问题会怎么做,甚至恨不得亲自示范给他/她看。
我知道有一种老师,他们总是能站在更高的地方给学生方法论方面的指导;我也见过另一种老师,他们对学生提出的问题总不正面回答,而是大谈一番似是而非不着边际的话题。
譬如学生问:老师,我想去云南自助游,应该怎么走,我会告诉他,我去过丽江,当年我是怎么走的。
但学生也许想去的是卢沽湖,我会说那里我没去过,但你可以先到丽江再打听怎样去卢沽湖,或者参照我当年的方法去寻找路线;另一种老师会这样回答:你可以到某某网站或某本书上去了解去那里的路线,并告诉他如何找到那个网站或那本书和出行的注意事项;还有一种老师会说:我写过一篇《自助游的兴起、演变、未来趋势和宏观管理战略》的文章,反响很大,你去找来看看吧,看完就知道怎么去了。
呵呵!篇二 : 深入浅出WinDbg——利用快速定位错误Sharepoint代码的某方法LoadLines中使用了SPSecurity.RunWithElevatedPrivileges此方法两次调用了Common.GetLookupValue,并且问题可能出在这里。
如何使用sed命令在Linux中进行高级文本替换和删除在Linux系统中,我们常常需要对文本文件进行替换和删除操作。
而sed命令(Stream Editor)则是一个非常强大的文本处理工具,它被广泛应用于Linux和Unix系统中。
本文将介绍如何使用sed命令进行高级文本替换和删除。
一、sed命令的基本语法sed命令的基本语法如下:```shellsed [选项] '指令' 文件```其中,选项可以省略,指令和文件是必须的参数。
下面我们逐步介绍sed命令的不同用法。
二、文本替换操作1. 替换文本中的指定字符串使用sed命令替换文本中的指定字符串,可以使用下面的指令:```shellsed 's/old/new/' file.txt```其中,old是要被替换的字符串,new是新的字符串,file.txt是要进行替换的文件。
2. 全局替换字符串如果文件中有多个相同的字符串需要替换,可以使用g选项来进行全局替换:```shellsed 's/old/new/g' file.txt```添加了g选项后,所有匹配的字符串都会被替换。
3. 只替换特定行匹配的字符串如果只想替换文件中特定行匹配的字符串,可以使用行号来匹配:```shellsed '2s/old/new/' file.txt```上述指令将只替换文件中第2行匹配的字符串。
三、文本删除操作1. 删除匹配的行使用sed命令删除文本文件中匹配的行,可以使用下面的指令:```shellsed '/pattern/d' file.txt```其中,pattern是要匹配的字符串或正则表达式。
上述指令将删除文件中所有匹配pattern的行。
2. 删除指定行如果只想删除文件中特定行匹配的字符串,可以使用行号来删除:```shellsed '2d' file.txt```上述指令将删除文件中第2行。
使⽤某个⽂件夹下的所有⽂件去替换另⼀个⽂件夹下及其⼦⽂件夹下存在的同名⽂件(Python实现)值此新年即将到来之际,在这献上今年最后⼀篇⽂章.产⽣这个需求是在项⽬的⼀次图标替换上,当时给了我⼀堆新图标要替换原来的⽼图标,可是原来的⽼图标分布在某个⽂件夹下的各个⼦⽂件夹下⾯,⽽新图标全是在同⼀个⽬录下的. ⼿动替换的话,只能是搜索⽂件名后替换,但是⽂件很多太⿇烦了,没找到现成的⼯具可以实现我的需求.于是有了下⾯这个脚本,正好熟悉下刚刚学会的Python. 如果有⼈知道有什么⼯具可以完成的话不妨留⾔告知:).下⾯脚本实现的就是在dest⽬录及其⼦⽬录下⾯,寻找和src⽬录下的⽂件对应的同名⽂件,如果找到唯⼀的⼀个同名⽂件,⽤src⾥⾯的新⽂件替换dest⾥⾯对应的⽼⽂件. 如果没找到同名或有多个同名的,就忽略.因为这种情况下需要⼈⼯接⼊是否替换,不过这样⼯作量已经少了很多了.代码通过扫描⼀遍dest⽬录及其⼦⽬录,建⽴了以⽂件名为索引,⽂件所在⽬录名为键值的倒排索引. 然后对src⽬录下的每个⽂件名去刚刚建⽴的倒排索引中寻找键值,如果键值中刚好只有⼀个⽬录名,说明找到了对应的唯⼀同名⽂件,替换之.其他的忽略.代码如下:代码#!/usr/bin/env python# coding:UTF-8import os,sys,shutilfrom os import pathdef findandreplace(src,dest):srcfiles = os.listdir(src)destfilesdict = {}#处理⽬标路径下(含⼦⽬录下)的所有⽂件for root,dirs,files in os.walk(dest):# 记录每个⽂件名所在的路径,多个同名⽂件则会有多个不同路径.# 这样就⽣成了⽂件名到⽂件所在路径的⼀个倒排索引for onefile in files:# 若该⽂件名的键值还未创建则先创建if onefile not in destfilesdict:destfilesdict[onefile] = []destfilesdict[onefile] += [root]multisamename = []; # 存储⽬标⽬录及其⼦⽬录下有多个同名⽂件的⽂件名for srcfile in srcfiles:fullsrcfile = os.path.join(src,srcfile)if os.path.isfile(fullsrcfile):if srcfile in destfilesdict:if len(destfilesdict[srcfile])>1:multisamename += [srcfile]else:# 有且只有唯⼀的⼀个同名⽂件,那么肯定是要替换的那个shutil.copy(fullsrcfile,destfilesdict[srcfile][0]+'/'+srcfile)print srcfile + ' replace success.'print'following files has more than one in dest directory, replace skipped.'print'\n'.join(multisamename);if__name__ == "__main__":args = sys.argvif len(args) > 2:src = args[1]dest = args[2]print"all files under the "+dest+\"(including the subdirectory) will be replaced by the files under " +\src+" where they have the same name."if raw_input('Sure(y/n?): ') == 'y':findandreplace(src,dest)else:print"Not enough arguments!"测试代码如下:代码#!/usr/bin/env python# coding:UTF-8import os,sysimport shutilimport findandreplacerootdir = 'd:/test/'testsrcdir = 'testsrc'testdestdir = 'testdest'testfile = { 'notexist' : ['001','002','003','004','005'], # 替换⽬标不存在的⽂件'onlyone' : ['101','102','103','104','105'], # 有唯⼀对应的⽂件存在的'morethanone':['201','202','203','204','205']} # 多于⼀个同名存在的testfileext = '.txt'# clear old test filesshutil.rmtree(os.path.join(rootdir,testsrcdir),True)shutil.rmtree(os.path.join(rootdir,testdestdir),True)# generate src filesos.makedirs(os.path.join(rootdir,testsrcdir))for key,values in testfile.iteritems():for filestr in values:srcfile = open(os.path.join(rootdir,testsrcdir,filestr+testfileext),'w')srcfile.write(filestr+'srcfile')srcfile.close()# generate dest filesos.makedirs(os.path.join(rootdir,testdestdir))for key,values in testfile.iteritems():if key == 'notexist':passelif key == 'onlyone':for filestr in values:newdir = os.path.join(rootdir,testdestdir,filestr)os.makedirs(newdir)srcfile = open(os.path.join(newdir,filestr+testfileext),'w')srcfile.write(filestr+'destfile')srcfile.close()elif key=='morethanone':for filestr in values:newdir = os.path.join(rootdir,testdestdir,filestr)os.makedirs(newdir)srcfile = open(os.path.join(newdir,filestr+testfileext),'w')srcfile.write(filestr+'destfile')srcfile.close()srcfile = open(os.path.join(rootdir,testdestdir,filestr+testfileext),'w')srcfile.write(filestr+'destfile')srcfile.close()findandreplace.findandreplace(os.path.join(rootdir,testsrcdir),os.path.join(rootdir,testdestdir)) Python真是提⾼效率的利器哈.。
Linux命令高级技巧使用sed进行文本替换在Linux系统中,使用命令行是非常常见和重要的操作方式。
而其中一个强大的命令就是sed。
sed是一种流编辑器,可以用来对文本进行一些高级的处理和替换操作。
本文将介绍如何使用sed命令进行文本替换,旨在提供一些高级技巧来帮助用户更好地利用sed命令。
一、sed命令简介sed是一种非交互式的文本编辑器,主要用于对数据流进行替换、删除、新增、查找等操作。
其命令格式如下:sed [选项] 'script' [文件]其中,选项用于设置sed的执行环境和一些参数,script是一个或多个sed命令组成的脚本,文件是待处理的文本文件。
二、文本替换示例1. 简单的文本替换我们首先来看一个最简单的例子,将文件中的"old"替换为"new"。
假设文件名为"example.txt",其内容如下:```This is an old file.```我们可以使用如下命令进行替换:```sed 's/old/new/' example.txt```执行上述命令后,输出的结果如下:```This is an new file.```可以看到,sed成功将"old"替换为"new"。
2. 全局替换有时候,我们希望将文本中所有匹配的字符串都替换掉,而不仅仅是第一个匹配项。
这时可以使用全局替换选项"g"。
例如,我们希望将文件"example.txt"中所有的"old"替换为"new",可以使用如下命令:```sed 's/old/new/g' example.txt```执行上述命令后,输出的结果如下:```This is an new file.```可以看到,所有的"old"都被成功替换为"new"。
替换运行中的文件文章作者:Dance fireat 263 dot net这是今天瞎琢磨的一点收获。
一、引入凡事总喜欢刨根问底,一直问自己为什么,问到实在没什么可问了为止,当然也有问到自己是在懒得再问了为止的时候。
因为一个软件的自动更新老出问题,有时候出现无法自动更新,分析后发现原来是在替换正在运行的程序时出了问题。
无知的我就开始对替换正在运行中的程序的方法进行分析。
虽大言不惭自称深入浅出,其实只不过对一个问题想深入进去,分析到自己因技术不佳无法继续分析的时候,浅浅的出来而已。
但是仍旧希望这篇文章能够对和我一样思考这个问题的人有一点点帮助。
言归正传,首先从xf ocus的bgate的文章《在Win2000/XP上安静地替换正在使用的系统文件》中获得启发。
他对替换正在使用的系统文件进行了研究,分析了微软的一个工具za p,这个工具可以替换系统文件。
经过分析后,这个工具其实是先把正在使用的文件移动到一个临时目录中去,然后再把这个文件删除,但是标记为下次启动的时候删除。
此时系统文件目录已经腾出了空间,这样再把新的文件移动过来就可以了。
实现部分代码示意如下:if(szFi leToD el[1] == ':'){spr intf(cTemp PathN ame,"%c:\\", s zFile ToDel[0]);}el se{ GetM odule FileN ame(N ULL,cFile Name, 0x100); spri ntf(c TempP athNa me, "%c:\\", cF ileNa me[0]);}if(G etTem pFile Name(cTemp PathN ame,"_@", 0, c TempF ileNa me) == 0)retur n FAL SE; i f(Mov eFile Ex(sz FileT oDel, cTem pFile Name, MOVE FILE_REPLA CE_EX ISTIN G) == 0) r eturn FALS E;if(Move FileE x(cTe mpFil eName, NUL L, MO VEFIL E_DEL AY_UN TIL_R EBOOT) ==0) re turnFALSE;if(MoveF ileEx(szSr cFile, cTe mpPat hName) ==0) re turnFALSE;其中winb ase.h:#d efine MOVE FILE_REPLA CE_EX ISTIN G 0x00000001#defi ne MO VEFIL E_COP Y_ALL OWED 0x00000002#d efine MOVE FILE_DELAY_UNTI L_REB OOT 0x00000004#defi ne MO VEFIL E_WRI TE_TH ROUGH 0x00000008二、Mov eFile Ex分析为了了解MoveF ileEx()到底是如何在下次重新启动的时候进行的文件移动操作的,我查阅了操作系统源代码。
Linux命令高级技巧如何使用sed进行文本替换sed(Stream Editor)是一款强大的 Linux 命令行文本处理工具,它能够实现对文件内容进行替换、删除、插入等操作。
本文将介绍 sed 命令的基本使用方法并重点讲解如何使用 sed 进行文本替换。
一、sed 命令简介sed 是一款针对文本处理的流编辑器,它读取文件的内容,根据用户指定的命令进行处理,并将结果输出。
sed 命令在 Linux 系统中非常常用,可以用于批量修改文本文件、数据流的转换等操作。
sed 命令的语法格式如下:sed [options] 'command' file其中,options 为可选参数,command 为 sed 命令,file 为待处理的文件名。
二、sed 替换文本的基本用法sed 命令的替换功能是其最常用的功能之一,其基本用法如下:```sed 's/old/new/' file```上述命令将会用 new 替换文件 file 中每行第一个匹配到的 old。
三、使用正则表达式进行替换sed 命令支持正则表达式的使用,可以根据自定义的匹配规则进行替换。
下面是几个常用的正则表达式替换示例:1. 在每行开头添加字符串:```sed 's/^/new_text/' file```该命令会将 file 中每行的开头添加 new_text。
2. 在每行末尾添加字符串:```sed 's/$/new_text/' file```该命令会将 file 中每行的末尾添加 new_text。
3. 替换指定行的内容:```sed '10s/old/new/' file```该命令会将 file 中第 10 行中的第一个匹配到的 old 字符串替换为new。
四、替换全文匹配到的内容sed 命令默认只替换每行第一个匹配到的内容,如果想要替换全文匹配到的内容,可以使用 g 标志。
Shell脚本编写的高级技巧使用命令替换来进行文件操作Shell脚本编写的高级技巧:使用命令替换来进行文件操作在Shell脚本编写和运行的过程中,使用合适的技巧可以提高效率和准确性。
其中,命令替换是一种常用的技巧,可以用于文件操作中的路径获取、文件名处理以及需要使用命令结果作为变量等场景。
本文将介绍Shell脚本编写中使用命令替换进行文件操作的高级技巧。
一、获取文件路径在Shell脚本中,有时需要获取当前脚本所在的文件路径,或者获取指定文件的路径。
使用命令替换可以方便地获取这些信息,以下是几种常见的应用场景和示例代码:1. 获取当前脚本所在的文件路径:```shellscript_path=$(cd "$(dirname "$0")" && pwd)```首先,使用`dirname "$0"`获取当前脚本的目录路径,然后使用`cd`命令进入该目录并使用`pwd`命令获取当前目录的完整路径,最后将结果赋值给`script_path`变量。
2. 获取指定文件的路径:```shellfile_path=$(readlink -f "filename")```使用`readlink`命令结合参数`-f`,可以获取指定文件的绝对路径。
将文件名替换为实际的文件名即可。
二、处理文件名在文件操作中,有时需要对文件名进行处理,比如修改文件名的后缀、批量重命名等。
命令替换可以帮助我们实现这些操作,以下是几种常见的应用场景和示例代码:1. 修改文件名后缀:```shellnew_file="${file/%.txt/.csv}"```使用`${file/%.txt/.csv}`将文件名`${file}`的`.txt`后缀替换为`.csv`后缀,并将结果赋值给`new_file`变量。
2. 批量重命名文件:```shellfor file in *.txt; donew_file="${file/%.txt/.csv}"mv "$file" "$new_file"done```使用`for`循环遍历所有后缀为`.txt`的文件,然后将文件名的后缀替换为`.csv`后缀,并使用`mv`命令进行重命名。
python文件内容替换Python文件内容替换。
在Python编程中,文件操作是非常常见的操作之一,而文件内容替换是文件操作中的一个重要部分。
在实际开发中,我们经常需要对文件中的内容进行替换操作,比如替换某个字符串、替换某些特定格式的数据等。
本文将介绍如何使用Python来实现文件内容的替换操作。
首先,我们需要了解Python中的文件操作。
Python提供了丰富的文件操作函数,可以轻松实现文件的读取、写入、追加等操作。
在进行文件内容替换之前,我们需要先打开文件,并将文件内容读取到内存中。
这可以通过Python的open函数来实现,具体代码如下:```python。
file = open('example.txt', 'r')。
content = file.read()。
file.close()。
```。
上面的代码中,我们使用open函数打开了一个名为example.txt的文件,并指定了打开模式为'r',表示读取文件内容。
然后使用read方法将文件内容读取到了变量content中,最后使用close方法关闭了文件。
接下来,我们可以对文件内容进行替换操作。
假设我们需要将文件中的某个字符串进行替换,可以使用Python的字符串替换函数replace来实现。
具体代码如下:```python。
new_content = content.replace('old_string','new_string')。
```。
上面的代码中,我们使用replace方法将content中的old_string替换为new_string,并将替换后的内容保存到了变量new_content中。
除了简单的字符串替换,有时我们还需要对文件中的特定格式的数据进行替换。
比如,我们需要将文件中的所有数字替换为0,可以使用正则表达式来实现。
具体代码如下:```python。
linux批量替换文件内容Linux批量替换文件内容。
在Linux系统中,有时我们需要对多个文件进行批量替换内容,这可能是因为需要统一修改某个变量、修复某个错误或者更新某个配置等。
本文将介绍在Linux 系统中如何使用命令行批量替换文件内容的方法。
首先,我们需要使用到一个非常强大的命令行工具——sed。
sed是一个流式文本编辑器,可以用来对文本进行替换、删除、插入等操作。
下面是使用sed命令进行批量替换文件内容的基本语法:```shell。
sed -i 's/原内容/新内容/g' 文件名。
```。
其中,-i表示直接修改文件内容,而不是在标准输出中显示结果;s表示替换操作;原内容是需要被替换的内容;新内容是替换后的内容;g表示全局替换,即一行中的所有匹配项都会被替换;文件名是需要进行替换操作的文件名。
接下来,我们将通过一个具体的例子来演示如何使用sed命令进行批量替换文件内容。
假设我们有一个目录,里面有多个以.txt为后缀的文件,它们都包含了一些旧的字符串"Hello World",我们需要将这些文件中的"Hello World"全部替换为"Goodbye World"。
我们可以使用以下命令来实现:```shell。
sed -i 's/Hello World/Goodbye World/g' .txt。
```。
这条命令将会批量替换所有以.txt为后缀的文件中的"Hello World"为"Goodbye World",并且直接修改文件内容。
除了使用sed命令外,我们还可以使用find命令结合xargs命令来实现批量替换文件内容。
find命令可以用来查找文件,而xargs命令可以将find命令的输出作为参数传递给sed命令。
下面是使用find和xargs命令进行批量替换文件内容的方法:```shell。
Linux下文本替换详解,绝对经典我们看一下sed 最有用的命令之一,替换命令。
使用该命令,可以将特定字符串或匹配的规则表达式用另一个字符串替换。
下面是该命令最基本用法的示例:$ sed -e ‘s/foo/bar/’ myfile.txt上面的命令将myfile.txt 中每行第一次出现的‘foo’(如果有的话)用字符串‘bar’ 替换,然后将该文件内容输出到标准输出。
请注意,我说的是每行第一次出现,尽管这通常不是您想要的。
在进行字符串替换时,通常想执行全局替换。
也就是说,要替换每行中的所有出现,如下所示:$ sed -e ‘s/foo/bar/g’ myfile.txt在最后一个斜杠之后附加的‘g’ 选项告诉sed 执行全局替换。
关于‘s///’ 替换命令,还有其它几件要了解的事。
首先,它是一个命令,并且只是一个命令,在所有上例中都没有指定地址。
这意味着,’s///’ 还可以与地址一起使用来控制要将命令应用到哪些行,如下所示:$ sed -e ’1,10s/enchantment/entrapment/g’ myfile2.txt上例将导致用短语‘entrapment’ 替换所有出现的短语‘enchantment’,但是只在第一到第十行(包括这两行)上这样做。
$ sed -e ‘/^$/,/^END/s/hills/mountains/g’ myfile3.txt该例将用‘mountains’ 替换‘hills’,但是,只从空行开始,到以三个字符‘END’ 开始的行结束(包括这两行)的文本块上这样做。
关于‘s///’ 命令的另一个妙处是‘/’ 分隔符有许多替换选项。
如果正在执行字符串替换,并且规则表达式或替换字符串中有许多斜杠,则可以通过在‘s’ 之后指定一个不同的字符来更改分隔符。
例如,下例将把所有出现的/usr/local 替换成/usr:$ sed -e ‘s:/usr/local:/usr:g’ mylist.txt在该例中,使用冒号作为分隔符。
替换运行中的文件(深入浅出)文章作者:Dancefire at 263 dot net这是今天瞎琢磨的一点收获。
一、引入凡事总喜欢刨根问底,一直问自己为什么,问到实在没什么可问了为止,当然也有问到自己是在懒得再问了为止的时候。
因为一个软件的自动更新老出问题,有时候出现无法自动更新,分析后发现原来是在替换正在运行的程序时出了问题。
无知的我就开始对替换正在运行中的程序的方法进行分析。
虽大言不惭自称深入浅出,其实只不过对一个问题想深入进去,分析到自己因技术不佳无法继续分析的时候,浅浅的出来而已。
但是仍旧希望这篇文章能够对和我一样思考这个问题的人有一点点帮助。
言归正传,首先从xfocus的bgate的文章《在Win2000/XP上安静地替换正在使用的系统文件》中获得启发。
他对替换正在使用的系统文件进行了研究,分析了微软的一个工具zap,这个工具可以替换系统文件。
经过分析后,这个工具其实是先把正在使用的文件移动到一个临时目录中去,然后再把这个文件删除,但是标记为下次启动的时候删除。
此时系统文件目录已经腾出了空间,这样再把新的文件移动过来就可以了。
实现部分代码示意如下:if(szFileToDel[1] == ':'){sprintf(cTempPathName, "%c:\\", szFileToDel[0]);}else{GetModuleFileName(NULL, cFileName, 0x100);sprintf(cTempPathName, "%c:\\", cFileName[0]);}if(GetTempFileName(cTempPathName, "_@", 0, cTempFileName) == 0)return FALSE;if(MoveFileEx(szFileToDel, cTempFileName, MOVEFILE_REPLACE_EXISTING) == 0)return FALSE;if(MoveFileEx(cTempFileName, NULL, MOVEFILE_DELAY_UNTIL_REBOOT) == 0)return FALSE;if(MoveFileEx(szSrcFile, cTempPathName) == 0)return FALSE;其中winbase.h:#define MOVEFILE_REPLACE_EXISTING 0x00000001#define MOVEFILE_COPY_ALLOWED0x00000002#define MOVEFILE_DELAY_UNTIL_REBOOT0x00000004#define MOVEFILE_WRITE_THROUGH0x00000008二、MoveFileEx分析为了了解MoveFileEx()到底是如何在下次重新启动的时候进行的文件移动操作的,我查阅了操作系统源代码。
1、MoveFileEx()实际上是调用的MoveFileWithProgressW(),只不过NULL了两个回调参数。
2、MoveFileWithProgressW()中针对dwFlag=MOVEFILE_DELAY_UNTIL_REBOOT的,调用了BasepMoveFileDelayed()函数3、BasepMoveFileDelayed()是通过修改注册表的方法,让操作系统重新启动时进行文件操作的。
它修改的键值是HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenam eOperations 这是一个REG_MULTI_SZ的键值。
格式是:szDstFile\0\0szSrcFile\0szDstFile\0\0szSrcFile\0!szDstFile\0\0有些文章中所说的源文件和目标文件中间是换行,这并不是最合理的,虽然也可以,中间是Unicode的\0,也就是00 00 而且需要注意的是,如果指定了MOVEFILE_REPLACE_EXISTING属性的话,目标文件前会加注一个叹号。
这个键值我是在分析完源代码后,才发现原来MSDN中已经给出这个键值了。
后来我打开我的这个键值,发现里面有一堆,还没有来得及删除的文件,在等着我下一次重新启动的时候删除呢。
根据关于MOVEFILE_DELAY_UNTIL_REBOOT的解释,操作系统会在系统重新启动的时候,在Autochk检查完成后,并且在建立任何PageFile文件之前,立即进行指定的文件移动。
而且要确保所要操作的文件能够被LocalSystem或者管理员组所操作。
我同时也注意到了另外一个我不熟悉的问题,就是为什么文件被移动了,但是应用程序还可以继续执行,而删除则不行。
我没有细考虑这个问题,但是我感觉一定是有什么东西没有变化,比如某种链接。
虽然位置变了,但是链接依旧能够跟踪到映像的位置,所以所有指向该链接的操作都是生效的。
但是删除文件的时候,该链接就会被删除,从而会导致操作失败,为了避免这种失败,所以禁止删除正在被占用的文件。
三、操作系统启动过程中相关操作关注了一下NT的启动过程,想了解系统在启动的时候是如何执行上面提到的移动或者删除行为的。
在初始化内核阶段,ntoskrnl.exe从NTLDR手中接管了控制权,在最后一步,Session Manager启动了Windows XP的高级子系统以及服务,Session Manager启动控制所有输入、输出设备以及访问显示器屏幕的Win32子系统以及Winlogon进程,初始化内核完毕。
Session Manager实际上就是smss.exe,我们经常可以在内存进程中看到他的身影。
反汇编的时候,在sub_48584D01中看到XP有考虑识别的CPU有:0 x861 MIPS2 ALPHA3 PPC4 IA645 ALPHA64other UNKNOWN我在smss.exe里面找到了PendingFileRenameOperations,可见应该是此文件负责了在引导的时候执行其中的文件移动操作。
只可惜,我没有找到何处调用了PendingFileRenameOperations,反汇编功底不佳啊。
从中看到一段关于Session Manager调用PendingFileRenameOperations的话[/ntw2k/info/regboot.shtml]After you pass the point in the log where boot and system driver initialization is complete you'll begin to see records created by the smss.exe process, which is called the Session Manager. Session Manager is the first user-mode process launched during a boot. You'll see it immediately check to see if there are any rename operations it should perform before the system is up and running by looking at the value HKLM\System\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations. Next you'll see it determine what DOS device mappings it should create (e.g. COM1, LPT1), what environment variables are defined, what DLL's it "knows about" (standard DLLs in the system32 directory), and which protected subsystems it should start (e.g. OS/2, POSIX).Session Manager typically launches Chkdsk (autocheck.exe), which is specified in the Session Manager's BootExecute value along with direction to run other boot-time native applications. After Autocheck finishes Session Manager starts Winlogon and the Win32 subsystem (CSRSS.EXE). Both of these generate interleaved Registry accesses as they start up concurrently. Winlogon can be seen querying the .Default key's display settings, including colors and mouse settings under HKU\.Default\Control Panel. The .Default key's contents are user preferences that are active when no one is logged in, and Winlogon uses them for the screen on which it displays the logon dialog box.不过这个和微软所说的先Autochk,然后再PendingFileRenam eOperations,不同。
从另一份文档中(/brittanyfoo/BootProcess.html),提到了初始化进程问题:Smss 的主线程进行以下的初始化步骤:1、创建LPC 端口对象( \SmApiPort )和两个等待客户请求的线程。
客户请求包括装载一个新的子系统或者创建一个会话等。
2、为MS-DOS 设备名,如COM1 和LPT1 定义符号链接。
3、如果安装了终端服务(Terminal Services),在对象管理器的名字空间创建\Sessions 目录。