关于文件操作的问题(100分)

  • 主题发起人 bobbycpu
  • 开始时间
B

bobbycpu

Unregistered / Unconfirmed
GUEST, unregistred user!
如果用二进制读出一个正在打开文件,有什么好的办法吗?谢谢大家!
最好有范例!
 
fileopen(filename, fmOpenRead or fmShareDenyNone);
 
var ff:tfilestream;
buf:pchar;
begin
ff:=tfilestream.create('文件',fmShareDenyNone);
getmem(buf,ff.size);
ff.read(buf^,ff.size);
end;
 
请继续下去吗?如何在写入一个文件,另外,我有问一下,如果这个文件有120M左右大小,写入
大概要多少时间?谢谢!
 
那么大?用 TFileStream 好了,要是觉得慢,就用 FileMapping。

 
To beta :
什么是FileMapping?
 
时间和写的方法有关。
 
用Win32的文件映射就快吗?
 
能再详细点用代码说一下Win32的映射文件吗?谢谢!
 
CreateFileMapping 其实应该没有关系!

以下供参考.

procedure TForm1.Button1Click(Sender: TObject);
var
s,FHeader:string;
f,map:Thandle;
p:pointer;
pDOSHeader :pIMAGEDOSHEADER ;
pNTHeader :pIMAGENTHEADERS ;
ntOff:longInt;
nS,i,RVA:integer;
tt:TTimeStamp;
pis:pIMAGESECTIONHEADER ;
pImport:pIMAGE_IMPORT_DESCRIPTOR;

pTHUNK:pIMAGE_THUNK_DATA;
pIMPORTNAME:pIMAGE_IMPORT_BY_NAME;
begin
if not(dg1.execute) then exit;
s:=dg1.filename;
try
button2.click;
memo1.clear;
f:=CreateFile(pchar(s),GENERIC_READ ,0,
nil,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,0);
Map:=CreateFileMapping(F,NiL,PAGE_READONLY,0,0,Nil);
p:=MapViewOfFile(Map,FILE_MAP_READ,0,0,0);
//p:=pointer(getmodulehandle('C:/My Documents/setnetpath.exe'));

if not(showname) then
p:=pointer(getmodulehandle(nil));

pDosHeader:=PIMAGEDOSHEADER(p);

//showmessage(inttohex(pDosHeader.e_magic,8));
// showmessage(inttostr(pDosHeader._lfanew));
ntOff:=pDosHeader._lfanew;
pNTHeader:=PIMAGENTHEADERS(dword(p)+ntOff);
// showmessage(inttohex(pntHeader.Signature,8));
fHeader:='Machine:0x'+inttohex(pntHeader.FileHeader.Machine ,8);
fHeader:=fHeader+#13#10+'NumberOfSections:'+inttostr(pntHeader.FileHeader.NumberOfSections);

nS:=pntHeader.FileHeader.NumberOfSections;

tt.Time :=HiWord(pntHeader.FileHeader.TimeDateStamp);
tt.Date :=LoWord(pntHeader.FileHeader.TimeDateStamp);

fHeader:=fHeader+#13#10+'TimeDateStamp:'+DateTimeToStr(TimeStampToDateTime(tt));
fHeader:=fHeader+#13#10+'SizeOfOptionalHeader:'+inttostr(pntHeader.FileHeader.SizeOfOptionalHeader);
fHeader:=fHeader+#13#10+'Characteristics:0x'+inttohex(pntHeader.FileHeader.Characteristics,8);
// showmessage(fheader);
memo1.Lines.Add(fheader);
memo1.Lines.Add('========');

fHeader:='AddressOfPoint RVA:0x'+inttohex(pntHeader.OptionalHeader.AddressOfEntryPoint,8);
fHeader:=fHeader+#13#10+'ImageBase:0x'+inttohex(pntHeader.OptionalHeader.ImageBase,8);
fHeader:=fHeader+#13#10+'SectionAlignment:0x'+inttohex(pntHeader.OptionalHeader.SectionAlignment,8);
fHeader:=fHeader+#13#10+'FileAlignment:0x'+inttohex(pntHeader.OptionalHeader.FileAlignment,8);
fHeader:=fHeader+#13#10+'SubsystemVersion:'+inttostr(pntHeader.OptionalHeader.MajorSubsystemVersion)+'.'+inttostr(pntHeader.OptionalHeader.MinorSubsystemVersion);
fHeader:=fHeader+#13#10+'SizeOfImage:0x'+inttohex(pntHeader.OptionalHeader.SizeOfImage,8);

fHeader:=fHeader+#13#10+'SizeOfHeaders:0x'+inttohex(pntHeader.OptionalHeader.SizeOfHeaders,8);

// showmessage(fheader);
//SHOWMESSAGE(INTTOSTR(sizeof(IMAGE_NT_HEADERS)+NToFF ))
//248 448 504
memo1.Lines.Add(fheader);


fHeader:='Import VirtualAddress:0x'+inttohex(pntHeader.OptionalHeader.DataDirectory[1].VirtualAddress ,8);
fHeader:=fHeader+#13#10+' Size:0x'+inttohex(pntHeader.OptionalHeader.DataDirectory[1].size ,8);
memo1.Lines.Add(fheader);

memo1.lines.add(SectionName(pIMAGESECTIONHEADER(dword(pNTHeader)+sizeof(IMAGE_NT_HEADERS)),ns));


RVA:=RvaToOffset(p,pntHeader.OptionalHeader.DataDirectory[1].VirtualAddress);
pImport:=pIMAGE_IMPORT_DESCRIPTOR(dword(p)+RVA);

memo1.Lines.Add('=====================================');
memo1.Lines.Add('=====================================');



//inc(pImport);
while pImport.name>0 do
begin
Rva:=RvaToOffset(p,pImport.name);
//showmessage('Ok');
s:=pchar(dword(p)+rva);
s:=s+#13#10+' OriginalFirstThunk: 0x'+inttohex(pImport.OriginalFirstThunk,8);
s:=s+#13#10+' FirstThunk: 0x'+inttohex(pImport.FirstThunk,8);

rva:=RvaToOffset(p,pImport.FirstThunk);
memo1.lines.add(s);

pThunk:=pImage_thunk_data(dword(p)+rva);
i:=0;
while pThunk.pname>0 do
begin
if not(hooked) and (pthunk.pname=pp) then
begin
pthunk.pname:=dword(@MyMsg);
//showmessage('OkKKKKKK');
end;

if (hooked) and (pthunk.pname=dword(@MyMsg)) then
begin
pthunk.pname:=pp;
//showmessage('OkKKKKKK');
end;

if not(showname) then
begin
memo1.lines.add(inttostr(i)+' '+inttohex(pthunk.pname,8));
end
else
begin
rva:=RvaToOffset(p,pThunk.pname);
pImportName:=pIMAGE_IMPORT_BY_NAME(dword(p)+rva);
// showmessage(pchar(@pImportName.name));
s:=inttostr(i)+' **** '+pchar(@pImportName.name);
memo1.lines.add(s);
// showmessage('Ok');
end;
inc(i);
inc(pThunk);
end;

inc(pImport);
end;

memo1.Lines.Add('=====================================');
memo1.Lines.Add('=====================================');

hooked:=not(hooked);

if pntHeader.Signature=IMAGE_NT_SIGNATURE
then showmessage('ok')
else showmessage('No!!');
except
showmessage('No!!');
end;
////////////////////
UnmapViewOfFile(p);
closehandle(Map);
closehandle(f);

end;
 
我打个比方,有二个文件一模一样的,当一个文件改变时,这个文件所改动的部分写入另
一个文件去,使二个文件同步,有类似的代码参考一下吗?我准备结贴子了,谢谢大家的
帮忙!
 
所改动的部分? 用fileseek定位然后写入即可。 速度不会慢。
 
有没有范例让我看一下,谢谢!
 
那不就简单了,
判断 if 文件改变 then filecopy(改变了的文件,你要改变的文件);
 
如果是copy的话,大文件会很慢的,机器压力会很重的,而且如果有三个文件改变时,每个文件
120M的吧,我想那会很慢很慢的
 
难道没有人回答我吗?
 
你是不是就想复制文件
 
不,我想文件拼接
 
看看这段代码如何
Procedure ReadWrite();
var SoureFile,DesFile:file;
Buf:Longint;
begin
try
begin
Buf:=10240;
Assignfile(SoureFile,form1.Strpath+'a.exe');
reset(SoureFile,100);
Assignfile(Desfile,form1.Strpath+'a(bak).exe');
rewrite(Desfile,100);
while not Eof(SoureFile) do begin
BlockRead(SoureFile,Buf,SizeOf(Byte));
BlockWrite(DesFile,Buf,SizeOf(Byte));
end;
CloseFile(SoureFile);
CloseFile(DesFile);
end;
except
CloseFile(SoureFile);
CloseFile(DesFile);
end;
Showmessage('Copy OK');
end;
 
顶部