PDA

View Full Version : چطور میشه به جدول ایندکس فایل های سیستم دسترسی داشت؟



nasim984
دوشنبه 04 دی 1385, 21:14 عصر
چطور میشه با دلفی به جدول ایندکس فایل های سیستم دسترسی داشت؟ و اینکه هر تغییری کردند بلا فاصله بتوان تغییراتشان را در یک دیتا بیس ذخیره کرد؟

mzjahromi
چهارشنبه 06 دی 1385, 12:22 عصر
hook رو در سایت جستجو کنید

nasim984
چهارشنبه 06 دی 1385, 14:03 عصر
با تشکر از آقای mzjahromi
بهتر است که سؤالم را واضح تر بپرسم تا دوستان راهنمایی کنند.
من میخواهم برنامه ای جهت جستجو بر روی کامپیوتر های شخصی پیاده سازی کنم (مثلgoogle desktop) این برنامه برای بار اول تمام فایل های موجود بر روی سیستم را جستجو میکند وقسمت های لازم از این فایل ها را به پایگاه داده منتقل میکند ولی در دفعات بعد نباید تمام فایل ها را جستجو کند در واقع باید hook کند و هر فایلی که در سیستم تغییر کرد یا نامش عوض شد یا جابجا شود یا مطالبی به محتویاتش اضافه شود و ... را شناسایی کند و تغییرات آن فایل را ثبت کند.
مشکل اساسی در مرحله دوم هست.
در سایت جستجو کردم مواردی بود که شبیه به سوال من باشد ولی من احتیاج به جواب دقیق تری دارم.

Identifier
چهارشنبه 06 دی 1385, 18:30 عصر
من میخواهم برنامه ای جهت جستجو بر روی کامپیوتر های شخصی پیاده سازی کنم (مثلgoogle desktop) این برنامه برای بار اول تمام فایل های موجود بر روی سیستم را جستجو میکند وقسمت های لازم از این فایل ها را به پایگاه داده منتقل میکندبا استفاده از کد زیر میتونید فایلهای مورد نیاز رو جستجو کنید و اطلاعات مورد نیاز را در دیتابیس و یا فایل XML ذخیره کنید :



var
filelist: TStringlist;


procedure FindFile(MyDirectory: string);
var
sr: TSearchRec;

begin
Filelist.Clear;
if FindFirst(MyDirectory + '*.YYY', faAnyFile, sr) = 0 then
begin
repeat
FileList.Add(MyDirectory + sr.Name)
until FindNext(sr) <> 0;
FindClose(sr);
end;
end;

که در کد فوق YYY پسوند فایل مورد نظر است ؛ حال پس از ذخیره اطلاعات مورد نظر با استفاده از یونیت SHChangeNotify میتوانید تغییراتی که بر روی فایل ها رخ می دهد را مانیتور کنید؛ کد زیر نمونه ای از نحوه چگونگی انجام این کار است :



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, SHChangeNotify, ComCtrls, ExtCtrls, StdCtrls;



type
TForm1 = class(TForm)
lv: TListView;
cn: TSHChangeNotify;
pc: TPageControl;
tsView: TTabSheet;
tsTree: TTabSheet;
tv: TTreeView;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure cnAssocChanged(Sender: TObject; Flags: Cardinal; Path1,
Path2: String);
procedure cnAttributes(Sender: TObject; Flags: Cardinal;
Path1: String);
procedure cnCreate(Sender: TObject; Flags: Cardinal; Path1: String);
procedure cnDelete(Sender: TObject; Flags: Cardinal; Path1: String);
procedure cnDriveAdd(Sender: TObject; Flags: Cardinal; Path1: String);
procedure cnDriveAddGUI(Sender: TObject; Flags: Cardinal;
Path1: String);
procedure cnDriveRemoved(Sender: TObject; Flags: Cardinal;
Path1: String);
procedure cnEndSessionQuery(Sender: TObject;
var CanEndSession: Boolean);
procedure cnMediaInserted(Sender: TObject; Flags: Cardinal;
Path1: String);
procedure cnMediaRemoved(Sender: TObject; Flags: Cardinal;
Path1: String);
procedure cnMkDir(Sender: TObject; Flags: Cardinal; Path1: String);
procedure cnNetShare(Sender: TObject; Flags: Cardinal; Path1: String);
procedure cnNetUnshare(Sender: TObject; Flags: Cardinal;
Path1: String);
procedure cnRenameFolder(Sender: TObject; Flags: Cardinal; Path1,
Path2: String);
procedure cnRenameItem(Sender: TObject; Flags: Cardinal; Path1,
Path2: String);
procedure cnRmDir(Sender: TObject; Flags: Cardinal; Path1: String);
procedure cnServerDisconnect(Sender: TObject; Flags: Cardinal;
Path1: String);
procedure cnUpdateDir(Sender: TObject; Flags: Cardinal; Path1: String);
procedure cnUpdateImage(Sender: TObject; Flags: Cardinal;
Path1: String);
procedure cnUpdateItem(Sender: TObject; Flags: Cardinal;
Path1: String);
private
public
{ Public declarations }
end;

var
Form1: TForm1;


implementation
{$R *.dfm}


function GetNodeByText(ATree:TTreeView; AValue:String; AVisible: Boolean): TTreeNode;
var
Node: TTreeNode;
begin
Result := nil;
if ATree.Items.Count = 0 then Exit;
Node := ATree.Items[0];
while Node <> nil do
begin
if UpperCase(Node.Text) = UpperCase(AValue) then
begin
Result := Node;
if AVisible then
Result.MakeVisible;
Break;
end; { if }
Node := Node.GetNext;
end; { while }
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'Asso cChanged');
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'Attr ibutes');
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'Crea te');
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'Dele te');
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'Driv eAdd');
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'Driv eAddGUI');
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'Driv eRemoved');
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'EndS essionQuery');
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'Medi aInserted');
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'Medi aRemoved');
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'MkDi r');
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'NetS hare');
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'NetU nshare');
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'Rena meFolder');
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'Rena meItem');
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'RmDi r');
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'Serv erDisconnect');
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'Upda teDir');
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'Upda teImage');
tv.Items.AddFirst(TTreeNode.Create(tv.Items),'Upda teItem');

cn.Execute;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
cn.Stop;
end;

procedure TForm1.cnAssocChanged(Sender: TObject; Flags: Cardinal; Path1,
Path2: String);
begin
with lv.Items.Add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('AssocChanged');
SubItems.Add(Path1);
SubItems.Add(Path2);
end;

tv.Items.AddChildFirst(GetNodeByText(tv,'AssocChan ged',false),DateTimeToStr(Now) + #9 + Path1 + #9 + Path2);


end;

procedure TForm1.cnAttributes(Sender: TObject; Flags: Cardinal;
Path1: String);
begin
with lv.Items.Add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('Attributes');
SubItems.Add(Path1);
SubItems.Add('');
end;

tv.Items.AddChildFirst(GetNodeByText(tv,'Attribute s',false),DateTimeToStr(Now) + #9 + Path1);

end;

procedure TForm1.cnCreate(Sender: TObject; Flags: Cardinal; Path1: String);
begin
with lv.Items.Add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('Create');
SubItems.Add(Path1);
SubItems.Add('');
end;
tv.Items.AddChildFirst(GetNodeByText(tv,'Create',f alse),DateTimeToStr(Now) + #9 + Path1);
end;

procedure TForm1.cnDelete(Sender: TObject; Flags: Cardinal; Path1: String);
begin
with lv.Items.Add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('Delete');
SubItems.Add(Path1);
SubItems.Add('');
end;
tv.Items.AddChildFirst(GetNodeByText(tv,'Delete',f alse),DateTimeToStr(Now) + #9 + Path1);
end;

procedure TForm1.cnDriveAdd(Sender: TObject; Flags: Cardinal;
Path1: String);
begin
with lv.Items.Add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('DriveAdd');
SubItems.Add(Path1);
SubItems.Add('');
end;
tv.Items.AddChildFirst(GetNodeByText(tv,'DriveAdd' ,false),DateTimeToStr(Now) + #9 + Path1);
end;

procedure TForm1.cnDriveAddGUI(Sender: TObject; Flags: Cardinal;
Path1: String);
begin
with lv.Items.Add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('DriveAddGUI');
SubItems.Add(Path1);
SubItems.Add('');
end;
tv.Items.AddChildFirst(GetNodeByText(tv,'DriveAddG UI',false),DateTimeToStr(Now) + #9 + Path1);
end;

procedure TForm1.cnDriveRemoved(Sender: TObject; Flags: Cardinal;
Path1: String);
begin
with lv.Items.Add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('DriveRemoved');
SubItems.Add(Path1);
SubItems.Add('');
end;
tv.Items.AddChildFirst(GetNodeByText(tv,'DriveRemo ved',false),DateTimeToStr(Now) + #9 + Path1);
end;

procedure TForm1.cnEndSessionQuery(Sender: TObject;
var CanEndSession: Boolean);
begin
with lv.Items.Add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('EndSessionQuery');
SubItems.Add('');
SubItems.Add('');
end;
tv.Items.AddChildFirst(GetNodeByText(tv,'EndSessio nQuery',false),DateTimeToStr(Now));

end;

procedure TForm1.cnMediaInserted(Sender: TObject; Flags: Cardinal;
Path1: String);
begin
with lv.Items.Add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('MediaInserted');
SubItems.Add(Path1);
SubItems.Add('');
end;
tv.Items.AddChildFirst(GetNodeByText(tv,'MediaInse rted',false),DateTimeToStr(Now) + #9 + Path1);

end;

procedure TForm1.cnMediaRemoved(Sender: TObject; Flags: Cardinal;
Path1: String);
begin
with lv.Items.add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('MediaRemoved');
SubItems.Add(Path1);
SubItems.Add('');
end;
tv.Items.AddChildFirst(GetNodeByText(tv,'MediaRemo ved',false),DateTimeToStr(Now) + #9 + Path1);
end;

procedure TForm1.cnMkDir(Sender: TObject; Flags: Cardinal; Path1: String);
begin
with lv.Items.add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('MkDir');
SubItems.Add(Path1);
SubItems.Add('');
end;
tv.Items.AddChildFirst(GetNodeByText(tv,'MkDir',fa lse),DateTimeToStr(Now) + #9 + Path1);

end;

procedure TForm1.cnNetShare(Sender: TObject; Flags: Cardinal;
Path1: String);
begin
with lv.Items.add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('NetShare');
SubItems.Add(Path1);
SubItems.Add('');
end;
tv.Items.AddChildFirst(GetNodeByText(tv,'NetShare' ,false),DateTimeToStr(Now) + #9 + Path1);

end;

procedure TForm1.cnNetUnshare(Sender: TObject; Flags: Cardinal;
Path1: String);
begin
with lv.Items.add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('NetUnshare');
SubItems.Add(Path1);
SubItems.Add('');
end;
tv.Items.AddChildFirst(GetNodeByText(tv,'NetUnshar e',false),DateTimeToStr(Now) + #9 + Path1);
end;

procedure TForm1.cnRenameFolder(Sender: TObject; Flags: Cardinal; Path1,
Path2: String);
begin
with lv.Items.add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('RenameFolder');
SubItems.Add(Path1);
SubItems.Add(Path2);
end;
tv.Items.AddChildFirst(GetNodeByText(tv,'RenameFol der',false),DateTimeToStr(Now) + #9 + Path1 + #9 + Path2);
end;

procedure TForm1.cnRenameItem(Sender: TObject; Flags: Cardinal; Path1,
Path2: String);
begin
with lv.Items.add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('RenameItem');
SubItems.Add(Path1);
SubItems.Add(Path2);
end;
tv.Items.AddChildFirst(GetNodeByText(tv,'RenameIte m',false),DateTimeToStr(Now) + #9 + Path1 + #9 + Path2);
end;

procedure TForm1.cnRmDir(Sender: TObject; Flags: Cardinal; Path1: String);
begin
with lv.Items.add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('RmDir');
SubItems.Add(Path1);
SubItems.Add('');
end;
tv.Items.AddChildFirst(GetNodeByText(tv,'RmDir',fa lse),DateTimeToStr(Now) + #9 + Path1);

end;

procedure TForm1.cnServerDisconnect(Sender: TObject; Flags: Cardinal;
Path1: String);
begin
with lv.Items.add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('ServerDisconnect');
SubItems.Add(Path1);
SubItems.Add('');
end;
tv.Items.AddChildFirst(GetNodeByText(tv,'ServerDis connect',false),DateTimeToStr(Now) + #9 + Path1);
end;

procedure TForm1.cnUpdateDir(Sender: TObject; Flags: Cardinal;
Path1: String);
begin
with lv.Items.add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('UpdateDir');
SubItems.Add(Path1);
SubItems.Add('');
end;
tv.Items.AddChildFirst(GetNodeByText(tv,'UpdateDir ',false),DateTimeToStr(Now) + #9 + Path1);
end;

procedure TForm1.cnUpdateImage(Sender: TObject; Flags: Cardinal;
Path1: String);
begin
with lv.Items.add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('UpdateImage');
SubItems.Add(Path1);
SubItems.Add('');
end;
tv.Items.AddChildFirst(GetNodeByText(tv,'UpdateIma ge',false),DateTimeToStr(Now) + #9 + Path1);
end;

procedure TForm1.cnUpdateItem(Sender: TObject; Flags: Cardinal;
Path1: String);
begin
with lv.Items.add do
begin
Caption:=DateTimeToStr(Now);
SubItems.Add('UpdateItem');
SubItems.Add(Path1);
SubItems.Add('');
end;
tv.Items.AddChildFirst(GetNodeByText(tv,'UpdateIte m',false),DateTimeToStr(Now) + #9 + Path1);
end;

end.

جهت اطلاعات بیشتر میتونید به منابع زیر نیز مراجعه کنید :

http://www.torry.net/quicksearchd.php?String=notification&Title=Yes (http://www.torry.net/notification.htm)
http://cc.codegear.com/Item.aspx?id=18717

موفق باشید.