Непонятное AV...

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Непонятное AV...

Сообщение BadBoyAlex » 31.12.2012 15:26:44

Есть функция проверки имени файла по маске:
Код: Выделить всё
function isMatchByMask (const AText, AMask: UTF8String): boolean;
//Собственно функция поиска по маске
function ScanByMaskItem (const ATxt, AMsk: UTF8String): boolean;
var StarPos, i: integer;
     MaskToStar, MaskPassStar, s, t: UTF8String;
     b, c: boolean;
begin
//главное ограничение - допускается лишь один "*"!
if AMsk = '*' then
  Result:= true
  else
  begin
  StarPos:= Pos('*', AMsk);
  if (StarPos = 0) or (StarPos = 1) then
   MaskToStar:= ''
   else
   MaskToStar:= Copy(AMsk, 1, StarPos - 1);
  if StarPos = Length(AMsk) then
   MaskPassStar:= ''
   else
   MaskPassStar:= Copy(AMsk, StarPos + 1, Length(AMsk) - StarPos);
  if (MaskToStar <> '') and (Length(MaskToStar) < Length(ATxt)) then
   s:= Copy(ATxt, 1, Length(MaskToStar))
   else
   s:= '';
  if (MaskPassStar <> '') and (Length(ATxt) - Length(MaskToStar) + 1 > 0) then
   t:= Copy(ATxt, Length(ATxt) - Length(MaskPassStar) + 1, Length(ATxt))
   else
   t:= '';
  b:= (UTF8CompareText(MaskToStar, s) = 0);
  c:= (UTF8CompareText(MaskPassStar, t) = 0);
  Result:= (b and c);
  end;
end;
var MList: TStringList;
    FName, FMName, FExt, FMExt: UTF8String;
    i: integer;
begin
//По умолчанию, нет соответствия
Result:= false;
//Создаём список масок (все маски должны быть в "" и разделитель масок - ;)
MList:= TStringList.Create;
MList.Delimiter:= ';';
MList.QuoteChar:= '"';
MList.DelimitedText:= AMask;
if MList.Count > 0 then
for i:= 0 to MList.Count - 1 do
  begin
  //выделяем имя файла
  FName:= ExtractFileNameOnly(AText);
//и имя файла в маске
  FMName:= ExtractFileNameOnly(MList[i]);
//Выделяем расширение файла
  FExt:= ExtractFileExt(AText);
  if (FExt[1] = '.') then
   FExt:= Copy(FExt, 2, Length(FExt) - 1);
//и расширение в маске
  FMExt:= ExtractFileExt(MList[i]);
  if (FMExt[1] = '.') then
   FMExt:= Copy(FMExt, 2, Length(FMExt) - 1);
//Проверяем имя файла и расширение на соответствие имени и расширению маски
  if (ScanByMaskItem(FName, FMName) and ScanByMaskItem(FExt, FMExt)) then
//если и имя, и расширение удовлетворяют имени и расширению маски, то соответствует
   Result:= true;
  end;
MList.Free;
end;

По отдельности, эта функция прекрасно работает, а вот в функции сканирования папок:
Код: Выделить всё
procedure ScanDir (const ADir, ASourceDir, ATargetDir, ACopyConfigFile, AMaskList: string; const isMove, ARecursion: boolean; var vFilesCount: Int64);
var SR: TSearchRec;
begin
if FindFirstUTF8(IncludeTrailingBackslash(ADir) + '*.*', faAnyFile, SR) = 0 then
  repeat
   if not ((SR.Name = '.') or (SR.Name = '..')) then
    begin
    Application.ProcessMessages;
    if ((SR.Attr and faDirectory) = faDirectory) and ARecursion then
     ScanDir(IncludeTrailingBackslash(ADir) + SR.Name, ASourceDir, ATargetDir, ACopyConfigFile, AMaskList, isMove, ARecursion, vFilesCount)
     else
     if isMatchByMask(SR.Name, AMaskList) then
      Inc(vFilesCount);
   end;
  until FindNextUTF8(SR) <> 0;
FindCloseUTF8(SR);
end;

постоянно крашится и ассемблер (ох, научится бы его понимать!) выдаёт следующее:
Изображение
и жалуется на
Код: Выделить всё
if isMatchByMask(SR.Name, AMaskList) then
Аватара пользователя
BadBoyAlex
постоялец
 
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород

Re: Непонятное AV...

Сообщение BadBoyAlex » 07.01.2013 14:40:21

Есть ли у кого-нибудь какие-либо соображения: что здесь не так? Замучился уже с этой проблемой...
Аватара пользователя
BadBoyAlex
постоялец
 
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород

Re: Непонятное AV...

Сообщение Padre_Mortius » 07.01.2013 16:27:03

BadBoyAlex,можно получить от вас пример?
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Непонятное AV...

Сообщение BadBoyAlex » 07.01.2013 16:59:03

Padre_Mortius, странно, если его отдельно написать - ошибки нету, а если в коде моей проги вызвать - тут же ошибка...
Аватара пользователя
BadBoyAlex
постоялец
 
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород

Re: Непонятное AV...

Сообщение Vadim » 07.01.2013 19:09:24

Код: Выделить всё
if isMatchByMask(SR.Name, AMaskList) then

Вы когда SR.Name передаёте в функцию, переменная SR у Вас где объявлена и что содержит? AMaskList?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Непонятное AV...

Сообщение BadBoyAlex » 07.01.2013 19:13:02

Vadim писал(а):Вы когда SR.Name передаёте в функцию, переменная SR у Вас где объявлена и что содержит?

Код: Выделить всё
var SR: TSearchRec;

содержит имя файла

Vadim писал(а):AMaskList?


список масок...
Аватара пользователя
BadBoyAlex
постоялец
 
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород

Re: Непонятное AV...

Сообщение alexs » 07.01.2013 23:58:15

BadBoyAlex
Попробуй объявить строки в параметрах функции без const.
У меня как то раз был с этим глюк.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Непонятное AV...

Сообщение BadBoyAlex » 08.01.2013 10:32:02

alexs писал(а):Попробуй объявить строки в параметрах функции без const.

Не помогло...
Аватара пользователя
BadBoyAlex
постоялец
 
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород

Re: Непонятное AV...

Сообщение alexey38 » 08.01.2013 10:32:41

SR.Name - вроде бы имеет тип String. А isMatchByMask (const AText, AMask: UTF8String) тип UTF8String. Что значит String зависит от параметров компиляции. Совпадают ли типы String с UTF8String в Вашем случае сказать сложно.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Непонятное AV...

Сообщение BadBoyAlex » 08.01.2013 10:36:10

alexey38 писал(а):SR.Name - вроде бы имеет тип String. А isMatchByMask (const AText, AMask: UTF8String) тип UTF8String. Что значит String зависит от параметров компиляции. Совпадают ли типы String с UTF8String в Вашем случае сказать сложно.

Не работает даже если поставить String или AnsiString.

Добавлено спустя 9 минут 2 секунды:
НАШЁЛ!
Он ругается (почему не знаю!) на это
Код: Выделить всё
if (FExt[1] = '.') then
FExt:= Copy(FExt, 2, Length(FExt) - 1);
//...
if (FMExt[1] = '.') then
FMExt:= Copy(FMExt, 2, Length(FMExt) - 1);

Если закомментировать это, то работает как надо!

Добавлено спустя 8 минут 43 секунды:
Не работает, даже если поставить так:
Код: Выделить всё
if (FExt[1] = '.') then
Delete(FExt, 1, 1);
//...
if (FMExt[1] = '.') then
Delete(FMExt, 1, 1);
Аватара пользователя
BadBoyAlex
постоялец
 
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород

Re: Непонятное AV...

Сообщение alexey38 » 08.01.2013 10:58:05

Может на это?
BadBoyAlex писал(а):FExt[1] = '.'
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Непонятное AV...

Сообщение BadBoyAlex » 08.01.2013 11:00:48

alexey38 писал(а):Может на это?

А что здесь не так? Проверяется 1 символ равен "." и если да, то удали его.
Аватара пользователя
BadBoyAlex
постоялец
 
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород

Re: Непонятное AV...

Сообщение alexs » 08.01.2013 11:52:03

Добавь проверку на не пустую строку.
Код: Выделить всё
if (FMExt<>'') and (FMExt[1] = '.') then
  Delete(FMExt, 1, 1);

У тебя скорее всего ругается на элемент списка каталога '.' или '..'

PS
А почему не используешь стандартные библиотеки для работы с масками? Masks - там много чего есть. И синтаксис полностью стандартный масок.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Непонятное AV...

Сообщение BadBoyAlex » 08.01.2013 11:55:18

alexs писал(а):А почему не используешь стандартные библиотеки для работы с масками? Masks - там много чего есть. И синтаксис полностью стандартный масок.

Русские файлы Mask не признаёт.
Аватара пользователя
BadBoyAlex
постоялец
 
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 226

Рейтинг@Mail.ru