線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1629
推到 Plurk!
推到 Facebook!

拷貝檔案又要修改資料, 怎麼做才會快?

答題得分者是:jow
Arnor
一般會員


發表:28
回覆:29
積分:16
註冊:2006-10-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-03-22 19:00:34 IP:122.116.xxx.xxx 未訂閱
開兩個檔案宣告為  A, B : file
我要把 A 去掉頭兩行, 拷到 B 去, 怎麼做會是最快的方式呢?
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-03-22 20:02:38 IP:122.126.xxx.xxx 訂閱
filestream
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-03-23 08:25:31 IP:59.125.xxx.xxx 訂閱
以基本運作來看
你只是要去掉前兩行,這與 Copy 並無相衝突

進一步說,也沒關係,Copy 就是讀出 A 寫入 B
那不要讀前兩行,由第三行開始複製,不就是 「去掉頭兩行, 拷到 B 去」?

實際作法,看你高興
RootKit 建議使用的方式不錯,如果你覺得不安穩,也可以用 原始的做法 fileopen,或是嫌程式碼太短,可以用 MemoryMapping
需要快速複製,直接使用 ASM 實作,都可以

===================引 用 Arnor 文 章===================
開兩個檔案宣告為A, B: file
我要把 A 去掉頭兩行, 拷到 B 去, 怎麼做會是最快的方式呢?
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-03-23 09:25:08 IP:112.104.xxx.xxx 未訂閱
幾種做法供你參考
因為沒有實際檔案測試
請依需要自行修改

[code delphi]
//文字檔
procedure TfrmMain.Button1Click(Sender: TObject);
var
L: TStringList;
begin
if FileExists('SOURCE') then
begin
L := TStringList.Create;
try
L.LoadFromFile('SOURCE');
L.Delete(0);
L.Delete(0);
L.SaveToFile('DESTINATION');
finally
FreeAndNil(L);
end;
end;
end;

//Bianry File: record by record
procedure TfrmMain.Button2Click(Sender: TObject);
type
T_r = packed record
A: Integer;
B: Integer;
end;
var
M,N: TMemoryStream;
r: T_r;
begin
if FileExists('SOURCE') then
begin
M := TMemoryStream.Create;
try
M.LoadFromFile('SOURCE');
N := TMemoryStream.Create;
try
M.Seek(SizeOf(r)*2,0);
while M.Position if M.Read(r,SizeOf(r))=SizeOf(r) then
N.Write(r,SizeOf(r));
N.SaveToFile('DESTINATION');
finally
FreeAndNil(N);
end;
finally
FreeAndNil(M);
end;
end;
end;

//Bianry File: batch write
procedure TfrmMain.Button3Click(Sender: TObject);
type
T_r = packed record
A: Integer;
B: Integer;
end;
var
M,N: TMemoryStream;
p: Pointer;
begin
if FileExists('SOURCE') then
begin
M := TMemoryStream.Create;
try
M.LoadFromFile('SOURCE');
p := Pointer(Integer(M.Memory) SizeOf(T_r)*2);
N := TMemoryStream.Create;
try
N.Write(p^,M.Size-SizeOf(T_r)*2);
N.SaveToFile('DESTINATION');
finally
FreeAndNil(N);
end;
finally
FreeAndNil(M);
end;
end;
end;

//Bianry File: use memory move
procedure TfrmMain.Button4Click(Sender: TObject);
type
T_r = packed record
A: Integer;
B: Integer;
end;
var
M: TMemoryStream;
p: Pointer;
begin
if FileExists('SOURCE') then
begin
M := TMemoryStream.Create;
try
M.LoadFromFile('SOURCE');
p := Pointer(Integer(M.Memory) SizeOf(T_r)*2);
Move(p^,M.Memory^,M.Size-SizeOf(T_r)*2);
M.Size := M.Size-SizeOf(T_r)*2;;
M.SaveToFile('DESTINATION');
finally
FreeAndNil(M);
end;
end;
end;

[/code]

系統時間:2024-04-20 16:54:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!