Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

расширения файла   Найти похожие ветки 

 
Alexey ©   (2004-04-22 09:41) [0]

Добрый день ...
Допустим программа сохраняет все данные в файл *******.*** где последний символ расширения цифра как эту цифру увеличивать на 1 при каждом перезапуске программы....????

Файл текстовой.


 
Alexey ©   (2004-04-22 09:41) [0]

Добрый день ...
Допустим программа сохраняет все данные в файл *******.*** где последний символ расширения цифра как эту цифру увеличивать на 1 при каждом перезапуске программы....????

Файл текстовой.


 
Алхимик ©   (2004-04-22 09:50) [1]

var
  num : integer;
  str : string;
  FName : string;
begin
FName := <имя файла>;
str := Copy(FName,Lenght(FName)-1,1);
try
  num := StrToInt(str);
except
  <сообщение об ошибке>
  exit;
end;
num := num + 1;
str := IntToStr(num);
if Lenght(str) > 1 then str := str[2];
FName[Length(FName)-1] := Char(str);
end;


Писал на коленке. Возможны ошибки.


 
Алхимик ©   (2004-04-22 09:50) [1]

var
  num : integer;
  str : string;
  FName : string;
begin
FName := <имя файла>;
str := Copy(FName,Lenght(FName)-1,1);
try
  num := StrToInt(str);
except
  <сообщение об ошибке>
  exit;
end;
num := num + 1;
str := IntToStr(num);
if Lenght(str) > 1 then str := str[2];
FName[Length(FName)-1] := Char(str);
end;


Писал на коленке. Возможны ошибки.


 
Андрей Сенченко ©   (2004-04-22 09:53) [2]

Alexey ©   (22.04.04 09:41)  

Этого хватит всего на 10 перезапусков программы

Алхимик ©   (22.04.04 09:50) [1]

А FName откуда возьмется ? Проще в инихе или реестре хранить.


 
Андрей Сенченко ©   (2004-04-22 09:53) [2]

Alexey ©   (22.04.04 09:41)  

Этого хватит всего на 10 перезапусков программы

Алхимик ©   (22.04.04 09:50) [1]

А FName откуда возьмется ? Проще в инихе или реестре хранить.


 
Alexey ©   (2004-04-22 09:57) [3]

мужики конкретно по теме ... файл берется с харда как я тебе его задам Алхимик


 
Alexey ©   (2004-04-22 09:57) [3]

мужики конкретно по теме ... файл берется с харда как я тебе его задам Алхимик


 
Андрей Сенченко ©   (2004-04-22 10:05) [4]

Alexey ©   (22.04.04 09:57) [3]

Конкретно по теме.
Сделай иниху, в которой будешь хранить последнюю использованную тобой цифирьку. При инциализации приложения - читай ее. При выходе из приложения - пиши новую

С раширением работай через ChangeFileExt()

Еще конкретнее нужно ?


 
Андрей Сенченко ©   (2004-04-22 10:05) [4]

Alexey ©   (22.04.04 09:57) [3]

Конкретно по теме.
Сделай иниху, в которой будешь хранить последнюю использованную тобой цифирьку. При инциализации приложения - читай ее. При выходе из приложения - пиши новую

С раширением работай через ChangeFileExt()

Еще конкретнее нужно ?


 
Erik ©   (2004-04-22 11:25) [5]

Думаю разберешся, fMaxFile для циклической записи например на неделю. Работает даже при изменении и удалении файлов.
unit uManageFile;

interface

Type
 TManageFile = class
 private
   fBase, fPath: String;
   FName: Array of Integer;
   procedure DeleteMax;
   function Sort(var A: array of Integer): Boolean;
   procedure GetFiles;
   procedure ChangeMax;
 Public
   fMaxFile: Byte;
   fExt: String;
   function NextPart(Base, Path: String): String;
   constructor Create;
 end;

implementation
uses Sysutils, FileCtrl;

constructor TManageFile.Create;
begin
 inherited;
 fMaxFile := 7;
 fExt := ".zip";
end;

procedure TManageFile.GetFiles;
Var FileCount, i, Len: Integer;
   sr: TSearchRec;
   Step: Integer;
begin
 FileCount := 0;
 Step := 50;
 SetLength(FName,Step);

 FindFirst(fPath+"\"+fBase+"*"+fExt, faAnyFile, sr);
 repeat
   if (fBase = Copy(sr.Name,1,Length(fBase))) and (ExtractFileExt(sr.Name)=fExt) then begin
     Len := Length(sr.Name)-Length(ExtractFileExt(sr.Name))-Length(fBase);
     i := StrToInt(Copy(sr.Name,Length(fBase)+1,Len));
     Inc(FileCount);
     FName[FileCount-1] := i;
     if FileCount > High(FName)-10 then SetLength(FName,High(FName)+Step);
   end;
 until FindNext(sr) > 0;
 FindClose(sr);
 SetLength(FName,FileCount);

end;

function TManageFile.NextPart(Base, Path: String): String;
Var Size: Integer;
   Index: Byte;
begin
 fPath := Path;
 fBase := Base;

 if Not DirectoryExists(fPath) then
   if not ForceDirectories(fPath) then raise Exception.Create("Cannot create "+fPath);

 GetFiles;
 Sort(FName);
 Size := Length(FName);
 if Size = 0 then
   Index := 1
 else if Size >= fMaxFile then begin
   DeleteMax;
   ChangeMax;
   Index := FName[Low(FName)];
 end else begin
   if FName[Low(FName)] = 1 then begin
     ChangeMax;
     Index := 1;
   end else Index := FName[Low(FName)]-1;
 end;
 Result := fPath+"\"+fBase+IntToStr(Index)+fExt;
end;

procedure TManageFile.ChangeMax;
Var i: Integer;
begin
 for i := High(FName) downto Low(FName) do
   RenameFile( fPath+"\"+fBase+IntToStr(FName[i])+fExt, fPath+"\"+fBase+IntToStr(FName[i]+1)+fExt);
end;

procedure TManageFile.DeleteMax;
Var i: Integer;
begin
 for i := High(FName) downto fMaxFile-1 do
   DeleteFile( fPath+"\"+fBase+IntToStr(FName[i])+fExt );
end;

function TManageFile.Sort(var A: array of Integer): Boolean;

 procedure QuickSort(var A: array of Integer; iLo, iHi: Integer);
 var
   Lo, Hi, Mid, T: Integer;
 begin
   Lo := iLo;
   Hi := iHi;
   Mid := A[(Lo + Hi) div 2];
   repeat
     while A[Lo] < Mid do Inc(Lo);
     while A[Hi] > Mid do Dec(Hi);
     if Lo <= Hi then
     begin
       T := A[Lo];
       A[Lo] := A[Hi];
       A[Hi] := T;
       Inc(Lo);
       Dec(Hi);
     end;
   until Lo > Hi;
   if Hi > iLo then QuickSort(A, iLo, Hi);
   if Lo < iHi then QuickSort(A, Lo, iHi);
 end;

begin
 Result := Length(A) > 0;
 if Result then
   QuickSort(A, Low(A), Length(A));
end;

end.


 
Erik ©   (2004-04-22 11:25) [5]

Думаю разберешся, fMaxFile для циклической записи например на неделю. Работает даже при изменении и удалении файлов.
unit uManageFile;

interface

Type
 TManageFile = class
 private
   fBase, fPath: String;
   FName: Array of Integer;
   procedure DeleteMax;
   function Sort(var A: array of Integer): Boolean;
   procedure GetFiles;
   procedure ChangeMax;
 Public
   fMaxFile: Byte;
   fExt: String;
   function NextPart(Base, Path: String): String;
   constructor Create;
 end;

implementation
uses Sysutils, FileCtrl;

constructor TManageFile.Create;
begin
 inherited;
 fMaxFile := 7;
 fExt := ".zip";
end;

procedure TManageFile.GetFiles;
Var FileCount, i, Len: Integer;
   sr: TSearchRec;
   Step: Integer;
begin
 FileCount := 0;
 Step := 50;
 SetLength(FName,Step);

 FindFirst(fPath+"\"+fBase+"*"+fExt, faAnyFile, sr);
 repeat
   if (fBase = Copy(sr.Name,1,Length(fBase))) and (ExtractFileExt(sr.Name)=fExt) then begin
     Len := Length(sr.Name)-Length(ExtractFileExt(sr.Name))-Length(fBase);
     i := StrToInt(Copy(sr.Name,Length(fBase)+1,Len));
     Inc(FileCount);
     FName[FileCount-1] := i;
     if FileCount > High(FName)-10 then SetLength(FName,High(FName)+Step);
   end;
 until FindNext(sr) > 0;
 FindClose(sr);
 SetLength(FName,FileCount);

end;

function TManageFile.NextPart(Base, Path: String): String;
Var Size: Integer;
   Index: Byte;
begin
 fPath := Path;
 fBase := Base;

 if Not DirectoryExists(fPath) then
   if not ForceDirectories(fPath) then raise Exception.Create("Cannot create "+fPath);

 GetFiles;
 Sort(FName);
 Size := Length(FName);
 if Size = 0 then
   Index := 1
 else if Size >= fMaxFile then begin
   DeleteMax;
   ChangeMax;
   Index := FName[Low(FName)];
 end else begin
   if FName[Low(FName)] = 1 then begin
     ChangeMax;
     Index := 1;
   end else Index := FName[Low(FName)]-1;
 end;
 Result := fPath+"\"+fBase+IntToStr(Index)+fExt;
end;

procedure TManageFile.ChangeMax;
Var i: Integer;
begin
 for i := High(FName) downto Low(FName) do
   RenameFile( fPath+"\"+fBase+IntToStr(FName[i])+fExt, fPath+"\"+fBase+IntToStr(FName[i]+1)+fExt);
end;

procedure TManageFile.DeleteMax;
Var i: Integer;
begin
 for i := High(FName) downto fMaxFile-1 do
   DeleteFile( fPath+"\"+fBase+IntToStr(FName[i])+fExt );
end;

function TManageFile.Sort(var A: array of Integer): Boolean;

 procedure QuickSort(var A: array of Integer; iLo, iHi: Integer);
 var
   Lo, Hi, Mid, T: Integer;
 begin
   Lo := iLo;
   Hi := iHi;
   Mid := A[(Lo + Hi) div 2];
   repeat
     while A[Lo] < Mid do Inc(Lo);
     while A[Hi] > Mid do Dec(Hi);
     if Lo <= Hi then
     begin
       T := A[Lo];
       A[Lo] := A[Hi];
       A[Hi] := T;
       Inc(Lo);
       Dec(Hi);
     end;
   until Lo > Hi;
   if Hi > iLo then QuickSort(A, iLo, Hi);
   if Lo < iHi then QuickSort(A, Lo, iHi);
 end;

begin
 Result := Length(A) > 0;
 if Result then
   QuickSort(A, Low(A), Length(A));
end;

end.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.078 c
14-1081959606
TButton
2004-04-14 20:20
2004.05.09
Мииилая мояяяя...


4-1078988334
Shiza
2004-03-11 09:58
2004.05.09
Помогите перевести кусок С-шного кода.


1-1082540158
4aynik
2004-04-21 13:35
2004.05.09
Да как же открыть типиз-й файл для чтения? даже смешно :)


4-1079423804
ai
2004-03-16 10:56
2004.05.09
StayOnTop с модальным окном...


3-1081857108
Liona
2004-04-13 15:51
2004.05.09
2 в одном... ворпос по запросам MySQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский