Я пытаюсь создать функцию, которая может увеличивать имя файла. Если последний символ строки является числом, то увеличивайте его. Если последний символ - это буква, то добавьте _1 или _2 или _3 (добавьте это также). Я должен быть уверен, что имя файла уникально, но я не могу использовать datetime внутри filename, потому что все имена файлов должны быть < 32 символа без расширения.Функция для увеличения файла filename
EX: Apple_99.txt =>Apple_100
Ex: Apple_173 => Apple_174
EX: This_is_my_first_text.txt => This_is_my_first_text_1.txt
Ex: This_is_my_first_text_9.txt => This_is_my_first_text_10.txt
Мне нужно использовать это, чтобы переименовать файл, а затем загрузить его на ftp-сервер. Я нашел функцию, которая может сделать что-то вроде этого, но она работает только в том случае, если имя файла содержит только верхний регистр. Как я могу изменить эту функцию, чтобы получить доступ к строчной строке в верхнем регистре?
Вот функция:
function IncStr(Str: String; Amount: Integer; Index: Integer = -1): String;
const
MIN_VAL = 65; // 'A'
MAX_VAL = 90; // 'Z'
var
Digit, ToAdd, ToCarry: Integer;
begin
if (Index = 0) and (Amount > 0) then
begin
Result := Char(MIN_VAL + Amount - 1) + Str;
Exit;
end;
if Index = -1 then Index := Length(Str);
ToCarry := 0;
Digit := Ord(Str[Index]);
while not (Digit in [MIN_VAL..MAX_VAL]) do
begin
Dec(Index);
Digit := Ord(Str[Index]);
end;
ToAdd := Digit + Amount;
while (ToAdd > MAX_VAL) do
begin
Dec(ToAdd, 26);
Inc(ToCarry);
end;
Result := Str;
Result[Index] := Char(ToAdd);
if (ToCarry > 0) then
Result := IncStr(Result, ToCarry, Index - 1);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
S: String; // holds string to increment
C: Integer; // amount to increment by
begin
// make sure that Edit1 starts with a valid character
// i.e. 'A' to 'Z'
S := Edit1.Text;
C := StrtoIntDef(Edit2.Text, 0);
// test it, place result in Edit3
Edit3.Text := IncStr(S, C);
{
Example data:
Edit1 := AAZ
Edit2 := 2
= Edit3 := ABB
Edit1 := BZY
Edit2 := 3
= Edit3 := CAB
Edit1 := ZZZ
Edit2 := 1
= Edit3 := AAAA
Edit1 := AA-AC
Edit2 := 3
= Edit3 := AA-AF
Edit1 := AA/Z
Edit2 := 5
= Edit3 := AB/E
... etc
Here's one to try too :-)
Edit1 := ZZZ
Edit2 := 264172
}
end;
Спасибо!
Спасибо, Дэвид. Ты такой быстрый. Просто небольшая проблема: я не пишу консольное приложение, поэтому Delphi 2010 показывает мне некоторые ошибки: строка не содержит члена с именем «LastIndexof» (stem.lastindexof), строка не содержит члена с именем «подстрока» (строка .substring). Я уже добавил, что ioutils использует список. Большое спасибо – user2858981
@ user2858981 Используя решение Дэвида - это здорово, поскольку это так просто - вы должны заверить, что возвращаемое имя файла еще не существует. Вы можете архивировать это, вызывая его в цикле while: 'while FileExists (MyFileName) do MyFileName: = IncrementedFileName (MyFileName);' –
Вы не указываете версию Delphi в вопросе. Я предположил более современную версию. Используйте LastDelimiter вместо LastIndexOf. И Скопировать вместо подстроки. Обе эти функции - это функции, а не методы. –