我对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文件需要怎么样)我上面的例子对他们来说可能比较熟悉......
有人能告诉我一个例子如何以正确的(最佳实践)方式解析它所以我可以从中学习吗?
答案 0 :(得分:2)
SysUtils
单元中有一些例程可以使文件路径解析变得更加容易。对于初学者,请查看ExtractFileName
和ExtractFilePath
。此外,如果您使用的是最新版本的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版本中没有它,那么事情会有点棘手。但是这应该可以让你大致了解如何处理你想要解决的问题。