Вопрос № 148849: Сталкивался ли кто-нибудь с отслеживанием копирования/перемещения файлов, например, на сменные носители? Пробовал: ICopyHook - работает только с папками, FindFirstChangeNotification - не позволяет дифференцировать события, сообщения Windows - не рабо...
Вопрос № 148877: Здраствуйте ув. Эксперты. Такой вопрос. Как можна узнать дату изменения файла (ну или другой атрибут фала), зная путь к нему. Файл в папке один. Если можна,
то наиболее проще. Заранее спасибо....Вопрос № 148883: Здравствуйте! Каким образом можно узнать, работает ли еще приложение, запущенное например при помощи ShellExecute?...
Вопрос № 148.849
Сталкивался ли кто-нибудь с отслеживанием копирования/перемещения файлов, например, на сменные носители? Пробовал: ICopyHook - работает только с папками, FindFirstChangeNotification - не позволяет дифференцировать события, сообщения Windows - не работают; надежда на zwCreateFile, но по отзывам критикуют, что на низком уровне и используя ядро. Может, есть альтернативы?
Отвечает: Genia007
Здравствуйте, Козьмин Сергей Олегович! Попробуйте такую процедуру, у меня в проги работает как часы.
Приложение:
Ответ отправил: Genia007 (статус: 10-ый класс)
Ответ отправлен: 30.10.2008, 11:11
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 148849 на номер 1151 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Вопрос № 148.877
Здраствуйте ув. Эксперты. Такой вопрос. Как можна узнать дату изменения файла (ну или другой атрибут фала), зная путь к нему. Файл в папке один. Если можна, то наиболее проще. Заранее спасибо.
Отвечает: Абельхарисов Руслан/Marked One
Здравствуйте, Пустовойтенко Виктор Григорьев! Дату изменения/создания/последнего обращения к файлу можно получить с помощью функции GetFileInformationByHandle(). В Delphi она объявлена в модуле Windows: function GetFileInformationByHandle(hFile: THandle; var lpFileInformation: TByHandleFileInformation): BOOL; hFile - хэндл файла, полученный с помощью CreateFile(). lpFileInformation - структура, в которую функция сохранит информацию о файле. Вот описание структуры TByHandleFileInformation:
Тут как мы видим достаточно много информации, но нас интерисует только поля: ftCreationTime, ftLastAccessTime, ftLastWriteTime. Они содержат даты создания/изменения/последнего обращения к файлу. Эти поля имеют тип TFileTime, который не очень пригоден для вывода на экран. Чтобы вывести его надо переконвертировать в тип TDateTime с помощью функции FileTim
eToDateTime():
Код:
function FileTimeToDateTime(FileTime: TFileTime): TDateTime; var ModifiedTime: TFileTime; SystemTime: TSystemTime; begin Result := 0; if (FileTime.dwLowDateTime = 0) and (FileTime.dwHighDateTime = 0) then Exit; try
FileTimeToLocalFileTime(FileTime, ModifiedTime); FileTimeToSystemTime(ModifiedTime, SystemTime); Result := SystemTimeToDateTime(SystemTime); except Result := Now; // Something to return in case of error end; end;
В приложении код консольной программы, которая выводит даты создания, обращения, записи файла. Вот еще один способ(URL >
>источник):
{********* получить контрольную сумму файла ************************************} function
getCRC(fname:String):DWORD; var dwFileChecksum, dwRealChecksum:DWORD; begin MapFileAndCheckSum(PChar(fname), dwFileChecksum, dwRealChecksum); result := dwRealChecksum; end; //-------- Преобразовать время файла в локальное время ------------------------- function getLocalTime(ft:FILETIME):TDateTime; var sTime,lTime:SYSTEMTIME; begin FileTimeToSystemTime(ft,sTime); SystemTimeToTzSpecificLocalTime(nil,sTime,lTime); result := SystemTimeToDateTime(lTime); end; //-----------
Получить информацию о файле -------------------------------------- procedure GenInfoFile(const fname:String;var str_info:String); var fi:WIN32_FILE_ATTRIBUTE_DATA; begin if(GetFileAttributesEx(PChar(fname),GetFileExInfoStandard,@fi)) then begin str_info := Format('Создан: %s'#13,[DateTimeToStr(getLocalTime(fi.ftCreationTime))]); str_info := str_info+Format('Время обращения: %s'#13,[DateTimeToStr(get
LocalTime(fi.ftLastAccessTime))]); str_info := str_info+Format('Вребя записи: %s'#13,[DateTimeToStr(getLocalTime(fi.ftLastWriteTime))]); str_info := str_info+Format('Размер: %.2f кб'#13,[fi.nFileSizeLow/1024.0]); str_info := str_info+Format('Контрольная сумма: %X'#13,[getCRC(fname)]); end; end; //------------------------------------------------------------------------------ procedure TForm1.SpeedButton1Click(Sender: TObject); var s:String; begin
if OpenDialog1.Execute then begin Edit1.Text := OpenDialog1.FileName; RichEdit1.Clear; GenInfoFile(Edit1.Text,s); RichEdit1.Text := s; end; end;
--------- не получается там - где не пробуют
Ответ отправил: Виктор Пырлик (статус: Профессионал) Россия, Екатеринбург Тел.: 89043822027 ICQ: 490191733 ---- Ответ отправлен: 29.10.2008, 21:16
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 148877 на номер 1151 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Оценка за ответ: 5
Отвечает: Сазонов Михаил Владимирович
Здравствуйте, Пустовойтенко Виктор Григорьев! В принципе Вам уже ответили. Просто еще один вариант, выбирайте! Удачи.
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.