2

私は Delphi にまったく慣れていないので、何かをして学習するのは問題ないと思います (私の希望です!) 私のアイデアは、同じタスクを頻繁に再作成する必要があるためです。

時々ファイルを含み、時には空のままの同じディレクトリを常に作成します...

したがって、私の結論は、何らかの方法で自動化することでした。

以下を含むメモを想定します。

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

上記のすべてのものを内部で作成するベースパス:

C:\users\BGates\test

":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ユニットには、ファイル パスの解析をより簡単にするルーチンがあります。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 のバージョンにこの機能がない場合は、少し複雑になります。しかし、これにより、解決しようとしている問題に対処する方法の一般的なアイデアが得られるはずです。

于 2012-09-08T00:05:48.053 に答える