Toon posts:

[delphi] Notificatie

Pagina: 1
Acties:
  • 103 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo allemaal,

Hopelijk weet iemand van julie dit want ik heb me al rot gezocht op dit probleem...

Ik zou een directory met al z'n files en subdirs in de gaten willen houden op veranderingen van files en dirs. (maken, deleten, veranderingen)

Dit is zeer gemakkelijk te doen met deze functies:
FindFirstChangeNotification,
FindNextChangeNotification.

Bijvoorbeeld:
c:\dir1 \file1.txt
\subdir1 \file2.txt
\subdir2\file3.txt

Ik stel de directory om in de gaten te houden in op: dir1 en die parameter om subdirs ook in de gaten te houden zet ik op true.
- Wanneer ik het bestand 'file1.txt' wijzig, dan verwittigt hij me (dit is juist)
- Wanneer ik de directory 'subdir1' wijzig, dan verwittigt hij me (dit is juist)

Problemen:
Wanneer ik bv file2.txt of subdir2 wijzig of ik maak een subdir of file aan dan werkt hetniet?
Het lijkt erop dat hij alleen maar het 1e level in de gaten houdt.

Weet er iemand hoedat kan opgelost worden? Ik zag een functie: ReadDirectoryChangesW
Maar ik kan die niet gebruiken omdat die alleen op NT systemen werkt en niet op 9x...

Bedankt,
Jeroen

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 21:19

Delphi32

Heading for the gates of Eden

In welke taal moet dat? (Hint: ff in topic title opnemen)

Je zou met een hook kunnen werken denk ik. Ik heb dat ooit eens gedaan maar dat is even geleden. Delphi 4 Developers Guide had daar een mooi stukje over, misschien heb je daar wat aan (ook als je niet met Delphi werkt).

  • Onno
  • Registratie: Juni 1999
  • Niet online
Op donderdag 22 november 2001 23:26 schreef jeroen_vaan het volgende:
Het lijkt erop dat hij alleen maar het 1e level in de gaten houdt.

Weet er iemand hoedat kan opgelost worden?
Die functies niet alleen op de directory zelf, maar ook op al z'n subdirectories loslaten? Niet mooi misschien.. maar het werkt wel. :)

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 19:13

Crazy D

I think we should take a look.

Uit MSDN:
FindFirstChangeNotification
The FindFirstChangeNotification function creates a change notification handle and sets up initial change notification filter conditions. A wait on a notification handle succeeds when a change matching the filter conditions occurs in the specified directory or subtree.

HANDLE FindFirstChangeNotification(
LPCTSTR lpPathName, // directory name
BOOL bWatchSubtree, // monitoring option
DWORD dwNotifyFilter // filter conditions
);
Parameters
lpPathName
[in] Pointer to a null-terminated string that specifies the path of the directory to watch.
Windows NT/2000: In the ANSI version of this function, the name is limited to MAX_PATH characters. To extend this limit to nearly 32,000 wide characters, call the Unicode version of the function and prepend "\\?\" to the path. For more information, see File Name Conventions.

Windows 95/98: This string must not exceed MAX_PATH characters.

bWatchSubtree
[in] Specifies whether the function will monitor the directory or the directory tree. If this parameter is TRUE, the function monitors the directory tree rooted at the specified directory; if it is FALSE, it monitors only the specified directory.
dwNotifyFilter
[in] Specifies the filter conditions that satisfy a change notification wait. This parameter can be one or more of the following values.
Klinkt als "dir inclusief subdirs" :)

Exact expert nodig?


Verwijderd

Topicstarter
De taal dat ik gebruik is Delphi.
Als ik dat op iedere subdir loslaat en iedere subdir van die subdirs, zal dat dan niet teveel resources opslorpen?
Maar hoe laat ik dat los op iedere dir met zo weinig mogelijk geheugen te gebruiken?

Heeft er iemand voorbeeldcode om dit te verwezenlijken?

Verwijderd

Hier geen problemen met FindFirstChangeNotification & Delphi; ik zit hier wel op een NT, kan misschien schelen.

Heb je wel de juiste waarde aan NotifyFilter meegegeven?

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 19:13

Crazy D

I think we should take a look.

Geef dan even de API call zoals je 'm gebruikt.
Zoals m'n quote uit MSDN aangeeft, is het gewoon de boolean even goed zetten.
Als ik zin heb test ik het straks wel ff uit in VB, maar ik weet 99.999% zeker dat dat het is, aangezien een oude vriend van me ooit eens een apptoolbaar maakte, waar je directories op kon gooien die hij dan uitklapte. En hij maakte gebruik van die API om bij te houden of er iets veranderde, en dus het menu opnieuw moest opbouwen. En hij vertelde toen heel blij dat het "reuzesimpel, alleen een parameter goed zetten" was.

Exact expert nodig?


Verwijderd

Topicstarter
Ik had eerst een stuk zelf geschreven code maar heb die dan veranderd voor een component.
Dit is de link:
http://homepages.borland.com/torry/vcl/filedrv/notification/dcnotify.zip
Ik zet die property bWatchSubTree op true en de gebruik het component: DiskChangeEx.
De auteur z'n e-mail is niet meer geldig.
In de filter staan ze allemaal op true.

Ik kan nu geen beter vb geven omdat ik de code niet mee heb...

Verwijderd

Dat component werkt bij mij ook gewoon :? Gebruik je het voorbeeld programma?

Verwijderd

Topicstarter
Dus als jij bv een directory maakt zoals dit:
c:\test\sudbdir\subdir2\
en je maakt een file aan in subdir2 dan werkt dat bij jouw ook? Hij zegt dan dat je een file gemaakt hebt op: c:\test\sudbdir\subdir2\test.txt?
Bij mij dus niet...ik werk op een w2000. Ik zal het nog eens proberen op andere OS en kijken of dat gaat.

Verwijderd

Ja :?

Dit zijn de properties:

WatchDir: 'C:\Test'
WatchSubTree: True
Enabled: -
NotifyFilter: Alles aan behalve Security
FileExtensions: -
UseTimer: True
TimerDelay: 1000
MaintainedDirList: True

Dit zijn de events:

OnDiskChange: MessageBeep(0);
OnFilesChanged: [Dit event doet het volgens mij niet in de subdirs]

Als ik dan een tekstbestand ofzo maak met de verkenner of met delphi een bestand wegschrijf in C:\Test\SubDir\SubDir2 hoor ik een beepje.

Verwijderd

Topicstarter
Bedankt alleszinds voor de hulp dat ik al gekregen heb van jullie!

Het is die event: 'OnFilesChanged' dat ik nodig heb omdat ik moet weten 'wat er veranderd is' en niet 'er is IETS veranderd'.

Ik heb al vanalles zitten proberen maar niets werkt om die gewijzigde files in subdirs te tonen met hun naam.

Amaai, Microsoft heeft het weer eens goed in elkaar gestoken hoor...

Nog ander idee om dit op te lossen?

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 19:13

Crazy D

I think we should take a look.

Op vrijdag 23 november 2001 12:49 schreef jeroen_vaan het volgende:
Amaai, Microsoft heeft het weer eens goed in elkaar gestoken hoor...
Functie zit netjes in elkaar hoor. Als het niet werkt is het dat componentje wat brak is :P

Andere oplossing? Zelf schrijven 8-)
Zo moeilijk issie niet, en zeker niet in Delphi als je lekker een aparte thread kan laten lopen ervoor.

Exact expert nodig?


Verwijderd

Ik heb het component wat aangepast [Ja ik heb echt niets te doen vandaag op het werk :)]
code:
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
procedure TScanThread.Execute;
var
  SRes: Integer;
  SRec: TSearchRec;
  NewDList, NewFiles, DeletedFiles: TStringList;
  I: Integer;
  DirList: TStringList; {toegevoegd}

  procedure FillList; {toegevoegd}
  var
    Dir: string;
  begin
    Dir := IncludeTrailingBackslash(DirList[0]);
    DirList.Delete(0);
    SRes := FindFirst(Dir + '*.*', faAnyFile, SRec);
    while (not Terminated) and (SRes = 0) do
    begin
    if (SRec.attr = faDirectory) and (SRec.Name[1] <> '.') then
      DirList.Add(Dir + SRec.Name)
    else
    begin
      if (SRec.attr <> faDirectory) and ((DCN.FileExtensions = '') or
        (Pos(ExtractFileExt(SRec.Name), DCN.FileExtensions) > 0)) then
        NewDList.Add(Dir + SRec.Name);
    end;
    SRes := FindNext(SRec);
    end;
    SysUtils.FindClose(SRec);
  end;

begin
  DCN.Busy := True;
  NewDList := TStringList.Create;
  NewFiles := TStringList.Create;
  DeletedFiles := TStringList.Create;

  DirList := TStringList.Create;
  try
    DirList.Add(DCN.WatchDir);
    while DirList.Count > 0 do
    FillList;
  finally
    DirList.Free;
  end;

  if (not Terminated) and (not IsInit) then
  
  .. Rest is zelfde

Je moet nu nog zorgen dat hij ook verwijderen/toevoegen/naamsveranderingen aan sub-dirs opmerkt, maar dat moet een makkie zijn nu.

Verwijderd

Hoezo wordt hier het wiel voor de 624e keer uitgevonden ...
Bestaan toch al genoeg componenten (FreeWare) die dit doen ???

Verwijderd

Topicstarter
Bedankt DiFool, zal er even naar kijken. (Heb nu te weinig tijd :'()

Als je dat denkt dan mag je gerust ff links geven of opsturen want ik heb er idd wel veel gevonden maar er gevonden die werken?

Het probleem is dat die goed werken om te zeggen: 'Er is iets veranderd' maar dat ze niet/of niet goed werken om te zeggen: 'Dit is veranderd' (lees de thread anders eens).

Als je er kunt geven doe maar gerust! :)

Verwijderd

download de free abf component . deze bevatten een compo met de naam abffoldermonitor. Dir heb ik wel es gebruikt hiervoor. zie http://www.abfsoftware.com/ >:)

Verwijderd

Topicstarter
Maar hoe zie ik wat er gebeurd is?
Die OnChange geeft toch niets terug?
Ik kan toch niet weten als er een file of dir gedelete/gecreerd is en wat z'n naam is?
Ik weet gewoon dat er iets gebeurd is...
Pagina: 1