6

たとえば、特定のフォルダーのフルパス名があります

c:\foo\bar

ここで、c:\foo 内の baz.txt という名前のファイルを参照したいと思います。

c:\foo\bar\..\baz.txt

現在、.. パス演算子を使用して 1 レベル下に移動し、必要なファイルを取得しています。

UpOneLevel(str) -> str など、パス操作を実行できる関数はありますか? 文字列を分割して最後のトークンを削除することで作成できることはわかっていますが、エスケープされたバックスラッシュなどがある場合に後で問題が発生しないように、組み込み/ライブラリ関数の方が望ましいです。

4

4 に答える 4

11

ExpandFileName関数を使用します。

var
  S: string;
begin
  S := 'c:\foo\bar\..';
  S := ExpandFileName(S);
  ShowMessage(S);
end;

上記の例のメッセージには、c:\fooパスが表示されます。

于 2013-02-01T03:47:26.820 に答える
4

とを見てExtractFilePath()くださいExtractFileDir()。これらは、ほぼすべてのDelphiバージョン、特にTDirectory、IOUtilsなどを持たないバージョンで利用できます。

そして、誰かがそれを言う前に、これらはパスがファイル名で終わっているかどうかに関係なくうまく機能します。ForceDirectories()たとえば、それらを内部的に使用して、親フォルダの階層を逆方向にウォークスルーします。

于 2013-02-01T04:36:42.240 に答える
3

この回答は Delphi XE + に有効です

次のように、メソッドGetParentを持つ IOutils ユニットのTDirectoryクラスを使用します。

uses IOUtils;

procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
begin
  s := 'c:\foo\bar';
  ShowMessage(TDirectory.GetParent(s));
end;

古いバージョンでは

他の回答を見てください。

于 2013-02-01T03:38:57.127 に答える
1

delphi-oopライブラリからSvClassesユニットのTPathBuilderレコードを見ることができます。このユニットは Delphi 2007 をサポートしていませんが、実装はこの Delphi バージョンと互換性があります。使用例:TPathBuilder

var
  LFullPath: string;
begin
  LFullPath := TPathBuilder.InitCustomPath('c:\foo\bar').GoUpFolder.AddFile('baz.txt').ToString;
  //LFullPath = c:\foo\baz.txt
于 2013-02-01T08:44:34.977 に答える