Иногда приходится делать рискованные вещи. В силу тех или иных ограничений. В одной из последних задач – ограничением было не использование базы данных. А данные-то хранить где-то надо)) Вот и пришлось использовать все возможные варианты. Один из вариантов – имя файла. Тут конечно, много других ограничений встает – нельзя переименовывать в дальнейшем, например и др. Но если это вписывается в задачу, то почему нет.
На примере картинки – сохраним размеры, а затем прочитаем их, используя регулярные выражения…
Запись
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 |
... var twic:twicimage; SplittedString: TArray<String>; LastInArray:integer; BeforeLastInArray:integer; ... // Adding width and Height to the end of the string if IsThisPicture(SourceFileName) then begin twic:=TWICImage.Create; twic.LoadFromFile(SourceFileName); //Splitting string SplittedString:=DestFileName.Split(['.']); LastInArray:=High(SplittedString); // Getting extension here... if LastInArray>=1 then begin BeforeLastInArray:=LastInArray-1; SplittedString[BeforeLastInArray]:= SplittedString[BeforeLastInArray] +'{w' +twic.width.ToString +'h' +twic.height.ToString +'}'; end; FreeAndNil(twic); end; |
Чтение
Считываем только последнее совпадение, что хоть как-то гарантирует корректность результатов
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 |
procedure ParseWidthAndHeightFromString(StringToParse:string; var width:integer; var height:integer); var FTPSynchro:TFTPSynchro; M: TMatchCollection; Mwidth: TMatchCollection; MHeight:TMatchCollection; RegEx:TRegEx; heightString:string; begin // Parsing width and height from somestring{w123h123}somestring // - and it should be last in the string, so last match M:=RegEx.Matches( StringToParse ,'{w[\w]*[\d]\b'); if M.Count>0 then begin //Parsing width // M.Item[M.Count-1] will give last match in the string MWidth:=RegEx.Matches( M.Item[M.Count-1].Value ,'[\d]*'); if MWidth.Count>0 then width:=MWidth.Item[0].Value.ToInteger; //Parsing height MHeight:=RegEx.Matches( M.Item[M.Count-1].Value ,'h[\d]*'); if MHeight.Count>0 then begin heightString:=MHeight.Item[0].Value; // will give h123 heightString:=heightString.Substring(1,heightString.Length); // will give 123 height:=heightString.ToInteger(); end; end; // POBEDA !!! end; |