Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-4326
Acorus
2002-11-21 16:49
2002.12.02
Как сделать два перечисляемых типа с повторяющимся значением


14-4609
CanBlow
2002-11-12 14:35
2002.12.02
Модерирование


14-4598
Дремучий
2002-11-11 22:40
2002.12.02
Только через WebMoney или EGold...


1-4364
New_Proger
2002-11-21 22:14
2002.12.02
Нетипизированный файл


1-4453
AlexNO
2002-11-20 11:53
2002.12.02
Копировать каталоги





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский