Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.04;
Скачать: CL | DM;

Вниз

файловая система   Найти похожие ветки 

 
vvr   (2001-11-27 13:13) [0]

Кто-нибуть подскажите пожалуйста как отследить появление файла (при создании, копировании) в заданной папке?
Спасибо!!!


 
panov ©   (2001-11-27 13:16) [1]

Универсальный способ - создать отдельный поток и по таймеру отслеживать изменения, извещая основной поток при изменениях.


 
Dimka Maslov ©   (2001-11-27 19:04) [2]

При этом поток должен иметь наинизший приоритет, и проверять довольно редко, а то будет всё тормозить.


 
panov ©   (2001-11-27 19:19) [3]

>Dimka Maslov © (27.11.01 19:04)
Да, лучше поставить Priiority := tpIdle;


 
andey   (2001-11-27 21:19) [4]

Я извиняюсь может не так понял, но если знаешь какой файл
IF FileExists(C:\Windows\Волны.bmp) Then ShowMessage("Файл есть")
else ShowMessage("Файла нет");
если не знаешь можно попробовать перечитывать FileListBox и сравнивать.


 
Suntechnic ©   (2001-11-28 05:31) [5]

Насчёт потока идея хорошая, а вот таймер это конечно слишком....
Windows имеет специальную для этой цели ф-цию: FindFirstChangeNotification.
Кстати результат её работы может быть использован в т.н. wait ф-циях типа WaitForSingleObject. Так что проблема с приоритетом потока сама собой уплывёт.


 
panov ©   (2001-11-28 07:43) [6]

>Suntechnic © (28.11.01 05:31)
FindFirstChangeNotification будет работать только для локальных дисков, не так ли?


 
Suntechnic ©   (2001-11-28 08:34) [7]

>panov © (28.11.01 07:43)
Ну естественно!!! А что речь разве идёт о сетевой папке? В вопросе об этом ни слова!!! Тема конференции вроде "система", а не "сети" или что то пропустил?


 
Suntechnic ©   (2001-11-28 09:01) [8]

> panov © (28.11.01 07:43)
Да, кстати, когда я говорил "естественно", то это значит, что я ею нигде кроме как локально не пробовал :). Но то, что она не будет работать с сетевыми дисками, ещё не факт... надо проверить... в хелпке кстати об этом ни слова...


 
Andrew41   (2001-11-28 10:17) [9]

Соответствующий компонент есть в библиотеке RxLib и называется TRxFolderMonitor


 
Rom-k   (2001-11-28 11:33) [10]

Поставь таймер и по таймеру проверяй папку. Мне еще пришлось колбасить файлы-образы для сравнения файлов в папке и этих образов


 
Romkin ©   (2001-11-28 12:32) [11]

2panov: FindFirstChange... у меня вполне успешно работает на подключенной сетевой папке... На неподключенной тоже - легко проверить, открыть папку на одном компе, затем с другого изменить содержимое, все перерисовывается


 
Cod -= AYS =-   (2001-11-28 12:40) [12]

В дельфях на закладке Samples есть компонетка tShellChangeNotifier
( на 6 дельфи точно есть, за др. версии не ручаюсь )


 
Егор Матвеев   (2001-11-29 03:03) [13]

tShellChangeNotifier - это наверное в D6. У меня D5. Когда-то я задумал сделать что-то типа сканера. Что-то получилось, но вот отследить событие на вход в какую-либо папку так и не удалось, похоже для этого надо писать свою VxD, но это уже отдельный разговор. Я имею ввиду для с-мы FAT. Для с-мы NTFS не стоит завязываться, т.к. там и так все предусмотрено.

1.Надо создать поток.

type
TScanner = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;

2. Затем в процедуре Execute выполняем все действия.

procedure TScanner.Execute;
var
dwChangeHandles: array[1..3] of THANDLE ;
begin

dwChangeHandles[1]:= FindFirstChangeNotification("C:\MyFolder",
boolean(0),
FILE_NOTIFY_CHANGE_DIR_NAME );

if (dwChangeHandles[1]= INVALID_HANDLE_VALUE) then
begin
ShowMessage("INVALID_HANDLE_VALUE")
ExitProcess(GetLastError());
end;

dwChangeHandles[2]:= FindFirstChangeNotification("C:\MyFolder",
boolean(0),
FILE_NOTIFY_CHANGE_FILE_NAME);

if (dwChangeHandles[2]= INVALID_HANDLE_VALUE) then
begin
ShowMessage("INVALID_HANDLE_VALUE")
ExitProcess(GetLastError());
end;

dwChangeHandles[3]:= FindFirstChangeNotification("C:\MyFolder",
boolean(0),
FILE_NOTIFY_CHANGE_ATTRIBUTES );

if (dwChangeHandles[3]= INVALID_HANDLE_VALUE) then
begin
ShowMessage("INVALID_HANDLE_VALUE")
ExitProcess(GetLastError());
end;

//Поехали
while not(Terminated) do
begin
case WaitForMultipleObjects(3, @dwChangeHandles,FALSE, 10)
// тут стоит троечка, т.к. массив из трех значений
of
//-------------------------------------------------------------

WAIT_OBJECT_0:
begin
ShowMessage("Произведены действия с дирректорией");
if not FindNextChangeNotification(dwChangeHandles[1])
then
ShowMessage("Ошибочка вкралась...");
end;

//--------------------------------------------------------------------

WAIT_OBJECT_0+1:
begin
ShowMessage("Произведены действия с файлом");
if not FindNextChangeNotification(dwChangeHandles[2])
then
ShowMessage("Ошибочка вкралась...");
end;
//--------------------------------------------------------------------
WAIT_OBJECT_0+2:
begin
ShowMessage("Изменены аттрибуты файла или каталога");
if not FindNextChangeNotification(dwChangeHandles[3])
then
ShowMessage("Ошибочка вкралась...");
end;
//-------------------------------------------------------------
end;
end;
end;


Надеюсь, знаешь как работать с потоками ? Как создавать и удалять.

Посмотри еще в хелпе FindFirstChangeNotification. Извиняюсь, может есть какие неточности.

Если будешь записывать результаты в файл, то смотри чтобы этот файл не был в той же папк которую ты сканируешь, иначе программка за LOOPится :-))

Удачи.


 
vvr   (2001-11-29 10:52) [14]

Большое спасибо!!
если можно подробнее о FindFirstChangeNotification



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

Текущий архив: 2002.03.04;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.008 c
3-9073
DimaIv
2002-02-04 21:37
2002.03.04
Реально ли переделать базу сделанную для использрвания


3-9080
ARDA
2002-02-06 12:42
2002.03.04
Проблемы с Database Desktop


1-9240
romulas
2002-02-15 18:20
2002.03.04
Help!!!


1-9214
skywalker
2002-02-14 19:05
2002.03.04
Данные динамического массива


7-9314
Еремин Дмитрий
2001-11-30 09:39
2002.03.04
Вопрос по системе