С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906

Автоматическое изменение имени файла при записи лога. (Инкремент имени)

11.12.2013, 13:59. Показов 2575. Ответов 0

Студворк — интернет-сервис помощи студентам
Господа, возникла у меня как-то потребность записи лога в файл. И требовалось записывать в схожий по названию файл, но каждый раз в разный. То есть один раз устанавливается имя файла, а потом оно автоматически изменяется по какому-то признаку. В частности приписывается счетчик записей.
Сейчас переписал в божеский вид и решил поделиться. Вдруг кому пригодится.
Сама функция
C++
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
String IncFileName( String FullFilePathAndNameOrName )
{
  while( FullFilePathAndNameOrName.IsPathDelimiter(1) )                               // Если начинается с разделителя пути
    FullFilePathAndNameOrName = FullFilePathAndNameOrName.Delete( 1, 1 );
  FullFilePathAndNameOrName = FullFilePathAndNameOrName.Trim();
  FullFilePathAndNameOrName = StringReplace( FullFilePathAndNameOrName, "/", "\\", TReplaceFlags() << rfReplaceAll );
 
  if( !FullFilePathAndNameOrName.Pos(":") )                                           // Полный ли это путь?
    FullFilePathAndNameOrName = GetCurrentDir() + "\\" + FullFilePathAndNameOrName;   //  Если нет, то плясать от текущей папки
 
  String FileExtension = "";                                                                   //// Поиск расширения файла
  if( FullFilePathAndNameOrName.Pos(".") )                                                       //
    FileExtension = FullFilePathAndNameOrName.SubString(                                         //
                                              FullFilePathAndNameOrName.LastDelimiter("."),      //
                                              FullFilePathAndNameOrName.Length()                 //
                                                        );                                     ////
 
  String FileName = FullFilePathAndNameOrName.SubString(                                       //// Поиск имени файла
                                              FullFilePathAndNameOrName.LastDelimiter("\\") + 1, //  //+1 == '\'.Leangth()
                                              FullFilePathAndNameOrName.Length()                 //
                                                        );                                       //
  FileName = FileName.Delete(                                                                    //
                      FileName.LastDelimiter("."),                                               //
                      FileName.Length()                                                          //
                             );                                                                ////
 
 
  String FileNum = FileName;                                                       //// Поиск номера файла
  while( FileNum.IsDelimiter( "1234567890", FileNum.Length() ) )                     //
    FileNum.Delete( FileNum.Length(), FileNum.Length() );                            //
                                                                                     //
  if( FileNum == FileName )                                                          //
    FileNum = "0";                                                                   //
  else                                                                               //
    FileNum = FileName.SubString(                                                    //
                                 FileName.LastDelimiter( FileNum ) + 1,              //
                                 FileName.Length()                                   //
                                 );                                                ////
 
  String FilePath = FullFilePathAndNameOrName.SubString(                           //// Получение пути
                                              0,                                     //
                                              FullFilePathAndNameOrName.Pos( FileName + FileExtension ) - 1
                                                        );                         ////
 
  FileName.Delete(                                                         //// Обрезка имени до номера
                  FileName.Pos( FileNum ),                                   //
                  FileName.Length()                                          //
                  );                                                       ////
 
 
  while( FileExists( FullFilePathAndNameOrName ) )                           // Проверка на существование
    {
    FileNum = StrToInt( FileNum.ToInt() + 1 );
    FullFilePathAndNameOrName = FilePath + FileName + FileNum + FileExtension;
    }
 
return FullFilePathAndNameOrName;
}


Пример использования
C++
1
2
3
4
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  WriteLog( IncFileName( Edit1->Text ) );
}

Функция разбивает входящую строку на путь файла, имя файла, номер файла, расширение файла для последующей удобной работы с ними. Ничего особенного. Но при желании, к примеру, легко дополняется временем,
C++
52
FullFilePathAndNameOrName = FilePath + FileName + Time() + FileExtension;
или переставляет счетчик перед именем
C++
52
FullFilePathAndNameOrName = FilePath + FileNum + FileName + FileExtension;
и так далее.


Примеры работы в табличке:
Входящее значение Путь Имя Счетчик Расшерение Возвращаемое значение Комментарий
C:\\Rab\\Measure\\log.txt C:\\Rab\\Measure\\ log 7 .txt C:\\Rab\\Measure\\log7.txt Дописалась цифра семь, так как файлы с log.txt по log6.txt уже существуют
C:\\Rab\\Measure\\North1_.txt C:\\Rab\\Measure\\ North1_ 1 .txt C:\\Rab\\Measure\\North1_0.txt Дописалась цифра ноль, так как файл North1_.txt уже существует
C:\\Program Files\\Porn\\Deep.avi C:\\Program Files\\Porn\\ Deep 0 .avi C:\\Program Files\\Porn\\Deep.avi Ничего не изменилось так как нет такого файла по этому адресу
dghdjh88h3jng09 C:\\Bilder\\Project\\ dghdjh88h3jng09 0 NULL C:\\Bilder\\Project\\dghdjh88h3jng09 Дописана директория откуда запущена программа
3
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.12.2013, 13:59
Ответы с готовыми решениями:

Разница в работе bat-файла при его запуске от имени простого пользователя и от имени администратора
Здравствуйте. Пытаюсь создать .bat который: создаёт папку %ProgramFiles%\MyProg и копирует туда файлы создаёт папку...

Автоматическое изменение имени массива
Приветствую! Имеется следующий цикл: For i = 0 To N Dim array(3) As Integer array(i) = TextBox2.Lines(i) array(i + 1)...

Изменение имени при перетаскивании файла на форму
При запуске программа отображает форму (пустую, не важно какую). Если Вы бросаете мышкой файл на эту форму, то программа его ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.12.2013, 13:59
Помогаю со студенческими работами здесь

Изменение имени файла при распаковке множества архивов
Доброго времени суток. Сделал для себя простенький батничек для распаковки большого количества zip-архивов md &quot;папка где лежит...

Запретить изменение имени в свойствах файла при переименовании
Если переименовать exe файл в другое имя То и описание файла в свойствах то же измениться Видел многие exe файлы Имя файла одно ...

Задание имени файла пользователем при чтении и записи
Программа должна осуществлять запись в файл или чтение из файла (по выбору пользователя) целых чисел. Пока я написала вот такой код: ...

Изменение имени файла при выгрузке отчета access 2010 в PDF
Добрый вечер! очень нужно сформированный отчет выгрузить в PDF фаил с указанием в имени дату или какой-нибудь порядковый номер или с...

Как сделать проверку на наличие похожего имени файла и запрос нового имени файла?
При загрузке изображения присваивается имя foto.jpg. Вопрос, как сделать проверку на то что фото с таким именем существует и если он...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru