今天Raymond Chen的博客让我意识到了一个优雅的解决办法,帮我解决了遇到的问题。
各种shell函数,不再使用 ITEMIDLIST
结构体,而是可以只接受以下类型:
ITEMID_CHILD
IDLIST_RELATIVE
IDLIST_ABSOLUTE
ITEMID_CHILD_ARRAY
结构。这些结构都相同,但现在你可以在编译器级别上强制执行 概念上 的类型。
回到Delphi
我有一组函数:
- 有些仅接受路径:(例如
C:\Users\Ian\Desktop\AllisonAngel.jpg
) - 有些仅接受文件名:(例如
AllisonAngel.jpg
) - 有些仅接受文件夹:(例如
C:\Users\Ian\Desktop
)
目前它们都被声明为 string
,例如:
function GetFilenames(Folder: string; ...): ...
function IsValidBatchFilename(Path: string): ...
function GetReportType(Filename: string): ...
我必须相信我正在传递正确的内容;而且我相信开发人员(例如我)知道以下三者之间的区别:
- 路径
- 文件名
- 和文件夹
我想要改变函数以使用“类型化”字符串:
function GetFilenames(Folder: TFolderOnly; ...): ...
function IsValidBatchFilename(Path: TFullPath): ...
function GetReportType(Filename: TFilenameOnly): ...
何时使用:
type
TFullPath = type string;
TFolderOnly = type string;
TFilenameOnly = type string;
除了实际上没有打字发生:
var
dropFolder: string;
begin
dropFolder := GetDropFolderPath(LCT);
GetFilenames(dropFolder); <-- no compile error
end;
我想要的是一种"独特的"字符串类型;它是一个带有长度前缀、引用计数和以空字符结尾的string
。