{ipb.vars['home_name']}



العضو المميز للربع الأول 2007

المشرف المميز للربع الأول 2007

Eng. Usama El-Mokadem

Zahrah

> 
اعلان :

قبل الطرح في القسم الرجاء قراءة قواعد المشاركة في قسم الديلفي

 
 تعقيب موضوع جديد
> البحث عن كلمة في ملف
mojo
شارك أمس, 01:26 PM
مشاركة #1


عضو جديد
*

المجموعة: اعضاء جدد
المشاركات: 1
التسجيل: أمس, 01:13 PM
رقم العضوية.: 114,589

إنذار: (0%) -----


لقد كنت استعمل هذا الكود للبحث عن كلمة في ملفات , ولكن المشكلة اليوم هي ان البحث عن كلمات بالغة العربية لاتظهر يعنى البحث لايعطي اي نتيجة رغم انني استعملت بعض وحدات TntSysUtils ولكن بدون نتيجة فهل من مساعدة من فظلكم وشكرا :
هذا هو الكود :
كود
function ScanFile(const filename: String;
                 const forString: String; // حتى ولو إستعملت WideString فهذا لايعطي اية نتيجة  
                 caseSensitive: Boolean ): LongInt;
{ returns position of string in file or -1, if not found }
const
BufferSize= $8001;  { 32K+1 bytes }
var
pBuf, pEnd, pScan, pPos : PWidechar;
filesize: LongInt;
bytesRemaining: LongInt;
bytesToRead: Integer;
F   : File;
SearchFor: PWidechar;
oldMode: Word;
begin
Result := -1;  { assume failure }
if (Length( forString ) = 0) or (Length( filename ) = 0) then
   Exit;
SearchFor := nil;
pBuf      := nil;

{ open file as binary, 1 byte recordsize }
AssignFile( F, filename );
oldMode := FileMode;
FileMode := 0;    { read-only access }
Reset( F, 1 );
FileMode := oldMode;
try { allocate memory for buffer and pchar search string }
   SearchFor := StrAllocW( Length( forString )+1 );
   StrPCopyW( SearchFor, forString );
  if not caseSensitive then  { convert to upper case }

  Tnt_WideUpperCase(SearchFor ); //
    // AnsiUpperCase( SearchFor );
   GetMem( pBuf, BufferSize );
   filesize := System.Filesize( F );
   bytesRemaining := filesize;
   pPos := nil;
   while bytesRemaining > 0 do
   begin
     { calc how many bytes to read this round }
     if bytesRemaining >= BufferSize then
       bytesToRead := Pred( BufferSize )
     else
       bytesToRead := bytesRemaining;

     { read a buffer full and zero-terminate the buffer }
     BlockRead(F, pBuf^, bytesToRead, bytesToRead);
     pEnd := @pBuf[ bytesToRead ];
     pEnd^:= #0;
     { scan the buffer. Problem: buffer may contain #0 chars! So we
       treat it as a concatenation of zero-terminated strings. }
     pScan := pBuf;
     while pScan < pEnd do
     begin
      if not caseSensitive then { convert to upper case }
        Tnt_WideUpperCase( pScan );
       pPos := StrPosW( pScan, SearchFor );  { search for substring }
       if pPos <> nil then
       begin { Found it! }
         Result := FileSize - bytesRemaining +
                   LongInt( pPos ) - LongInt( pBuf );
         Break;
       end;
       pScan := StrEndW( pScan );
       Inc( pScan );
     end;
     if pPos <> nil then
       Break;
     bytesRemaining := bytesRemaining - bytesToRead;
     if bytesRemaining > 0 then
     begin
     { no luck in this buffers load. We need to handle the case of
       the search string spanning two chunks of file now. We simply
       go back a bit in the file and read from there, thus inspecting
       some characters twice
     }
       Seek( F, FilePos(F)-Length( forString ));
       bytesRemaining := bytesRemaining + Length( forString );
     end;
   end; { While }
finally
   CloseFile( F );
   If SearchFor <> nil then
     StrDisposeW( SearchFor );
   If pBuf <> nil then
     FreeMem( pBuf, BufferSize );
end;
end; { ScanFile }
procedure GetFileList( FileList: TStringList; inDir, Extension : String );
procedure ProcessSearchRec( aSearchRec : TSearchRecW );
var
  sDate: String;
begin
   if ( aSearchRec.Attr and faDirectory ) <> 0 then
   begin
     if ( aSearchRec.Name <> '.' ) and
        ( aSearchRec.Name <> '..' ) then
     begin
       GetFileList( FileList, Extension, InDir + '\' + aSearchRec.Name );
     end;
   end
   else
   begin
     sDate := DateTimeToStr(FileDateToDateTime(aSearchRec.Time));
     FileList.Add(inDir + '\' + aSearchRec.Name);

   end;

end;

var CurDir : String;
aSearchRec : TSearchRecW;
begin
CurDir := inDir + '\*.' + Extension;
if WideFindFirst( CurDir, faAnyFile, aSearchRec ) = 0 then
begin
   ProcessSearchRec( aSearchRec );
   while WideFindNext( aSearchRec ) = 0 do
     ProcessSearchRec( aSearchRec );
end;
WideFindClose(aSearchRec);

end;



procedure TForm1.GetHTMLFileList(Directory, SearchString: WideString;
  CaseSens: Boolean);
var
FL: TStringList;
begin
FL := TStringList.Create;
FL.Sorted := True;
GetFileList(FL, Directory, 'HTM*');
ProcessHTMLFIles(FL, SearchString, CaseSens);
FL.Free;
end;


procedure TForm1.ProcessHTMLFiles(FileList: TStringList;
  SearchString: WideString; CaseSens: Boolean);
var
i: Integer;
begin
for i := 0 to Pred(FileList.Count) do
begin
   if ScanFile(FileList.Strings[i], SearchString, CaseSens) > 0 then
   begin
     // The result was found
     Memo1.Lines.Add(FileList.Strings[i]); // هنا استعمل  TntMemo لإظهار إسم الملفات التي تحتوي على الكلمة المراد البحث عنها
   end;
end;
end;
 أعلى الصفحة
+تعقيب
B.M.AbdelAziZ
شارك اليوم, 11:06 AM
مشاركة #2


0neZer0
أيقونات المجموعة

المجموعة: المشرفين
المشاركات: 2,821
التسجيل: 2-August 05
البلد: بين الصفر و الواحد...بلد العجائب...Oz
رقم العضوية.: 55,473




اخي حتى تسهل مساعدتك اكثر، هل ممكن ترفق مثال
اقصد Project
ليكون الامر اسرع من نسخ/لسق الكود المكتوب فوق


--------------------
One's mind once stretched by a new idea, never regains its orginal dimensions

تصويت - مشروع جماعي خطوة خطوة من البداية حتى النهاية

 أعلى الصفحة
+تعقيب

الرد السريع تعقيب موضوع جديد
2 عدد القراء الحاليين لهذا الموضوع (1 الزوار 0 المتخفين)
1 الأعضاء: mojo

 



0.1300 ثانية    --    12 الإستفسارات    GZIP Enabled