acme
acme

Reputation: 21

Parsing Memo for Files and Folders

I'm totally new to Delphi I guess learning by doing something should be ok (My hope!) My Idea was because I often have to re-create the same tasks:

creating always the same directorys which contains sometimes files and sometimes leaved empty...

So my conclusion was to automate it in some way.

Assume a Memo containing the following:

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

The Basepath where all the stuff above should be created inside:

C:\users\BGates\test

":blub" is just placeholders e.g. :blub can contain any text which comes from another memo in my application which means that later defines.dat is filled with the text blub contains...

As you can see sometimes I use | and sometimes : for the placeholder...

So from the information above I would like to parse the contents of the memo to create a directory structure like this:

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

My problem is the parsing of the memo esspecially how to decide its a folder or its a folder in another folder, then its a file in the root or a file inside of a folder and so on...

Well it might be there is an easier way (I was reading about csv files and such but then? My tool would be hard to understand for someone using it which doesn't know how a csv file needs to look like) while my example above feels maybe familier to them...

Could someone show me please an example how to parse it in a correct (best practice) way So I could learn from it?

Upvotes: 2

Views: 597

Answers (1)

Mason Wheeler
Mason Wheeler

Reputation: 84580

There are routines in the SysUtils unit that make file path parsing a lot easier. Have a look at ExtractFileName and ExtractFilePath, for starters. Also, if you're using a recent version of Delphi, (D2010 or any of the XE line,) the IOUtils unit contains a set of helper methods under the TPath record that simplify working with paths.

For example, if I wanted to deal with the line /data/defines.dat:blub, I'd do something like this:

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;

Note: I just wrote this off the top of my head. It may contain bugs. Don't trust it without testing it first. Also, this uses functionality from IOUtils, and things will be a little bit trickier if you don't have it in your version of Delphi. But this should give you the general idea of how to deal with the problem you're trying to solve.

Upvotes: 2

Related Questions