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

Вниз

GetFileTime()   Найти похожие ветки 

 
Officeman   (2006-02-19 14:14) [0]

Описание:

программа1, при onClickButton1 пересзаписывает файл "go.bas"
программа2, должна читать "go.bas" если он был "перезаписан".

не могу разобраться с GetFileTime(), подскжите плиз. запутался в типах.


rrr:=GetFileTime(????????);

if  "файл go.bas перезаписан" then begin
  if MF2.Checked=true then
  begin
   assignfile(f,"go.bas");
   Reset(F);
   Readln(F, sik);                      
if sik<>ent.Text then begin
  ent.Text := sik;        
end;
  end;
end;


 
Desdechado ©   (2006-02-19 14:57) [1]

> запутался в типах.
в типах чего?
The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601.

typedef struct _FILETIME { // ft  
   DWORD dwLowDateTime;
   DWORD dwHighDateTime;
} FILETIME;


 
Officeman   (2006-02-19 15:58) [2]

непонимаю. в поискових ничего ненашёл. (((((((((((

Пожалуйста. привидите пример.

исходные данные:
filename,result:string

result:= ?????


 
Desdechado ©   (2006-02-19 16:16) [3]

причем тут поисковики? тяжело справку почитать?
Return Values

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.


 
Officeman   (2006-02-19 16:23) [4]

да всправке это есть. но как это применить я незнаю. пусть будет ZERO всё что угодно. мне нужно при noClickButton, знать изменился файл или нет. обязательно по времени перезаписи. создания или изменения.

example please


 
Жуков Олег   (2006-02-19 16:56) [5]

Если вторая программа резидентная должна следить за изменением файла, то есть более надёжный способ, чем проверка даты. Надо только сказать операционной системе, что твоя программа желает получить уведомление как только такой-то файл будет изменён. Это можно делать используя функции FindFirstChangeNotification/FindNextChangeNotification и WaitForSingleObject.


 
begin...end ©   (2006-02-19 17:00) [6]

var
 OldFileTime: TFileTime;
 FindData: TWin32FindData;
begin
 Windows.FindClose(FindFirstFile(полный_путь_к_файлу, FindData));
 if Int64(FindData.ftLastWriteTime) > Int64(OldFileTime) then
   // Дата последнего изменения файла больше, чем ранее сохранённая
end


 
Officeman   (2006-02-19 17:05) [7]

many big thanks.  попробуемс и то и то.


 
Officeman   (2006-02-19 18:14) [8]

Невыводится ничего, кроме  00:00:00


procedure TForm1.Panel115Click(Sender: TObject);
var
Result:integer;
OldFileTime: TFileTime;
FindData: TWin32FindData;
begin
Windows.FindClose(FindFirstFile("c:\go.bas", FindData));
if Int64(FindData.ftLastWriteTime) < Int64(OldFileTime) then begin
form1.Caption:="1";
end else begin
form1.Caption:="";
end;
memo2.Lines.Add("1. "+TimeToStr(Tdatetime(FindData.ftLastWriteTime)));
memo2.Lines.Add("2. "+TimeToStr(Tdatetime(OldFileTime)));
end;


 
Officeman   (2006-02-19 18:57) [9]

Братья по разуму! Кито знает?? (см.выше)

----------------------------
p.s. бородатый анекдот

нач.прогер спрашивает у  крутого.прогера.
нач.прогер: скажите, что я неправильно пишу. где искать ошибку?
крутой прогер: ошибка в твоём днк.


 
Desdechado ©   (2006-02-19 19:12) [10]

ты справку читать будешь или нет?
ЕЩЕ РАЗ:
The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601.
т.е. это НЕ ДАТА, а интервал


 
Desdechado ©   (2006-02-19 19:14) [11]

поэтому конструкция TimeToStr(Tdatetime(FindData.ftLastWriteTime)) - бред полнейший


 
GuAV ©   (2006-02-19 19:33) [12]

Desdechado ©   (19.02.06 19:12) [10]

> т.е. это НЕ ДАТА, а интервал

Дата, но представлена ввиде интервала между задаваемой и фиксированой датой. Значение TDateTime тоже интервал между задаваемой и фиксированой датой.
А как иначе ?

Перевод FILETIME в TDateTime
http://delphimaster.net/view/4-1139995337/


 
Desdechado ©   (2006-02-19 19:51) [13]

> Дата, но представлена ввиде интервала
Не надо путать. Дата - это точка на временной оси. Интервал - это расстояние между 2 точками на той оси.
10 апреля 2005 - это дата, 10 апрелей - это интервал
сходство названий не должно перерастать в отождествление


 
Джо ©   (2006-02-19 20:11) [14]

> [13] Desdechado ©   (19.02.06 19:51)
> 10 апреля 2005 - это дата,

Да, но она выражена в виде интервала. :)


 
GuAV ©   (2006-02-19 20:14) [15]


> Дата - это точка на временной оси.
> Интервал - это расстояние между 2 точками на той оси.

Да.
Но в данном случае речь идёт именно о дате, а то что она задаётся как интервал между задаваемой и January 1, 1601 - это только способ задания.

Например TDateTime может содержать и интервал и дату, при в последнем случае дата представлена как интервал между 12/30/1899 и указываемой.


 
GuAV ©   (2006-02-19 20:15) [16]

Джо ©   (19.02.06 20:11) [14]

>> [13] Desdechado ©   (19.02.06 19:51)
>> 10 апреля 2005 - это дата,
>
> Да, но она выражена в виде интервала. :)

+1


 
Desdechado ©   (2006-02-19 20:49) [17]

господа, не вижу смысла спорить
для любой метрики есть точка отсчета
при этом от любой точки до точки отсчета - это интервал, но сама эта "любая точка" - это точка, хоть и называется "лежащая на расстоянии Х от точки отсчета"
сами путаетесь и новичков за собой тащите


 
Officeman   (2006-02-19 22:35) [18]

=)  а по проще никак нельзя решить моё ТЗ ?


 
Desdechado ©   (2006-02-19 22:40) [19]

а мы думали, что ты уже решил
все тебе популярно рассказали, даже справку показали и разжевали, что в ней


 
Officeman   (2006-02-19 23:23) [20]

родила царица в ночь.
не то сына, не то дочь.
не мышонка, не лягушку
а неведому зверюшку.


function FileTimeToDateTime(const FileTime: _FILETIME): TDATETIME;
var LocalFileTime: TFileTime;
  Age : integer;
begin
FileTimeToLocalFileTime(FileTime,LocalFileTime);
if FileTimeToDosDateTime(LocalFileTime, LongRec(Age).Hi,
      LongRec(Age).Lo) then
    begin
      Result := FileDateToDateTime(Age);
      Exit;
    end;
Result := -1;
end;

procedure TForm1.Panel115Click(Sender: TObject);
var
Result:integer;
OldFileTime: TFileTime;
FindData: TWin32FindData;
rrr:string;
begin
Windows.FindClose(FindFirstFile("go.bas", FindData));
if Int64(FindData.ftLastWriteTime) < Int64(OldFileTime) then begin
form1.Caption:="1";
end else begin
form1.Caption:="";
end;
memo2.Lines.Add(TimeToStr(FileTimeToDateTime(FindData.ftLastWriteTime)));
end;


спасибо за помощь.


 
Officeman   (2006-02-20 08:58) [21]

Вопрос.


if MF2.Checked=true then begin
 //определяем время изменения и переводим в тип-строка.
try
  Windows.FindClose(FindFirstFile("go.bas", FindData));
  NewTim:=TimeToStr(FileTimeToDateTime(FindData.ftLastWriteTime));
finally
  memo2.Lines.Add("NewTim: "+NewTim);
end;

//сравниваем новое и старое значение.  ????????????????????? ***
if NewTim<>OldTim then begin
 memo2.Lines.Add("OldTim: "+OldTim);
 OldTim:=NewTim;
...


***  пример. в memo2  выводит так:

NewTim: 10:58:52
OldTim: 10:58:52

почему. они не сравниваются как СТРОКИ,  проходят как НЕРАВНЫЕ. ???
хотя тип string


 
Officeman   (2006-02-20 09:45) [22]

забыл сказать.   данный код выполняется в цикле. т.е. ждём изменения файла.


 
GuAV ©   (2006-02-20 11:32) [23]


> function FileTimeToDateTime(const FileTime:
>_FILETIME): TDATETIME;
>var LocalFileTime: TFileTime;
>  Age : integer;
>begin
>FileTimeToLocalFileTime(FileTime,LocalFileTime);
> if FileTimeToDosDateTime(LocalFileTime,
>LongRec(Age).Hi,
>      LongRec(Age).Lo) then
>    begin
>      Result := FileDateToDateTime(Age);
>      Exit;
>    end;
>Result := -1;
> end;

В приведенном варианте используется integer в процессе преобразования, поэтому может терятся точность.
Я бы порекомендовал таки вариант [0]:
FileTimeToLocalFileTime(crTime,usTime);
FileTimeToSystemTime(usTime,st);
dt:=SystemTimeToDateTime(st);



> Officeman   (20.02.06 8:58) [21]

Приведи код полнее, чтобы ошибку можно было воспроизвести.
И зачем сравнивать строки, сравнивать имхо следует сами TFileTime.


 
Officeman   (2006-02-20 11:34) [24]

ok. сейчас попробую


 
Officeman   (2006-02-20 11:41) [25]

dt:=SystemTimeToDateTime(st);

какой тип "st"
и  "dt"

???


 
Officeman   (2006-02-20 11:48) [26]

полный код непоместится. >34000 строк


 
Officeman   (2006-02-20 12:29) [27]

я тупой баран.

в цикле обозначил переменные. конечно при каждом новом круге цикла переменные обнулялись.

идиот



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

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

Наверх





Память: 0.51 MB
Время: 0.016 c
2-1139890063
Азат
2006-02-14 07:07
2006.03.05
функции в Делфи для работы с динам. памятью


1-1138962622
dan317
2006-02-03 13:30
2006.03.05
Исчезновение объектных published-свойств - у кого было ?


9-1126007655
AlexeyM
2005-09-06 15:54
2006.03.05
эмуляция нажатия клавиши клавиатуры


2-1139857519
Rom
2006-02-13 22:05
2006.03.05
Проблемы с Locate


2-1140279709
PARUS
2006-02-18 19:21
2006.03.05
IF два условия





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