优雅的方式来区分Path或Entry键

时间:2010-06-14 14:22:05

标签: regex delphi delphi-2010

我有一个应用程序加载CAD数据(自定义格式),从本地文件系统指定绘图的绝对路径或从数据库。

数据库访问是通过将图纸标识符作为参数的库函数实现的。

标识符的格式类似于ABC 01234T56-T,而我的路径是典型的Windows路径(例如x:\Data\cadfiles\cadfile001.bin)。

我想写一个包装器函数将一个String作为一个参数,它可以是一个路径或一个标识符,它调用适当的函数来加载我的数据。

像这样:

Function CadLoader(nameOrPath : String):TCadData;

我的问题:我怎样才能优雅地决定我的字符串是一个idnetifier还是文件的路径? 使用正则表达式?或者只搜索“\”和“:”,它们没有出现在标识符中?

4 个答案:

答案 0 :(得分:5)

试试这个

Function CadLoader(nameOrPath : String):TCadData;
begin
  if FileExists(nameOrPath) then
    <Load from file>
  else
    <Load from database>
end;

答案 1 :(得分:2)

我会做这样的事情:

function CadLoader(nameOrPath : String) : TCadData;
begin
 if ((Pos('\\',NameOrPath) = 1) {UNC} or (Pos(':\',NameOrPath) = 2) { Path })
    and FileExists(NameOrPath) then
 begin
   // Load from File
 end
 else
 begin
   // Load From Name
 end;
end;

RegEx要做同样的事情:\\\\|.:\\我认为第一个更具可读性。

答案 2 :(得分:0)

在我看来,K.I.S.S。原则适用(或保持简单愚蠢!)。听起来很苛刻,但是如果你绝对确定组合:\永远不会出现在你的标识符中,我只会在字符串的第二个位置查找它。保持事物的可理解性和可读性。还有一句话:

  有些人在面对的时候   问题,想想“我知道,我会用   正则表达式。“现在他们有   两个问题。 - 杰米·扎温斯基

答案 3 :(得分:0)

您应该传入一个额外的参数,准确说明标识符实际代表的内容,即:

type 
  CadLoadType = (CadFromPath, CadFromDatabase); 

Function CadLoader(aType: CadLoadType; const aIdentifier: String): TCadData; 
begin 
  case aType of 
    CadFromPath: begin 
      // aIdentifier is a file path... 
    end; 
    CadFromDatabase: begin 
      // aIdentifier is a database ID ... 
    end; 
  end; 
end; 

然后你可以这样做:

Cad := CadLoader(CadFromFile, 'x:\Data\cadfiles\cadfile001.bin'); 

Cad := CadLoader(CadFromDatabase, 'ABC 01234T56-T');