Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Изменение даты создания файла


Автор: MacTep 3.9.2004, 17:45
Ребят, помогите пожалуйста узнать дату создания определенного файла и изменить ее на другую. Как это сделать? Можно примерчик посмотреть?

Автор: Pakshin A. S. 3.9.2004, 17:57
Знаю на 100% получние: Есть такая штука TSearchRec.FindData.ftCreationDate:TFileTime;

Автор: Alex 3.9.2004, 18:16
Получение информации:
Код
type
 tInfoType = ( aFCreat       // Дата и время создания файла
             , aFCreatDate   // Дата создания файла
             , aFCreatTime   // Время создания файла
             , aFChange      // Дата и время изменения файла
             , aFChangeDate  // Дата изменения файла
             , aFChangeTime  // Время изменения файла
             );

function GetFileDate(info: tInfoType; FileName: String): String;
// Дата и время создания и последнего изменения файла
var
 Handle: tHandle;
 FindData: tWin32FindData;
 LocalFileTime1, LocalFileTime2: TFileTime;
 DosTime1, DosTime2: Integer;
 DateTime1, DateTime2: TDateTime;
begin
 Result:= 'none';
 if not FileExists(FileName) then exit;
 Handle := FindFirstFile(PChar(FileName), FindData);
 if Handle = INVALID_HANDLE_VALUE then
   RaiseLastOSError;

 Windows.FindClose(Handle);
 with FindData do begin
   FileTimeToLocalFileTime(ftLastWriteTime, LocalFileTime1);
   FileTimeToDosDateTime(LocalFileTime1, LongRec(DosTime1).Hi, LongRec(DosTime1).Lo);
   FileTimeToLocalFileTime(ftCreationTime, LocalFileTime2);
   FileTimeToDosDateTime(LocalFileTime2, LongRec(DosTime2).Hi, LongRec(DosTime2).Lo);
   DateTime1 := FileDateToDateTime(DosTime1);  // файл изменен
   DateTime2 := FileDateToDateTime(DosTime2);  // файл создан
 end;
 case info of
   aFCreat     : Result:= DateTimeToStr(DateTime2);
   aFCreatDate : Result:= DateToStr(DateTime2);
   aFCreatTime : Result:= TimeToStr(DateTime2);
   aFChange    : Result:= DateTimeToStr(DateTime1);
   aFChangeDate: Result:= DateToStr(DateTime1);
   aFChangeTime: Result:= TimeToStr(DateTime1);
 end;
end;

Автор: Pakshin A. S. 3.9.2004, 18:25
Код

function GetTime(FileName:string):string;
var
 SearchRec:TSearchRec;
begin
 Result:='';
 if  FindFirst(FileName, faAnyFile or faHidden or faSysFile or faReadOnle, SearchRec)
  then
   begin
     Result:=DateToStr(FileDateToDateTime(SearchRec.FindData.ftCreationTime));// мог напутать с преобразованием типов
     FindClose(SearchRec);
   end;
end;

Суть та же, но места меньше... sad.gif

Автор: MacTep 3.9.2004, 21:17
А изменение? Получение у меня получилось при помощи хелпа.
Добавлено @ 21:22
Я вот такую фишку делал:
1) когда создается форма, то выводится дата файла:
Код
procedure TForm1.FormCreate(Sender: TObject);
begin
 FileHandle:=FileOpen('c:\1\1.txt',0);
 Label4.Caption:=DateTimeToStr(FileDateToDateTime(FileGetDate(FileHandle)));
end;

2) когда нажимаю на кнопку "Изменить дату" в поле Edit1 ввожу новую дату типа "04.09.2004"
Код
procedure TForm1.Button1Click(Sender: TObject);
var date:TDateTime;
begin
 FileHandle:=FileOpen('c:\1\1.txt',0);
 date:=StrToDateTime(Edit1.Text);
 Label3.Visible:=true;
 FileSetDate(FileHandle,DateTimeToFileDate(date));
 FileClose(FileHandle);
 Close;
end;

Но после всего этого ни фига не меняется дата. Остается прежней. Что не так? FileHandle - глобальная переменная типа DateTime.

Автор: MacTep 3.9.2004, 21:40
ВСЕ!!! Сделал. Решил эту проблему так:
Код
procedure TForm1.Button1Click(Sender: TObject);
var TheFile:file;
   date:TDateTime;
begin
 date:=StrToDateTime(Edit1.Text);
 AssignFile(TheFile,'c:\1\1.txt');
 Reset(TheFile);
 FileSetDate(TFileRec(TheFile).Handle, DateTimeToFileDate(Date));
 CloseFile(TheFile);
end;

Вот такие пироги! smile.gif

Автор: Wizardb 29.10.2005, 13:31
MacTep Твой код работает, но он изменяет дату изменения файла, а как изменить дату создания файла? smile

Автор: MacTep 1.11.2005, 23:04
Цитата(Wizardb @ 29.10.2005, 13:31)
MacTep Твой код работает, но он изменяет дату изменения файла, а как изменить дату создания файла? smile

А это уже совсем другая история! smile Нужно новую тему создавать!

Автор: Wizardb 2.11.2005, 11:58
Э-э-э, слушай, тема как называется? Изменение даты создания файла называется! Так что это как раз в тему, а вот про дату изменения - не в тему! smile smile smile

Автор: Случайный посетитель 2.11.2005, 12:53
GetFileTime/SetFileTime
И сразу - GetFileAttributes/SetFileAttributes

Автор: Wizardb 2.11.2005, 22:52
Слушай, а неможешь поподробнее написать, а то я чето такую функцию в справке не нашел -SetFileTime smile

Автор: Случайный посетитель 3.11.2005, 02:14
>Wizardb
В Delphi в меню - >Help->Windows SDK, там ищи.
Либо в MSDN
Для того, чтобы в приложении можно было использовать эти функции, подключи в Uses модуль windows.

Автор: Wizardb 3.11.2005, 12:26
Слушай, вот я хочу взять дату из одного файла и присвоить другому. Вот у меня такой код:
Код

procedure TForm1.Button1Click(Sender: TObject);
var  f_CreationTime, f_LastAccessTime, f_LastWriteTime: PFileTime;
Thefile,Thefile2:file;
begin
 AssignFile(TheFile,'C:\Games\FalloutSim\FalloutSim.exe');
 Reset(TheFile);
 GetFileTime(TFileRec(TheFile).Handle , f_CreationTime, f_LastAccessTime, f_LastWriteTime);
 CloseFile(TheFile);
  AssignFile(TheFile2,'c:\111\1.txt');
  Reset(TheFile2);
  setFileTime(TFileRec(TheFile2).Handle,f_CreationTime, f_LastAccessTime, f_LastWriteTime);
  CloseFile(TheFile2);
end;


Но выскакивает ошибка, когда по кнопке кликаю. Че у меня неправильно, скажи пожалуйста, и как правильно сделать?

Автор: Случайный посетитель 3.11.2005, 12:48
Цитата(Wizardb @ 3.11.2005, 12:26)
Но выскакивает ошибка, когда по кнопке кликаю.


Ты бы текст ошибки привел?

Автор: Alexeis 3.11.2005, 12:57
Если используешь PFileTime то выдели под нее память а не передавай пустой указатель
Попробуй вот так
Код

procedure TForm1.Button1Click(Sender: TObject);
var
   f_CreationTime, f_LastAccessTime, f_LastWriteTime: TFileTime;
   Thefile, Thefile2 : file;
begin
 AssignFile(TheFile,'D:\1.txt');
 Reset(TheFile);
 GetFileTime(TFileRec(TheFile).Handle , @f_CreationTime, @f_LastAccessTime, @f_LastWriteTime);

 CloseFile(TheFile);

 AssignFile(TheFile2,'D:\2.txt');
 Reset(TheFile2);
 setFileTime(TFileRec(TheFile2).Handle,@f_CreationTime, @f_LastAccessTime, @f_LastWriteTime);
 CloseFile(TheFile2);
end;

Автор: Случайный посетитель 3.11.2005, 12:57
Дело в том, что эти функции требуют Handle открытоко файла.

Вот пример из рабочего проекта:

Код

var
  FCreated,FChanged,FAccessed: TFileTime;
  SrcName,DestName: String;
  FS,FD: HFile;
begin
//...

    FS := CreateFile(PChar(SrcName),GENERIC_READ,
      FILE_SHARE_WRITE+FILE_SHARE_READ,
      nil,
      OPEN_EXISTING,
      FILE_ATTRIBUTE_NORMAL,
      0);

//...

    FD := CreateFile(PChar(DestName),GENERIC_READ+GENERIC_WRITE,
      0,
      nil,
      CREATE_ALWAYS,
      0,
      0);
//...

    if not GetFileTime(FS,@FCreated,@FChanged,@FAccessed) then
    begin
  //    FDirBackup.SendMsg(WM_MErrReadFromFile,SrcNAme);
    end;
    if not SetFileTime(FD,@FCreated,@FChanged,@FAccessed) then
    begin
  //    FDirBackup.SendMsg(WM_MErrWriteToFile,DestName);
    end;

Автор: Alexeis 3.11.2005, 13:12
Здрасте а reset что делает smile

Автор: Wizardb 4.11.2005, 10:39
alexeis1 , Случайный посетитель : Ребят, спасибо большое! Оба примера работают отлично! smile smile smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)