使用FindFirst搜索文件后,我在子文件夹中获得了一堆文件。所有文件都按名称排列,如
D:\Folders\SubFolder\SubSubFolders\FilesName#Category#Phase#Range.dat
我想获取文件的完整位置,名称,类别,相位范围并将其存储在字符串列表中。例如:
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;
并得到我想要的,但是,如何将这些字符串插入字符串数组,如Lists:TStringList,而不是Memo1.Lines?我遇到了访问冲突。
答案 0 :(得分:2)
您没有指定版本,但如果您正在使用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;
string
类型(通过帮助程序)在XE3中获得了Split
方法,但在XE6之前它是一个完整的狗。
答案 1 :(得分:2)
这里我们直截了当
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;
答案 2 :(得分:-1)
//Author: steve10120
TStringArray = array of string;
function Split(Expression:string; Delimiter:string):TStringArray;
var
Res: TStringArray;
ResCount: DWORD;
dLength: DWORD;
StartIndex: DWORD;
sTemp: string;
begin
dLength := Length(Expression);
StartIndex := 1;
ResCount := 0;
repeat
sTemp := Copy(Expression, StartIndex, Pos(Delimiter, Copy(Expression, StartIndex, Length(Expression))) - 1);
SetLength(Res, Length(Res) + 1);
SetLength(Res[ResCount], Length(sTemp));
Res[ResCount] := sTemp;
StartIndex := StartIndex + Length(sTemp) + Length(Delimiter);
ResCount := ResCount + 1;
until StartIndex > dLength;
Result := Res;
end;
var
Strings: TStringArray;
begin
Strings := Split('Good||Morning||World||', '||');
MessageBox(0, PChar(Strings[2]), nil, 0);
end.
拆分\,然后拆分#。
上的最后一个条目