Данный код к имени файла, например Filename.exe добавляет Filename{param=value}.exe В дальнейшем это можно будет корректно прочитать регулярными выражениями, при условии, что такая пара одна в имени файла.
Добавление параметра
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
// {Adding Params to FileName, so FileName.exe will be FileName{Param=Value}.exe } class function TCreateUniqueName.AddParamAndValueToName(FileName: string; Param:string; Value:string ): string; var Extension:string; SplittedString: TArray<String>; SomeStringToChange:string; i: Integer; FileNameTemp:string; begin //Checks if FileName='' then Exit; //1--------- First of all we need to extract extension if it is SplittedString:=FileName.Split(['.']); //we suppose that extensions are symbols after last '.', so... // if FileName has extension like 'SomeFileName.exe' if Length(SplittedString)>1 //2 and more, for example somename.ext [somename,ext] then begin Extension:=SplittedString[ High(SplittedString) ]; //ShowMessage(Extension); // for test //2----------Now lets change previous massive Element if it is SomeStringToChange:=SplittedString[ High(SplittedString)-1 ]; //Adding Param And Value SomeStringToChange:=SomeStringToChange+'{'+Param+'='+Value+'}'; SplittedString[ High(SplittedString)-1 ]:=SomeStringToChange; //3-------Now our name is Unique we can join it back for i := Low(SplittedString) to High(SplittedString)-1 do Result:=Result+SplittedString[i]+'.'; //At last adding Extension Result:=Result+Extension; end else // if FileName without Extension like 'SomeFileName' if Length(SplittedString)=1 then begin FileNameTemp:=FileName; FileNameTemp:=FileNameTemp+'{'+Param+'='+Value+'}'; Result:=FileNameTemp; end; //ShowMessage(Result); //for test end; |
Как прочитать параметры?
Данный код будет искать значение параметра из букв и цифр, если нужны какие-то дополнительные знаки, как нижнее подчеркивание и др., можно просто добавить их в регулярное выражение. Там где написано [\w\d]*, написать, например [\w\d_]*
В коде мы последовательно отделяем нужную нам часть выражения
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
{Get Param Value from FileName} class function TCreateUniqueName.GetParamValueFromFileName(FileName: string; const ParamName:string):string; var RegEx:TRegEx; M: TMatchCollection; M2: TMatchCollection; M3: TMatchCollection; begin Result:=''; M:=RegEx.Matches( FileName ,'{'+ParamName+'=[\w\d]*}'); if M.Count>0 then M2:=RegEx.Matches( M.Item[M.Count-1].Value ,'=[\w\d]*'); if M2.Count>0 then M3:=RegEx.Matches( M2.Item[M2.Count-1].Value ,'[\w\d]*'); if M3.Count>0 then Result:=M3.Item[M3.Count-1].Value; end; |
Пример использования
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
procedure TVisualFrame_HTTP.bTestClick(Sender: TObject); var NewFileName:string; begin NewFileName:=TCreateUniqueName.CreateUniqueNameAddingGUID('VeryLongText.exe',7); NewFileName:=TCreateUniqueName.AddParamAndValueToName('VeryLongText.exe','chunkNumber','SomeValue255'); ShowMessage( TCreateUniqueName.GetParamValueFromFileName(NewFileName,'chunkNumber') ); end; |