本文為 Delphi 6 SysUtils.pas 函數大全系列第三部分,涵蓋 檔案搜尋 (FindFirst/Next/Close)、檔案日期/屬性/唯讀/刪除/重命名/路徑拆解/相對路徑/短檔名/檔案搜尋/磁碟空間、檔案時間編碼互轉、目前目錄操作、目錄建立/刪除/遞迴建立、PChar 緩衝區核心操作 (長度/結尾/移動/複製/連接/比較/掃描/大小寫/轉字串/記憶體管理)、Format 系列格式化核心、浮點數/貨幣轉字串核心 (FloatToText)。
核心函數分類速查
1. 檔案搜尋與屬性管理
| 函數 | 用途 | 關鍵點 |
FindFirst | 開始搜尋 | Attr: faReadOnly, faHidden, faSysFile, faVolumeID, faDirectory, faArchive, faAnyFile |
FindNext | 繼續搜尋 | 成功回傳 0 |
FindClose | 結束搜尋釋資源 | 必須配對呼叫 |
FileGetDate | 取得檔案修改時間 (Handle) | 失敗 -1 |
FileSetDate | 設定檔案修改時間 | 路徑或 Handle 版,成功 0 |
FileGetAttr | 取得檔案屬性 | 失敗 $FFFFFFFF |
FileSetAttr | 設定檔案屬性 | 成功 0 |
FileIsReadOnly | 檢查唯讀 | 不存在視為唯讀 |
FileSetReadOnly | 設定唯讀 | 不存在回 False |
DeleteFile | 刪除檔案 | 不存在回 False |
RenameFile | 重命名 | 不存在回 False |
2. 路徑拆解與轉換
| 函數 | 用途 | 範例 |
ChangeFileExt | 變更副檔名 | 需加點: ChangeFileExt('a.jpg','.bmp')='a.bmp' |
ExtractFilePath | 目錄路徑 (含斜線) | 'C:\Dir\File.txt' → 'C:\Dir\' |
ExtractFileDir | 目錄路徑 (不含斜線) | 'C:\Dir\File.txt' → 'C:\Dir' |
ExtractFileDrive | 磁碟機 | 'C:\Dir' → 'C:' |
ExtractFileName | 純檔名 | 'C:\Dir\File.txt' → 'File.txt' |
ExtractFileExt | 副檔名 (含點) | 'File.txt' → '.txt' |
ExpandFileName | 相對轉完整路徑 | 依目前工作目錄 |
ExpandFileNameCase | 大小寫敏感展開 | 回傳 TFilenameCaseMatch |
ExpandUNCFileName | UNC 路徑展開 | Linux/網路路徑 |
ExtractRelativePath | 基準→目標相對路徑 | 'C:\Win\', 'C:\Win\Sys' → 'Sys' |
ExtractShortPathName | 8.3 短檔名 | 'C:\Program Files' → 'C:\PROGRA~1' |
FileSearch | 目錄列表搜尋檔案 | 'Calc.exe', 'D:\;C:\Win' → 'D:\Calc.exe' |
3. 磁碟空間與時間編碼
| 函數 | 用途 | 參數/回傳 |
DiskFree | 可用空間 | Drive: 0=目前, 1=A...,Int64 Byte,失敗 -1 |
DiskSize | 總空間 | 同上 |
FileDateToDateTime | 檔案時間整數 → TDateTime | |
DateTimeToFileDate | TDateTime → 檔案時間整數 | 年份 1980-2107 外回 0 |
GetCurrentDir | 目前工作目錄 | 注意:檔案對話框會改變此值 |
SetCurrentDir | 設定工作目錄 | Boolean |
CreateDir | 建立單層目錄 | 已存在回 False,不支援多層 |
RemoveDir | 刪除空目錄 | Boolean |
ForceDirectories | 遞迴建立多層目錄 | Boolean |
4. PChar 緩衝區核心操作 (低階字串處理)
| 函數 | 用途 | 關鍵行為 |
StrLen | PChar 長度 | nil 觸發例外 |
StrEnd | PChar 結尾指標 | nil 觸發例外 |
StrMove | 複製指定位元組數 | Dest 需預先配置記憶體 |
StrCopy | 複製整個 PChar | Dest 需足夠空間 |
StrECopy | 複製至 Dest 結尾 | 回傳新結尾指標,可串連 |
StrLCopy | 複製指定長度 | MaxLen 含結束符 |
StrPCopy | String → PChar | StrLCopy(Dest, PChar(Source), Length(Source)) |
StrPLCopy | String 指定長度 → PChar | StrLCopy(Dest, PChar(Source), MaxLen) |
StrCat | 連接 PChar | StrCopy(StrEnd(Dest), Source) |
StrLCat | 連接並限制總長度 | MaxLen 為連接後總長上限 |
StrComp | 比較 PChar (區分大小寫) | 回傳首異字元差值 |
StrIComp | 比較 PChar (不區分大小寫) | |
StrLComp | 比較指定長度 (區分大小寫) | |
StrLIComp | 比較指定長度 (不區分大小寫) | |
StrScan | 字元首次出現位置 | 未找到回 nil |
StrRScan | 字元最後出現位置 | 未找到回 nil |
StrPos | 子串首次出現位置 | StrPos('12345','3')='345' |
StrUpper | PChar 轉大寫 | 就地修改 |
StrLower | PChar 轉小寫 | 就地修改 |
StrPas | PChar → String | 也可直接賦值 |
5. PChar 記憶體管理
| 函數 | 用途 | 關鍵點 |
StrAlloc | 配置緩衝區 (含大小資訊) | 需 StrDispose 釋放 |
StrBufSize | 取得 StrAlloc 配置大小 | |
StrNew | 複製新 PChar | 需 StrDispose |
StrDispose | 釋放 PChar 記憶體 | nil 安全 |
6. Format 系列格式化核心
| 函數 | 用途 | 格式字串語法 |
Format | 陣列常數格式化 → String | %[index:][-][width][.prec]type (d/f/e/x/p/s 等) |
FmtStr | 程序版 Format | 結果存入 var 參數 |
StrFmt | PChar 緩衝區格式化 | 回傳 PChar |
StrLFmt | 限制長度 PChar 格式化 | MaxBufLen 保護緩衝區 |
FormatBuf | 低階緩衝區格式化 | 回傳寫入位元組數 |
WideFormat / WideFmtStr / WideFormatBuf | WideString 版本 | Unicode 字串支援 |
Format 常用範例:
Format('x=%d', [12]); // 'x=12'
Format('x=%3d', [12]); // 'x= 12' (寬度 3)
Format('x=%.3f', [12.0]); // 'x=12.000' (小數 3 位)
Format('x=%.*f', [5, 12.0]); // 'x=12.00000' (動態精度)
Format('x=%.5d', [12]); // 'x=00012' (補 0)
Format('x=%.5x', [12]); // 'x=0000c' (十六進制)
Format('x=%1:d%0:d', [12,13]); // 'x=1312' (索引重排)
Format('x=%p', [nil]); // 'x=00000000' (指標)
Format('x=%1.1e', [12.0]); // 'x=1.2E+001' (科學記號)
Format('x=%%', []); // 'x=%' (字面 % 字元)
7. 浮點數/貨幣轉字串核心
| 函數 | 用途 | 關鍵參數 |
FloatToStr | Extended → String | ≥1E15 自動科學記號 |
CurrToStr | Currency → String | 固定 4 位小數 |
FloatToCurr | Extended → Currency | 超出範圍拋例外 |
FloatToStrF | 依 TFloatFormat 轉字串 | ffGeneral/Exponent/Fixed/Number/Currency |
CurrToStrF | Currency 依格式轉字串 | Digits 指定小數寬度 |
FloatToText | 低階緩衝區格式化 | 回傳寫入長度,ValueType 指定類型 |
實用範例精選
安全複製 PChar 避免緩衝區溢位
var Buf: array[0..255] of Char;
begin
StrLCopy(Buf, PChar(Edit1.Text), 100); // 最多複製 100 字元
Edit2.Text := Buf;
end;
格式化輸出對齊報表
Memo1.Lines.Add(Format('%-20s %10.2f %5d', ['Product A', 1234.56, 100]));
// Product A 1234.56 100
遞迴建立目錄並檢查空間
if ForceDirectories('D:\Data\Project\Backup') then
if DiskFree(4) > 100 * 1024 * 1024 then // 100MB
// 執行備份...
本部分涵蓋的 PChar 操作與 Format 格式化是 Delphi 字串處理的「內功心法」,雖高層 string 類型已封裝大部分需求,但介接 C/C++ DLL、解析二進位協定、高效能緩衝區處理時,這些低階函數不可或缺。