解析文件和文件夹的备忘录

时间:2012-09-07 23:43:41

标签: delphi parsing

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

始终创建相同的directorys,其中有时包含文件,有时会留空......

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

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

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

应该在里面创建上述所有内容的Basepath:

C:\用户\ BGates \测试

“:blub”只是占位符,例如:blub可以包含来自我的应用程序中的另一个备忘录的任何文本,这意味着后来的definitions.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文件需要怎么样)我上面的例子对他们来说可能比较熟悉......

有人能告诉我一个例子如何以正确的(最佳实践)方式解析它所以我可以从中学习吗?

1 个答案:

答案 0 :(得分:2)

SysUtils单元中有一些例程可以使文件路径解析变得更加容易。对于初学者,请查看ExtractFileNameExtractFilePath。此外,如果您使用的是最新版本的Delphi(D2010或任何XE行),IOUtils单元在TPath记录下包含一组辅助方法,可简化路径的使用。

例如,如果我想处理行/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版本中没有它,那么事情会有点棘手。但是这应该可以让你大致了解如何处理你想要解决的问题。