On 4/22/13, Juha Manninen <juha.mannine...@gmail.com> wrote: > So does *.* on Windows. That is why the TFileSearcher behavior was changed.
But I think it is wrong. or ((ASearchMask = '*.*') and (ExtractFileExt(PathInfo.Name) = '')) Now a Filemaks of ???.* will not find 'foo', but it should on Windows. I think the best strategy is to remove dangling '.*' from ASearchMask and replace it by '*' I used something like this in one of my libraries (it works on maskLists, not a single maks, so it's overcomplex for what we need): procedure MaskListWinToLinuxWildCards(var AMaskList: String; const ASeparator: Char); //All we do here is change any mask that ends in '.*' so that it ends in '*' //since in Linux if a mask ends in '.*', a '.' must be in the filename, whilst in Windows //this translates to may or may not have any extension var i: Integer; S: String; SL: TStringList; begin (* if (ASeparator = #0) then begin exit; end; *) SL := TStringList.Create; Try SL.Delimiter := ASeparator; SL.DelimitedText := AMaskList; for i := 0 to SL.Count - 1 do begin S := SL.Strings[i]; //A Windows mask that ends in a period ('.') is the same as the mask ending in '.*' if (S[Length(S)] = '.') then S := S + '*'; //Wildcard end with '.*' ? if (Length(S) > 1) and (S[Length(S)] = '*') and (S[Length(S)-1] = '.') then begin//Replace a wildcard ending in '.*' in one that ends in '*' if appropriate if (S = '.*') then S := '*' else begin//we know that Length(S) > 2 now... if (S[Length(S)-2] in ['?','*']) then begin System.Delete(S,Length(s),1); S[Length(S)] := '*'; //Now the mask might end in '**' (if it ended in '*.*' before, so //if that is the case, we'll remove the last '*' if (Length(S) > 1) and (S[Length(S)-1] = '*') then System.Delete(S,Length(S),1); end else begin //at this point we know that S is something like abc.* //converting this to abc* is wrong, this would also find files like abcdef.* //we want to find in Linux terms both the file abc as well as abc.* //so we add the entry with the filename without the '.*' //and leave the current entry as it is SL.Add(System.Copy(S,1,Length(S)-2)); end; end;//S <> '.*' SL.Strings[i]:= S; end; end; AMaskList := SL.DelimitedText; Finally SL.Free; end; end; This approach has worked for me on Win and Linux with my backup program. Bart -- _______________________________________________ Lazarus mailing list Lazarus@lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus