2

我对 Delphi 完全陌生,我想通过做某事来学习应该没问题(我的希望!)我的想法是因为我经常不得不重新创建相同的任务:

始终创建相同的目录,其中有时包含文件,有时则为空...

所以我的结论是以某种方式自动化它。

假设一个备忘录包含以下内容:

config.xml|enc
/skin
/data/defines.dat:blub
/temp

应在其中创建上述所有内容的 Basepath:

C:\用户\BGates\测试

":blub" 只是占位符,例如 :blub 可以包含来自我的应用程序中另一个备忘录的任何文本,这意味着稍后的 define.dat 会填充文本 blub 包含...

正如你所看到的,有时我使用 | 有时:对于占位符...

所以从上面的信息我想解析备忘录的内容来创建一个这样的目录结构:

C:\users\BGates\test\
config.xml
skin
data
  defines.dat (while defines.dat will contain the stuff which comes from blub)
temp

我的问题是备忘录的解析,特别是如何决定它是一个文件夹还是另一个文件夹中的文件夹,然后是根目录中的文件或文件夹内的文件等等......

好吧,可能有一种更简单的方法(我正在阅读有关 csv 文件等的信息,但是后来?我的工具对于使用它的人来说很难理解,因为它不知道 csv 文件的外观),而我上面的示例感觉可能对他们来说更亲近了……

有人可以向我展示一个如何以正确(最佳实践)方式解析它的示例,以便我可以从中学习吗?

4

1 回答 1

2

单元中有一些例程SysUtils可以使文件路径解析变得容易得多。首先看一下ExtractFileNameand ExtractFilePath。此外,如果您使用的是最新版本的 Delphi(D2010 或任何 XE 系列),则该IOUtils单元在记录下包含一组帮助程序方法TPath,可简化使用路径。

例如,如果我想处理 line /data/defines.dat:blub,我会这样做:

function NormalizePath(const name: string): string;
begin
   result := StringReplace(name, '/', '\', [rfReplaceAll]);
end;

procedure ProcessLine(line: string);
var
   path, filename, data: string;
   colonPos: integer;
begin
   colonPos := pos(':', line);
   if colonPos > 0 then
   begin
      data := copy(line, colonPos + 1);
      delete(line, colonPos, MAXINT);
   end;
   line := TPath.Combine(BASE_PATH, normalizePath(line));
   if ExtractFileExt(line) = '' then
      path := line
   else begin
      path := ExtractFilePath(line);
      filename := line;
   end;
   ForceDirectories(path); //ensure that the folder exists
   if filename <> '' then
      TFile.WriteAllText(filename, data);
end;

注意:我只是在脑海中写下了这个。它可能包含错误。不先测试就不要相信它。此外,这使用了 中的功能IOUtils,如果您的 Delphi 版本中没有它,事情会有点棘手。但这应该让您大致了解如何处理您要解决的问题。

于 2012-09-08T00:05:48.053 回答