Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
2 / 2 / 3
Регистрация: 11.09.2011
Сообщений: 557
1

Создание/удаление/изменение файлов в потоке. А так же мониторинг файлов в потоке

21.10.2012, 17:24. Показов 2100. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот задание:
имеется заданный каталог, потоки читатели считывают и отображают информацию о файлах и подкаталогах (размер, атрибуты файла, имена и пр.), потоки-писатели выполняют изменение атрибутов и содержимого файлов, создают или удаляют файлы и каталоги

Я очень мало знаю в программировании, так что не ругайтесь Вот что я пока напридумывал
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  TNewThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;
 
var
  Form1: TForm1;
  NewThread: TNewThread;
 
implementation
{$R *.dfm}
 
procedure TNewThread.Execute;
begin
  while true do {íè÷åãî íå äåëàåì};
end;
 
procedure TForm1.btn1Click(Sender: TObject);
 
Var f:System.Text; //êëàññ òåêñòîâîãî ôàéëà
t:System.Text;
r:System.Text;
int : Integer;
i : Integer;
x,y,z : string;
NewThread: TNewThread;
 
const
x1='ÀÁÂÃÄŨÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß'; x2='ABCDEFGHIJKLMNOPQRSTUVWXYZ'; x3='1234567890';
y1='ÀÁÂÃÄŨÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß'; y2='ABCDEFGHIJKLMNOPQRSTUVWXYZ'; y3='1234567890';
z1='ÀÁÂÃÄŨÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß'; z2='ABCDEFGHIJKLMNOPQRSTUVWXYZ'; z3='1234567890';
attr: array [1..9] of integer=(0,1,2,4,8,16,32,64,71);
//FILE_ATTRIBUTE_NORMAL 0
//faReadOnly      1
//faHidden      2
//faSysFile     4
//faVolumeID    8
//faDirectory    16
//faArchive    32
//faSymLink    64
//faAnyFile    71
 
 
 
begin
 
  NewThread:=TNewThread.Create(true);
  NewThread.FreeOnTerminate:=true;
  NewThread.Priority:=tpLower;
  NewThread.Resume;
 
  ForceDirectories('E:\TEST\TEST1');
  ForceDirectories('E:\TEST\TEST2');
  ForceDirectories('E:\TEST\TEST3');
 
  SetFileAttributes('E:\TEST\TEST1\1.txt', FILE_ATTRIBUTE_NORMAL);
  DeleteFile('E:\TEST\TEST1\1.txt');
  x:= x1[Random(33)+1] + x2[Random(26)+1] + x3[Random(10)+1];
  AssignFile(f,'E:\TEST\TEST1\1.txt'); //ðåãèñòðàöèÿ ôàéëà
  Rewrite(f); //ñîçäàíèå ôàéëà, åñëè îí òàì åñòü, òî ïåðåçàïèñûâàåòüñÿ (ñòàðûé óäàëÿåòñÿ, íîâûé ïóñòîé ïîÿâëÿåòüñÿ)
  //Reset(f); //ïðîñòî îòêðûâàåì ôàéë äëÿ ðåäàêòèðîâàíèÿ
  Write(f, x); //çàïèñûâàåì ñòðîêó â ôàéë áåç ïåðåâîäà êóðñîðà íà íîâóþ ñòðîêó
  CloseFile(f); //çàêðûâàåì ôàéë
  SetFileAttributes('E:\TEST\TEST1\1.txt', attr[Random(9)]);
 
  SetFileAttributes('E:\TEST\TEST2\2.txt', FILE_ATTRIBUTE_NORMAL);
  DeleteFile('E:\TEST\TEST2\2.txt');
  y:= y1[Random(33)+1] + y2[Random(26)+1] + y3[Random(10)+1];
  AssignFile(t,'E:\TEST\TEST2\2.txt');
  Rewrite(t);
  Write(t, y);
  CloseFile(t);
  SetFileAttributes('E:\TEST\TEST2\2.txt', attr[Random(9)]);
 
  SetFileAttributes('E:\TEST\TEST3\3.txt', FILE_ATTRIBUTE_NORMAL);
  DeleteFile('E:\TEST\TEST3\3.txt');
  z:= z1[Random(33)+1] + z2[Random(26)+1] + z3[Random(10)+1];
  AssignFile(r,'E:\TEST\TEST3\3.txt');
  Rewrite(r);
  Write(r, z);
  CloseFile(r);
  SetFileAttributes('E:\TEST\TEST3\3.txt', attr[Random(9)]);
end;
 
end.
Вопрос в следующем: При запуске в диспетчере создается очень много потоков, можно ли их синхронизировать? Можно ли сделать, чтобы создавалось случайное количество файлов и в них записывалось слово случайной длины?

Добавлено через 9 часов 13 минут
Вот набросал еще чуть чуть Но вопросы те же остались
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TNewThread = class(TThread)
  procedure Execute; override;
  private
  procedure CreateDirectories; end;
  TMyThread = class(TThread)
  procedure Execute; override;
  private
    FPath: String;
    procedure UpdateLog;
    procedure ThreadStart;
  public
    constructor Create(aPath: String); end;
  TForm1 = class(TForm)
    btn1: TButton;
    btn2: TButton;
    lst1: TListBox;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
 
var
  Form1: TForm1;
implementation
{$R *.dfm}
 
constructor TMyThread.Create(aPath: string);
begin
  inherited Create(True);     //Созданный поток создается в приостановленном состоянии
  FreeOnTerminate := True;    //Поток освободит ресурсы при окончании работы
  FPath := aPath;               //Проверяемый каталог
  Self.Priority := tpHighest; //Очень высокий приоритет
  Resume;
end;
 
procedure TNewThread.Execute;
begin
  Sleep(1000);
  Synchronize(CreateDirectories);
end;
 
procedure TNewThread.CreateDirectories;
begin
  ForceDirectories('E:\TEST\TEST1');
  ForceDirectories('E:\TEST\TEST2');
  ForceDirectories('E:\TEST\TEST3');
end;
 
procedure TMyThread.ThreadStart;
begin
  Form1.lst1.Items.Add(TimeToStr(time)+': монитор запущен');
end;
 
procedure TMyThread.UpdateLog;
begin
  Form1.lst1.Items.Add(TimeToStr(time)+': изменение!');
  if Form1.lst1.Items.Count > 200 then //Показываем только 200 записей
  Form1.lst1.Items.Delete(0);
  Form1.lst1.ItemIndex := Form1.lst1.Items.Count-1;
end;
 
procedure TMyThread.Execute;
var
  HandleChange: THandle;  //Handle создаваемого объекта для ожидания события
begin
//-- Создаем объект для ожидания события
  HandleChange :=
    FindFirstChangeNotification(
      PChar(FPath),                           //Проверяемый каталог
      True,                                  //false - Подкаталоги не проверяются
      FILE_NOTIFY_CHANGE_FILE_NAME +          //Проверка создания/удаления/
      FILE_NOTIFY_CHANGE_ATTRIBUTES);         //переименования/изменения файлов
 
//-- При ошибке Win32Check выводит сообщение и прерывает Execute.
    Win32Check(HandleChange <> INVALID_HANDLE_VALUE);
     Synchronize(ThreadStart);            //Сообщение о старте потока
  try
//-- Цикл, пока для потока не будет выдана команда Terminate
    while not Terminated do
    begin
      case WaitForSingleObject(HandleChange,1000) of
        WAIT_FAILED: Terminate;                //Ошибка, завершаем поток
        WAIT_OBJECT_0: Synchronize(UpdateLog); //Сообщаем об изменении
      end;
      FindNextChangeNotification(HandleChange);
    end;
  finally
    FindCloseChangeNotification(HandleChange);
  end;                    //Сообщаем о завершении потока
end;
 
procedure TForm1.btn1Click(Sender: TObject);
 
Var f:System.Text; //класс текстового файла
t:System.Text;
r:System.Text;
x,y,z : string;
NewThread: TNewThread;
 
const
x1='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'; x2='ABCDEFGHIJKLMNOPQRSTUVWXYZ'; x3='1234567890';
y1='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'; y2='ABCDEFGHIJKLMNOPQRSTUVWXYZ'; y3='1234567890';
z1='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'; z2='ABCDEFGHIJKLMNOPQRSTUVWXYZ'; z3='1234567890';
attr: array [1..9] of integer=(0,1,2,4,8,16,32,64,71);
//FILE_ATTRIBUTE_NORMAL 0
//faReadOnly      1
//faHidden      2
//faSysFile     4
//faVolumeID    8
//faDirectory    16
//faArchive    32
//faSymLink    64
//faAnyFile    71
 
 
 
begin
  NewThread:=TNewThread.Create(true);
  NewThread.FreeOnTerminate:=true;
  NewThread.Priority:=tpLower;
 
  SetFileAttributes('E:\TEST\TEST1\1.txt', FILE_ATTRIBUTE_NORMAL);
  DeleteFile('E:\TEST\TEST1\1.txt');
  x:= x1[Random(33)+1] + x2[Random(26)+1] + x3[Random(10)+1];
  AssignFile(f,'E:\TEST\TEST1\1.txt'); //регистрация файла
  Rewrite(f); //создание файла, если он там есть, то перезаписываеться (старый удаляется, новый пустой появляеться)
  //Reset(f); //просто открываем файл для редактирования
  Write(f, x); //записываем строку в файл без перевода курсора на новую строку
  CloseFile(f); //закрываем файл
  SetFileAttributes('E:\TEST\TEST1\1.txt', attr[Random(9)]);
 
  SetFileAttributes('E:\TEST\TEST2\2.txt', FILE_ATTRIBUTE_NORMAL);
  DeleteFile('E:\TEST\TEST2\2.txt');
  y:= y1[Random(33)+1] + y2[Random(26)+1] + y3[Random(10)+1];
  AssignFile(t,'E:\TEST\TEST2\2.txt');
  Rewrite(t);
  Write(t, y);
  CloseFile(t);
  SetFileAttributes('E:\TEST\TEST2\2.txt', attr[Random(9)]);
 
  SetFileAttributes('E:\TEST\TEST3\3.txt', FILE_ATTRIBUTE_NORMAL);
  DeleteFile('E:\TEST\TEST3\3.txt');
  z:= z1[Random(33)+1] + z2[Random(26)+1] + z3[Random(10)+1];
  AssignFile(r,'E:\TEST\TEST3\3.txt');
  Rewrite(r);
  Write(r, z);
  CloseFile(r);
  SetFileAttributes('E:\TEST\TEST3\3.txt', attr[Random(9)]);
 
  NewThread.Resume;
end;
 
procedure TForm1.btn2Click(Sender: TObject);
begin
    Form1.lst1.Tag := Integer(TMyThread.Create('E:\TEST'));
    btn2.Visible := False;
end;
 
end.
Добавлено через 17 часов 47 минут
Up!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2012, 17:24
Ответы с готовыми решениями:

Поиск файлов в отдельном потоке и отображения поиска файлов
Здравствуйте. По факту пока что вопрос один. Как сделать запуска поиска файлов через пару секунд...

Управление потоками. Изменение значения label (созданного в потоке 1) в потоке 2
Код таков: using System; using System.Collections.Generic; using System.ComponentModel; using...

Копирование файлов в потоке + ProgressBar
Всем доброго времени суток. Кто может подсказать, как можно реализовать копирование файла в потоке...

Получение файлов в отдельном потоке
Здраствуйте. Задача найти файлы в папке делав это в отдельном потоке чтобы избавится от зависаний....

1
2 / 2 / 3
Регистрация: 11.09.2011
Сообщений: 557
22.10.2012, 23:57  [ТС] 2
И снова Up!
0
22.10.2012, 23:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.10.2012, 23:57
Помогаю со студенческими работами здесь

Рекурсивный поиск файлов в отдельном потоке
Подскажите как реализовать рекурсивный поиск файлов в потоке. Как реализовать сам поиск я нашел на...

Загрузка файлов в потоке с отображением прогресса
У меня есть класс AutoUpdaterKit (Класс со всем необходимым для встраивания системы автообновлений...

Скачивание файлов в отдельном потоке с использованием ProgressBar
Привет всем, у меня есть код internal static string DownloadGame(string address) ...

Работа с потоком (Поиск и редактирования файлов в потоке)
Здравствуйте. Создам отдельную. ему. Точнее мне нужно pyfnm как можно получить доступ к элементу...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru