Delphi 在字符串上提取超过1个delimeter

Delphi 在字符串上提取超过1个delimeter,delphi,delphi-7,Delphi,Delphi 7,使用FindFirst搜索文件后,我在子文件夹中找到了一堆文件。所有文件按名称排列,如 D:\Folders\SubFolder\SubSubFolders\FilesName#Category#Phase#Range.dat 我想获得文件的完整位置、名称、类别、阶段和范围,并将其存储在stringlist中。例如: procedure TForm1.Button1Click(Sender: TObject); var List:TStringList; begin List := TSt

使用FindFirst搜索文件后,我在子文件夹中找到了一堆文件。所有文件按名称排列,如

D:\Folders\SubFolder\SubSubFolders\FilesName#Category#Phase#Range.dat
我想获得文件的完整位置、名称、类别、阶段和范围,并将其存储在stringlist中。例如:

procedure TForm1.Button1Click(Sender: TObject);
var List:TStringList;
begin
  List := TStringList.Create;
  ExtractStrings(['#'], [],
    PChar('D:\Folders\SubFolders\SubSubFolders\FileName#Category#Phase#Range.dat'), List);
  ShowMessage(List.Text);
end; 
这就是我得到的:

D:\Folders\SubFolders\SubSubFolders\FileName
Category
Phase
Range.dat
我想要的只是

D:\Folders\SubFolders\SubSubFolders\
FileName
Category
Phase
Range.dat
谁能给我详细介绍一下如何做到这一点?谢谢

精炼:

由于我使用的是Delphi版本(Delphi 7),因此无法找到正确的方法,因此我尝试了以下方法:

procedure TForm1.Button1Click(Sender: TObject);
var Lists:TStringList;    
    s, s_filename, s_directory : string;
begin
  s:= 'D:\Folder\SubFolder\SubSubFolder\FileName#Category#Phase#Range.dat';
  s_directory := ExtractFilePath(s);
  s_filename := ExtractFileName(s);
  Memo1.Lines.Clear;
  Memo1.Lines.Add(s);
  Memo1.Lines.Add(s_directory);
  ExtractStrings(['#','.'], [], PChar(s_filename),Memo1.Lines);
end;
得到了我想要的,但是,如何将这些字符串插入到字符串数组中,比如列表:TStringList,而不是Memo1.line?我遇到了访问冲突。


在\上拆分,然后在#上拆分最后一个条目。

您不指定版本,但如果您使用的是XE6(或Appmethod等效工具),则可以执行以下操作:

procedure GetFileDetails(const FileName: string; Details: TStrings);
var
  S: string;
begin
  Details.BeginUpdate;
  try
    Details.Clear;
    S := ExtractFilePath(FileName);
    if S <> '' then Details.Add(S);
    Details.AddStrings(FileName.Substring(S.Length).Split(['#']));
  finally
    Details.EndUpdate;
  end;
end;
过程GetFileDetails(常量文件名:string;详细信息:TStrings);
变量
S:字符串;
开始
Details.BeginUpdate;
尝试
细节。清晰;
S:=提取文件路径(文件名);
如果是“”,则为详细信息。添加;
Details.AddStrings(FileName.Substring(S.Length).Split(['#']);
最后
Details.EndUpdate;
结束;
结束;

string
类型(通过助手)在XE3中获得了一个
Split
方法,但在XE6之前,它是一个完整的狗。

这里我们直截了当地说

procedure ExtractDetails( const AFilename : string; ADetails : TStrings );
begin
  ADetails.Delimiter := '#';
  // ADetails.StrictDelimiter := True; // AFAIK work not with Delphi 7
  ADetails.DelimitedText := ExtractFileName( AFilename );
  ADetails.Insert( 0, ExtractFilePath( AFilename ) );
end;

您需要一个拆分函数。这方面的问题很多。网络搜索可以做到这一点。很多人使用TStringList,这很好用。没关系,我只是忘了添加:list:=TStringList.Create;
procedure ExtractDetails( const AFilename : string; ADetails : TStrings );
begin
  ADetails.Delimiter := '#';
  // ADetails.StrictDelimiter := True; // AFAIK work not with Delphi 7
  ADetails.DelimitedText := ExtractFileName( AFilename );
  ADetails.Insert( 0, ExtractFilePath( AFilename ) );
end;