Delphi 分析文件和文件夹的备忘录

Delphi 分析文件和文件夹的备忘录,delphi,parsing,Delphi,Parsing,我是德尔福的新手,我想通过做一些事情来学习应该是可以的(我希望!) 我的想法是因为我经常需要重新创建相同的任务: 创建始终相同的目录,其中有时包含文件,有时保留为空 所以我的结论是以某种方式实现自动化 假设备忘录包含以下内容: config.xml|enc /skin /data/defines.dat:blub /temp 应在其中创建上述所有内容的基本路径: C:\users\BGates\test “:blub”只是占位符,例如:blub可以包含来自我的应用程序中另一个备忘录的任何文本,

我是德尔福的新手,我想通过做一些事情来学习应该是可以的(我希望!) 我的想法是因为我经常需要重新创建相同的任务:

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

所以我的结论是以某种方式实现自动化

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

config.xml|enc
/skin
/data/defines.dat:blub
/temp
应在其中创建上述所有内容的基本路径:

C:\users\BGates\test

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

正如您所见,有时我使用|有时:作为占位符

因此,根据上述信息,我想解析备忘录的内容,创建如下目录结构:

C:\users\BGates\test\
config.xml
skin
data
  defines.dat (while defines.dat will contain the stuff which comes from blub)
temp
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;
我的问题是分析备忘录,特别是如何确定它是一个文件夹还是另一个文件夹中的文件夹,然后是根目录中的文件还是文件夹中的文件,等等

也许有一种更简单的方法(我读过csv文件之类的东西,但是我的工具对于使用它的人来说很难理解,因为他们不知道csv文件应该是什么样子),而我上面的例子对他们来说可能更熟悉


有人能给我举一个例子,说明如何以正确的(最佳实践)方式解析它,以便我从中学习吗?

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

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

C:\users\BGates\test\
config.xml
skin
data
  defines.dat (while defines.dat will contain the stuff which comes from blub)
temp
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;
函数NormalizePath(const name:string):string;
开始
结果:=StringReplace(名称“/”、“\”、[rfReplaceAll]);
结束;
过程处理行(行:字符串);
变量
路径、文件名、数据:字符串;
冒号:整数;
开始
冒号:=pos(“:”,第行);
如果colonPos>0,则
开始
数据:=副本(行,冒号+1);
删除(行、冒号、MAXINT);
结束;
行:=TPath.Combine(基本路径,规格化路径(行));
如果ExtractFileExt(行)='',则
路径:=行
否则开始
路径:=提取文件路径(行);
文件名:=行;
结束;
强制目录(路径)//确保文件夹存在
如果文件名为“”,则
TFile.WriteAllText(文件名、数据);
结束;

注意:我只是把这个记在了头上。它可能包含bug。不先测试就不要相信它。此外,它还使用了来自
IOUtils
的功能,如果您的Delphi版本中没有它,事情会变得有点棘手。但这会让你大致了解如何处理你试图解决的问题。

哇,这看起来很有希望。一定是什么地方出了点小问题,希望我能找到。它只创建第一个文件,但没有子文件夹或其他任何内容。。。非常感谢您提供的快速示例,我们将尝试找出它out@acme:嗯,你需要一行一行地看一下备忘录。(查看
属性)我在执行以下操作时执行了:var I:Integer;i的开始:=0到memo1.Lines.Count-1开始处理行(memo1.Lines.Strings[i]);结束
但它只是创建了第一个文件没有额外的目录我想可能是路径有问题?不确定,但不管什么原因ForceDirectory失败,我将查看ForceDirectory中包含的路径,它是正确的,但是没有创建目录:)好的,我已经重写了您的代码,使缺少的目录可以工作directoryPos:Integer;oPath:字符串;开始//获取要创建的目录位置:=位置(“/”,第行);如果directoryPos>0,则开始oPath:=copy(第行,directoryPos+1);删除(行、directoryPos、MaxInt);forceDirectory(TPath.Combine(basepath,normalizePath(oPath));结束;所以现在所有目录都被创建了,但数据目录和defines.dat文件本身都不允许,我使用的管道也不允许,所以看起来我更接近了……这是一项更适合脚本语言的任务。例如Python。编程的一个重要部分是了解并为每个不同的任务使用正确的工具。