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

有關檔案分割的一段程式碼,有兩點疑惑……

尚未結案
wnnnnnn6
一般會員


發表:5
回覆:11
積分:3
註冊:2004-11-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-30 15:53:13 IP:61.182.xxx.xxx 未訂閱
下面是一段檔案分割的程式碼,我有兩點疑惑,請大家幫幫我!
procedure TForm1.Button3Click(Sender: TObject); //分割檔案
//下面程式中edit1.text是分割單位、edit2.Text是要分割的檔案、edit3.Text是分割後存放的位置
var
i,k,rest,len:integer;
af,bf:TFileStream;
Fn:string;    //檔名
buf:integer;//單卷容量
begin
if (edit2.Text='') or (edit3.Text='') then
  begin
  beep;
  exit;
  end;
// 單卷容量計算爲位元組
buf:=strtoint(edit1.Text)*1024;
i:=1;
try
  AF:=TFileStream.Create(edit2.Text,fmopenread);
  k:=Af.Size div buf;
  Rest:=af.Size-k*buf;
  for i:=1 to k do
  begin
    fn:=edit3.Text inttostr(i) '.spt'; //設定檔名
    bf:=Tfilestream.Create(fn,fmcreate);
    bf.CopyFrom(af,buf);
    listbox1.Items.Add(fn);
    bf.Free;
  end;
  if rest>0 then     
  begin
     fn:=edit3.Text inttostr(i) '.spt';
     bf:=tfilestream.Create(fn,fmcreate);
     bf.CopyFrom(af,rest);
     bf.Free;
     listbox1.Items.Add(fn);
  end;
finally
af.Free;
end;
end;
我的問題是: 1、rest=0和rest>0分別指哪兩種情況?{我的理解是:依上面k:=Af.Size div buf; Rest:=af.Size-k*buf;來看:rest一定等於0。怎麼還有>0的情況呢?我認爲rest>0的情況根本就不會執行。爲什麼教科書上還要寫上rest>0的情況呢?而且去掉rest>0的這段程式碼,程式將提示:Division by Zero的錯誤!莫名其妙!} 2、程式執行後,選擇每一個分割後的WORD文檔都無法開啓。提示:文檔的名稱和路徑無效。而且所有分割後的文檔的總位元數與分割前的哪個文檔的大小不一樣。 哪位大哥能幫我解釋一下?先謝謝了!
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-30 16:23:28 IP:61.222.xxx.xxx 未訂閱
rest>0 是必然的。 k:=Af.Size div buf; Rest:=af.Size-k*buf; 1. Buf 為 1024 的倍數。 2. k 所得到為整除商數。Reset 為餘數。 至於最後一項,不是很瞭解您的意思。 分割後的檔案,當然是無法開啟。
wnnnnnn6
一般會員


發表:5
回覆:11
積分:3
註冊:2004-11-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-30 17:33:20 IP:61.182.xxx.xxx 未訂閱
謝謝您!我理解這段程式碼的含義了。 能否借此機會再問您一個問題呀? 有一段程式碼,是關於檔案時間格式轉換的。裡面有幾個“時間”的概念,我不太理解,您能給我解釋一下嗎?    
//轉換檔案的時間格式 
function covFileDate(FileDate:FileTime): TDateTime;
var
Tct:systemtime;
Temp:filetime;
begin
  begin
   FileTimeToLocalFileTime(filedate,temp);
   //function FileTimeToLocalFileTime(const lpFileTime: TFileTime; var lpLocalFileTime: TFileTime): BOOL; stdcall;
   filetimeTosystemtime(temp,tct);
   covfileDate:=systemTimetoDateTime(tct);
  end;
end;
有幾個時間:FileTime(dos時間)、LocalFileTime、SystemTime、DateTime(Delphi時間)、DosDateTime.請問這幾個時間的含義是什麼?它們都有什麼區別呢?
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-01 14:56:18 IP:61.31.xxx.xxx 未訂閱
FileTime 為檔案儲存的時間格式。 使用UTC(Coordinated Universal Time)來記載時間(以千萬分之一秒為單位),從1601.1.1開始使用兩個DWORD來記錄時間。 LocalFileTime 指的是本時區的檔案時間。 SystemTime 系統時間 結構。是以 年份、月份、週期、日、時、分秒、百萬秒 WORD來記錄時間。 DateTime Delphi 常用的為日期時間單位。結構為 Double 型態。 即 整數部分為 日期,小數點為 時間。 因此,需要轉換一下格式。 FileTimeToLocalFileTime 將檔案時間轉換為本時區的檔案時間。 FileTimeToSystemTime 將檔案時間轉換為系統時間。 SystemTimetoDateTime 將TSystemTime轉換為TDateTime格式。 大致上是這樣,其餘您可以參考 Help 有說明。 發表人 - wameng 於 2004/12/01 15:05:50
wnnnnnn6
一般會員


發表:5
回覆:11
積分:3
註冊:2004-11-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-01 15:48:20 IP:61.182.xxx.xxx 未訂閱
謝謝您!
系統時間:2024-07-02 17:28:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!