Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SetFileTime [D5, Win95/98, WinXP]


antonioxxx ©   (2002-10-18 16:18:00) 

Увжаемые программисты! Объясните, пожалуйста, почему не работает следующая процедура по установке времени создания файла - вроде бы писалась строго по справке... Заранее спасибо!

Procedure SetFileDateEx(FileName:String; fFileDate:TDateTime);
Var
F:Cardinal;
FileTime: TFileTime;
SystemTime: TSystemTime;
Begin
If FileExists(FileName) Then
Begin
F:=FileOpen(FileName,GENERIC_WRITE);
DateTimeToSystemTime(fFileDate,SystemTime);
SystemTimeToFileTime(SystemTime,FileTime);
SetFileTime(F,@FileTime,nil,nil);
FileClose(F);
ZeroMemory(@FileTime,SizeOf(@FileTime));
End
Else
MessageBoxEx(0,"Файл по указанному адресу не найден","Ошибка",MB_IconError,0);
End;


antonioxxx   (2002-10-22 20:44:00) [1]

Я во всём разобрался и ещё раз хочу сказать всем СПАСИБО!


antonioxxx   (2002-10-21 13:05:00) [2]

Меня интересует изменение времени создания файла. Я вызываю
SetFileTime(F,@FileTime,nil,nil) и далее смотрю, внесены ли
изменения либо непосредственно в Windows, либо вызовом
функции FileAge... Ни то, ни другое не отображает никаких
изменений. Может, дело в операционной системе? Моя - WinXP.


Bigbugov   (2002-10-20 19:06:00) [3]

Начнём с того, какой именно параметр тебе надо изменить?
При написании SetFileTime(F,@FileTime,@FileTime,@FileTime) изменяются время создания и время изменения. Время последнего доступа, естественно, устанавливается на текущий момент (т. к. ,собственно, сама процедура доступ и осуществляет). Так что именно она не меняет? Первый параметр отвечает за время создания файла, которое вполне корректно меняется, что и отображается в свойствах файла... Кстати, а где ты смотришь изменения?


antonioxxx   (2002-10-20 15:33:00) [4]

Да проблемы, возможно, это и решает - ошибок не возникает, но ведь и даты не изменяются!


Bigbugov   (2002-10-20 09:59:00) [5]

Функция FileSetDate представляет собой функцию Delphi и сама использует функцию SetFileTime, т. е. если работает она, то и другая обязана работать. На самом деле, на мой взгляд, проще использовать уже готовую функцию, чем придумывать новую. Другое дело, что SetFileTime позволяет изменять то, что первая не может изначально (при желании можно исправить).
Насчёт Generic_Write и fmOpenWrite. Да, в помощи действительно сказано, что файл должен обязательно открыт с доступом GENERIC_WRITE, но там не сказано, что параметр fmOpenWrite функции FileOpen автоматически подразумевает открытие с таким доступом. А вот указание GENERIC_WRITE непосредственно не передаёт этот параметр функции API, которая и открывает на самом деле файл. Просто несовпадение помощи по функциям API и собственно Delphi.
Но вот последняя часть - лично у меня простая замена лишает все проблемы. Если этого не происходит, то это уже проблема чего-то другого. Например, несовпадение версий...


antonioxxx   (2002-10-19 23:33:00) [6]

Хочу ещё раз поблагодарить всех тех, кто откликнулся на мой вопрос!

>Cobalt Если делать именно так, то возвращается ошибка "Неверный дескриптор". Но всё равно, спасибо за помощь! :)

Но я никак не могу понять, почему постоянно отказано в доступе абсолютно к любому файлу именно при вызове SetFileTime. К сожалению, замена Generic_Write на fmOpenWrite ни к чему не привела..


Alex Bigbugov   (2002-10-19 14:56:00) [7]

Если вопрос стоит тольок в том, чтобы обьяснить - на мой взгляд, проблема в этом параметре GENERIC_WRITE при открытии файла. Скорее всего, если поставить просто fmOpenWrite, то всё будет работать. Однако, мне также неясно зачем использовать столько перекодировок из формата в формат? В общем-то, по-моуму, можно написать и проще, хотя бы так:
F:=FileOpen(FileName,fmOpenWrite);
If FileSetDate(f, DateTimeToFileDate(fFileDate)) <> 0 then Showmessage("Ошибка!");
FileClose(F);


Pat   (2002-10-19 01:02:00) [8]

>я не умею использовать результат GetLastError
SysErrorMessage(GetLastError)


Cobalt   (2002-10-18 23:45:00) [9]

Попробуйте Сначалазакрыть файл, а уже потомизменить его дату


antonioxxx   (2002-10-18 23:24:00) [10]

Но чем это можно объяснить? Например, я создаю файл D:\1.txt и хочу изменить дату его создания, вызвав процедуру:

SetFileTimeEx("D:\1.txt",36056);

Чем может быть обусловлена такая ошибка в этом случае?


Игорь Шевченко   (2002-10-18 17:47:00) [11]

ERROR_ACCESS_DENIED

К этому файлу у вас нет доступа (скорее всего, это происходит не после SetFileTime, а после FileOpen)

А писать надо так:

if NOT SetFileTime(F,@FileTime,nil,nil) then
RaiseLastWin32Error;


antonioxxx   (2002-10-18 17:26:00) [12]

>Игорь ШевченкоБлагодарю Вас за то, что Вы откликнулись на мой вопрос. Но к сожалению, я не умею использовать результат GetLastError.
Если вызвать GetLastError сразу же после вызова процедуры SetFileDateEx, то возвращаемое значение равно 5-ти. Что это означает?


Игорь Шевченко   (2002-10-18 16:25:00) [13]

А GetLastError не пробовали ? :-)


Наверх

Титульная страница Поиск, карта сайта Написать письмо