Главная страница
    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.004 c
1-9140
dim2001
2002-02-17 17:40
2002.03.04
вставка подпрограммы


1-9160
Lotus
2002-02-13 22:19
2002.03.04
срочно нужна помощь по clipboard у!!!


3-9094
Дремучий
2002-02-06 13:42
2002.03.04
Как закрыть незакрытую сессию?


6-9263
Leviathan
2001-12-10 22:29
2002.03.04
Ошибка на сокете


1-9173
Serd
2002-02-14 08:29
2002.03.04
Работа с DLL...





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