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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
1-9225
ded_di
2002-02-15 11:58
2002.03.04
Объединение ячеек в TStringGrid...


7-9313
Hruks
2001-11-30 11:52
2002.03.04
LPT, COM и Рэлюшки...


1-9170
ProstoChaynik
2002-02-14 09:25
2002.03.04
цвет TButton


14-9294
Val
2002-01-16 10:53
2002.03.04
TObject - сам себя??? :)


6-9246
Snake2000
2001-12-13 15:15
2002.03.04
ТВебБраузер





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