Форум: "WinAPI";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];
ВнизSetFileTime Найти похожие ветки
← →
antonioxxx (2002-10-18 16:18) [0]Увжаемые программисты! Объясните, пожалуйста, почему не работает следующая процедура по установке времени создания файла - вроде бы писалась строго по справке... Заранее спасибо!
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;
← →
Игорь Шевченко (2002-10-18 16:25) [1]А GetLastError не пробовали ? :-)
← →
antonioxxx (2002-10-18 17:26) [2]>Игорь Шевченко Благодарю Вас за то, что Вы откликнулись на мой вопрос. Но к сожалению, я не умею использовать результат GetLastError.
Если вызвать GetLastError сразу же после вызова процедуры SetFileDateEx, то возвращаемое значение равно 5-ти. Что это означает?
← →
Игорь Шевченко (2002-10-18 17:47) [3]ERROR_ACCESS_DENIED
К этому файлу у вас нет доступа (скорее всего, это происходит не после SetFileTime, а после FileOpen)
А писать надо так:
if NOT SetFileTime(F,@FileTime,nil,nil) then
RaiseLastWin32Error;
← →
antonioxxx (2002-10-18 23:24) [4]Но чем это можно объяснить? Например, я создаю файл D:\1.txt и хочу изменить дату его создания, вызвав процедуру:
SetFileTimeEx("D:\1.txt",36056);
Чем может быть обусловлена такая ошибка в этом случае?
← →
Cobalt (2002-10-18 23:45) [5]Попробуйте Сначала закрыть файл, а уже потом изменить его дату
← →
Pat (2002-10-19 01:02) [6]>я не умею использовать результат GetLastError
SysErrorMessage(GetLastError)
← →
Alex Bigbugov (2002-10-19 14:56) [7]Если вопрос стоит тольок в том, чтобы обьяснить - на мой взгляд, проблема в этом параметре GENERIC_WRITE при открытии файла. Скорее всего, если поставить просто fmOpenWrite, то всё будет работать. Однако, мне также неясно зачем использовать столько перекодировок из формата в формат? В общем-то, по-моуму, можно написать и проще, хотя бы так:
F:=FileOpen(FileName,fmOpenWrite);
If FileSetDate(f, DateTimeToFileDate(fFileDate)) <> 0 then Showmessage("Ошибка!");
FileClose(F);
← →
antonioxxx (2002-10-19 23:33) [8]Хочу ещё раз поблагодарить всех тех, кто откликнулся на мой вопрос!
>Cobalt Если делать именно так, то возвращается ошибка "Неверный дескриптор". Но всё равно, спасибо за помощь! :)
Но я никак не могу понять, почему постоянно отказано в доступе абсолютно к любому файлу именно при вызове SetFileTime. К сожалению, замена Generic_Write на fmOpenWrite ни к чему не привела..
← →
Bigbugov (2002-10-20 09:59) [9]Функция FileSetDate представляет собой функцию Delphi и сама использует функцию SetFileTime, т. е. если работает она, то и другая обязана работать. На самом деле, на мой взгляд, проще использовать уже готовую функцию, чем придумывать новую. Другое дело, что SetFileTime позволяет изменять то, что первая не может изначально (при желании можно исправить).
Насчёт Generic_Write и fmOpenWrite. Да, в помощи действительно сказано, что файл должен обязательно открыт с доступом GENERIC_WRITE, но там не сказано, что параметр fmOpenWrite функции FileOpen автоматически подразумевает открытие с таким доступом. А вот указание GENERIC_WRITE непосредственно не передаёт этот параметр функции API, которая и открывает на самом деле файл. Просто несовпадение помощи по функциям API и собственно Delphi.
Но вот последняя часть - лично у меня простая замена лишает все проблемы. Если этого не происходит, то это уже проблема чего-то другого. Например, несовпадение версий...
← →
antonioxxx (2002-10-20 15:33) [10]Да проблемы, возможно, это и решает - ошибок не возникает, но ведь и даты не изменяются!
← →
Bigbugov (2002-10-20 19:06) [11]Начнём с того, какой именно параметр тебе надо изменить?
При написании SetFileTime(F,@FileTime,@FileTime,@FileTime) изменяются время создания и время изменения. Время последнего доступа, естественно, устанавливается на текущий момент (т. к. ,собственно, сама процедура доступ и осуществляет). Так что именно она не меняет? Первый параметр отвечает за время создания файла, которое вполне корректно меняется, что и отображается в свойствах файла... Кстати, а где ты смотришь изменения?
← →
antonioxxx (2002-10-21 13:05) [12]Меня интересует изменение времени создания файла. Я вызываю
SetFileTime(F,@FileTime,nil,nil) и далее смотрю, внесены ли
изменения либо непосредственно в Windows, либо вызовом
функции FileAge... Ни то, ни другое не отображает никаких
изменений. Может, дело в операционной системе? Моя - WinXP.
← →
antonioxxx (2002-10-22 20:44) [13]Я во всём разобрался и ещё раз хочу сказать всем СПАСИБО!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c