Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 23.07.2013
Сообщений: 54
1

Мониторинг изменений текстового файла

30.06.2014, 12:31. Просмотров 1762. Ответов 5

Добры день. Помогите с кодом, необходимо проверять на изменение теста файл(txt) с интервалом 1 сек на заданном периоде времени. Пишу проверку со Sleep(1000) прога виснет...
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.06.2014, 12:31
Ответы с готовыми решениями:

Импорт данных из текстового файла с постоянным отслеживанием изменений
Здравствуйте. Прошу помочь в следующем вопросе. Необходимо импортировать данные из TXT-файла с...

Внесение изменений в текстовый файл согласно информации, получаемой из другого текстового файла
Добрый день, снова обращаюсь за помощью! К теме прикрепляю 3 файла: Коды_районы.txt Названия...

Мониторинг изменений в бд
Не знаю как правильно сформулировать вопрос. В вк допустим чат ведётся, человек написал, и...

Мониторинг изменений файловой системе
Помогите составить алгоритм или постановку следующей задачи(мониторинг изменений во всей файловой...

5
10209 / 6590 / 494
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
30.06.2014, 13:15 2
1- не используйте sleep(), есть же таймеры, потоки
2- обращения к файлу или каталогу можно отслеживать ReadDirectoryChangesW() http://msdn.microsoft.com/en-u... s.85).aspx
1
8 / 8 / 4
Регистрация: 06.05.2014
Сообщений: 70
30.06.2014, 14:50 3
Использовать лучше всего таймер, на мой взгляд
http://www.delphi-manual.ru/timer.php
1
2508 / 1129 / 582
Регистрация: 07.06.2014
Сообщений: 3,278
30.06.2014, 15:25 4
Федя Камушкин, постом выше вашего raxp дал исчерпывающий ответ на этот вопрос.


p.s. лично моё мнение - лучше отслеживать через ReadDirectoryChangesW, вообще никаких пустых циклов проверок и таймеров не нужно будет...
1
8 / 8 / 4
Регистрация: 06.05.2014
Сообщений: 70
30.06.2014, 15:44 5
Sergio Leone, я видел, однако, как Вы сказали, постом выше ссылочек на таймер не имеется.
0
13042 / 5828 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
02.07.2014, 13:56 6
Лучший ответ Сообщение было отмечено vovak_85 как решение

Решение

Цитата Сообщение от vovak_85 Посмотреть сообщение
Помогите с кодом, необходимо проверять на изменение теста файл(txt) с интервалом 1 сек на заданном периоде времени.
Самый простой способ - проверять время последнего изменения файла через вызов FileAge(). Данные о времени будут получены не зависимо от режима, в котором открыт файл. Если текущее время изменения отличается от предыдущего запомненного значения, значит - файл изменён.
Пример:
На форму надо положить:
Button1: TButton; //Кнопка: "Запуск монитора".
Button2: TButton; //Кнопка: "Останов монитора".
Timer1: TTimer; //Таймер. Вначале он должен быть выключен: Timer1.Enabled := False.
Memo1: TMemo; //Журнал в который будут выводиться сообщения монитора.
Для кнопок Button1 и Button2 создать обработчики OnClick, для таймера Timer1 создать обработчик события OnTimer. Код оформить таким образом:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Timer1: TTimer;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
    FFileName : String;    //Имя файла, за которым ведётся наблюдение.
    FTimeLast : TDateTime; //Дата и время последнего изменения файла.
    procedure MonStart(const aFileName : String); //Запуск монитора.
    procedure MonStop; //Останов монитора.
    procedure MonScan; //Проверка - изменился ли файл.
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
//Останов монитора.
procedure TForm1.MonStop;
begin
  Timer1.Enabled := False;
  Memo1.Lines.Add(FormatDateTime('dd.mm.yyyy"-"hh:nn:ss:zzz', Now) + '. Монитор остановлен.')
end;
 
//Запуск монитора.
procedure TForm1.MonStart(const aFileName : String);
begin
  //Если монитор работает, то останавливаем его.
  if Timer1.Enabled then
     MonStop;
  //Проверяем, существует ли файл.
  if not FileExists(aFileName) then
  begin
    Memo1.Lines.Add(FormatDateTime('dd.mm.yyyy"-"hh:nn:ss:zzz', Now)
      + '. Файл не найден! Действие отменено.');
    Exit;
  end;
 
  //Запускаем монитор.
  FFileName := aFileName;
  FTimeLast := FileDateToDateTime(FileAge(FFileName));
  Memo1.Lines.Add(FormatDateTime('dd.mm.yyyy"-"hh:nn:ss:zzz', Now) + '. Монитор запущен.');
  Memo1.Lines.Add('Файл: ' + FFileName);
  Memo1.Lines.Add('Время последнего изменения файла: '
    + FormatDateTime('dd.mm.yyyy"-"hh:nn:ss:zzz', FTimeLast));
  Timer1.Enabled := True;
end;
 
//Проверка - изменён ли файл.
procedure TForm1.MonScan;
var
  TimeCur : TDateTime;
begin
  //Проверяем, существует ли файл.
  if not FileExists(FFileName) then
  begin
    Memo1.Lines.Add(FormatDateTime('dd.mm.yyyy"-"hh:nn:ss:zzz', Now) + '. Файл не найден!');
    MonStop;
  end;
  //Текущее временя последнего изменения файла.
  TimeCur := FileDateToDateTime(FileAge(FFileName));
  //Если текущее время изменения отличается от предыдущего, значит файл изменён.
  if FTimeLast <> TimeCur then
  begin
    FTimeLast := TimeCur;
    Memo1.Lines.Add(FormatDateTime('dd.mm.yyyy"-"hh:nn:ss:zzz', Now) + '. Файл изменён.');
    Memo1.Lines.Add('    Время последнего изменения файла: '
      + FormatDateTime('dd.mm.yyyy"-"hh:nn:ss:zzz', FTimeLast));
  end;
end;
 
//Таймер: отслеживаение изменений файла.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  MonScan;
end;
 
//Кнопка: запуск монитора.
procedure TForm1.Button1Click(Sender: TObject);
begin
  MonStart(ExtractFilePath(ParamStr(0)) + 'file.txt');
end;
 
//Кнопка: останов монитора.
procedure TForm1.Button2Click(Sender: TObject);
begin
  MonStop;
end;
 
//Перед закрытием формы.
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  MonStop;
end;
 
end.
Что касается реализации с ReadDirectoryChangesW() - она будет существенно сложнее. Если делать всё, как положено, с отдельным потоком и с синхронизацией, то можно отталкиваться от следующего примера:
ReadDirectoryChangesW(). Отслеживание изменений в папках.
Для данного случая код можно упростить, отказаться от дополнительного потока и перейти на вызов ReadDirectoryChangesW() в синхронном режиме. Но всё равно код будет существенно сложнее, чем вариант с FileAge().
4
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2014, 13:56

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Мониторинг изменений в базах данных
Уважаемые форумчане, здравствуйте! Нужен ваш совет. Алгоритм определения изменений схемы...

Мониторинг изменений файлов каталога
Доброго времени суток коллеги. :) Подскажите, есть у кого может исходники подобной программы...

Триггер на мониторинг изменений в таблице
Добрый день! Накидал такой код: USE GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO...

Мониторинг процессов. Как сделать запись изменений в одну строчку
Всем привет! Есть вот такая таблица. USE GO /****** Object: Table . Script Date:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.