المساعد الخاص
تحميل ، الرجاء الإنتظار ... |
|
![]() ![]() |
|
|
أمس, 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; |
|
| |
اليوم, 11:06 AM
مشاركة #2
| |
![]() 0neZer0 ![]() المجموعة: المشرفين المشاركات: 2,821 التسجيل: 2-August 05 البلد: بين الصفر و الواحد...بلد العجائب...Oz رقم العضوية.: 55,473 |
اخي حتى تسهل مساعدتك اكثر، هل ممكن ترفق مثال اقصد Project ليكون الامر اسرع من نسخ/لسق الكود المكتوب فوق -------------------- |
|
| |
![]() ![]() ![]() |
0.1300 ثانية
--
12 الإستفسارات
GZIP Enabled
| نسخة خفيفة | الوقت الأن: 26th May 2007 - 11:47 AM |