本帖最后由 冥界3大法王 于 2024-10-28 17:55 编辑
有以下两个纯文本文件:
内容如下:
一个叫: Win7x64开发x64dbg.vmx
假设1 = 不能没有你
.encoding = "GBK"
displayName = "Win7x64开发x64dbg"
config.version = "8"
virtualHW.version = "18"
mks.enable3d = "TRUE"
pciBridge0.present = "TRUE"
pciBridge4.present = "TRUE"
pciBridge4.virtualDev = "pcieRootPort"
pciBridge4.functions = "8"
pciBridge5.present = "TRUE"
pciBridge5.virtualDev = "pcieRootPort"
一个叫:过VMWare检测.vmx
假设1 = 我们来了
cpuid.1.eax = "00000000000000110000011011100100"
假设2 = 你好你好
cpuid.1.ecx = "0--------------0----------------"
cpuid.1.edx = "-----------0---------0----------"
要求是这个样子的:【对比 过VMWare检测.vmx】的 键(=前面的内容) 与 【 Win7x64开发x64dbg.vmx的键 (=前面的内容) 是否相同】
若是相同,就用 过VMWare检测.vmx 的 值 替换 Win7x64开发x64dbg.vm 的值
绿色部分呢,写入到 Win7x64开发x64dbg.vmx 的文件中。。。
折腾3天才算自己折腾明白,惭愧啊。
开始的思路是这样的,先弄一个按行读取文件的循环,得到行内容 ,再分割 得 到 键 与 值
下面再套一个循环 ,分别对比。。。
后来发现写的代码有问题,要么是有重的,要么是该加的没加进来。。。
后来第二天想了一个办法。。。第二重循环中 我去调用 过程,这样就能避免菜鸟遇到双循环问题
测试后发现代码越界了。。
方案又搁浅了。。 不想论坛光麻烦别人啊。。。
后来昨天晚上床上认真的又思考了一下:
最终代码如下:
[Delphi] 纯文本查看 复制代码 procedure TForm14.再向虎山行2Click(Sender: TObject);
var
过List: TStringList;
过I: integer;
过检List: TStringlist;
match: TMatch;
Reader: TStreamReader;
过检档案: string;
替换后的内容1, 替换后的内容2: string;
begin
Memo1.Clear;
过List := TStringList.Create;
过List.LoadFromFile('过VMWare检测.vmx');
过检List := TStringList.Create;
for 过I := 0 to 过List.Count - 1 do //用传统的按行读取过虚拟机文件
begin
// ShowMessage(过List.Strings[过I]); //这里是得到的行内容!
过检List.Delimiter := '=';
过检List.StrictDelimiter := True;
过检List.DelimitedText := 过List[过I];
// ShowMessage(过检List[0]); //这里是得到的 过检的【键】(值是不需要的)
Reader := TStreamReader.Create('Win7x64开发x64dbg.vmx', TEncoding.ANSI);
过检档案 := Reader.ReadToEnd();
match := TRegEx.match(过检档案, 过检List[0] + '.*'); //用这里的键作为正则表达式(与 待修改文件 整体 进行正则 匹配)
if (match.Success) then //如果匹配到 过虚拟机检测文件的 那行
begin
ShowMessage(match.Value);
Memo1.Text := TRegEx.Replace(过检档案, 过检List[0] + '.*', 过List.Strings[过I]); //替换 待改文件的 那行
替换后的内容1 := TRegEx.Replace(过检档案, 过检List[0] + '.*', 过List.Strings[过I]);
TFile.ReadAllText('Win7x64开发x64dbg.vmx', TEncoding.ANSI);
TFile.WriteAllText('Win7x64开发x64dbg1.vmx', 替换后的内容1, TEncoding.ANSI); //改个名保存 覆盖替换 待改文件,不然文件提示被占用
end
else //未匹配成功的键(的那行)
begin
Memo1.Lines.Add(过List.Strings[过I]);
//用过检测文件的其他行(也就是没匹配的那行)写入到待改文件的末尾(Append)追加的方式
替换后的内容2 := #13#10 + 过List.Strings[过I]; //前面加上换行,不然起始行就堆叠一起了。
TFile.ReadAllText('Win7x64开发x64dbg1.vmx', TEncoding.ANSI);
TFile.AppendAllText('Win7x64开发x64dbg1.vmx', 替换后的内容2, TEncoding.ANSI); //第二次保存用追加的方式 ,不然就被覆盖了。
end;
end;
end;
|