Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2010, 20:24   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Смущение Процедура поиска НЕ ищет файлы вне "своей" папки

Всем снова привет!

Суть проблемы:

Есть процедура, которая ищет файлы в указанной папке, чекает хеш-суммы, и формирует результат.:
Код:
procedure ListFileAndHash(StartDir: string; Mask: string; List: TStrings);
var
  SearchRec: TSearchRec;
  Buff: string;
  Dir: string;
begin
  Dir := ExtractFilePath(ParamStr(0));
  //извлепкаем путь до данного exe-файла независимо от того где ое лежит
  if Mask = '' then
    Mask := '*.*';
  //если неуказана маска файлов ставим по умолчанию все.
  if StartDir[Length(StartDir)] <> '\' then
    StartDir := StartDir + '\';
  //
  if FindFirst(StartDir + Mask, faAnyFile, SearchRec) = 0 then
  begin
    repeat Application.ProcessMessages;
      if (SearchRec.Attr and faDirectory) <> faDirectory then
      begin
        if StartDir + SearchRec.Name <> ParamStr(0) then
        begin
          case FilesListGenForm.HashGr.ItemIndex of     //Hash type^ MD5 or CRC?
            0: Buff := StartDir + SearchRec.Name + ':' + UpperCase(MD5Print(MD5File(StartDir + SearchRec.Name))); //MD5
            1: Buff := StartDir + SearchRec.Name + ':' + FileCRC(StartDir + SearchRec.Name); //CRC
          end;
          Delete(Buff, 1, Pos(Dir, Buff) + Length(Dir) - 1);
          List.Add(Buff);
        end;
      end
      else if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then
      begin
        ListFileAndHash(StartDir + SearchRec.Name + '\', Mask, List);
      end;
    until FindNext(SearchRec) <> 0;
    FindClose(SearchRec);
  end;
end;
если сканировать родную папку где лежит исполняемый файл, то выдает норм результат вида:
Код:
delphi\bin\brcc.exe:HASH
если указать папку которая не является родной то выдаёт кучу бреда:
Код:
brcc.exe:HASH
:HASH
HASH
пустая строка
пробовал
Код:
Dir := ExtractFilePath(ParamStr(0));
изменить на
Код:
Dir := StartDir;
это исправило ситуаци.. теперь выводит имена файлов и хеши...
Игнорирует написание папок где лежат файлы...

т.е.
Есть папка f:\1 с подпапками.
Код:
1\Текстовый документ.txt
1\
1\Текстовый документ.txt
1\2\Текстовый документ.txt
1\2\
1\2\3\Текстовый документ.txt
1\2\3\
1\2\3\4\Текстовый документ.txt
1\2\3\4\
все файлы txt находит(их 4) и суммы вычисляет но игнорирует пути к файлам:
Код:
Текстовый документ.txt:D41D8CD98F00B204E9800998ECF8427E
Текстовый документ.txt:D41D8CD98F00B204E9800998ECF8427E
Текстовый документ.txt:D41D8CD98F00B204E9800998ECF8427E
\Текстовый документ.tx:D41D8CD98F00B204E9800998ECF8427E
а нормальной работой процедуры считается вот такой вывод:
Код:
\Текстовый документ.txt:D41D8CD98F00B204E9800998ECF8427E
\2\Текстовый документ.txt:D41D8CD98F00B204E9800998ECF8427E
\2\3\Текстовый документ.txt:D41D8CD98F00B204E9800998ECF8427E
\2\3\4\Текстовый документ.txt:D41D8CD98F00B204E9800998ECF8427E
процедура правельно работает если StartDir , присвоить ExtractFilePath(ParamStr(0))/

Если указать другую папку то выводит всякий бред.. как показыно где-то выше=)
Помогите подкорректировать. =)
Человек_Борща вне форума Ответить с цитированием
Старый 06.06.2010, 20:59   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не проверял, но, если Вы уберёте вот эту строчку:
Код:
 Delete(Buff, 1, Pos(Dir, Buff) + Length(Dir) - 1);
то выводится будет ПОЛНЫЙ ПУТЬ к файлу.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.06.2010, 21:13   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

это строка обрезает все что выше каталога StartDir

К примеру если я укажу папку
f:\papka1\papka2\
то мне выводит все что есть в papka2

Вид будет такой:
Код:
\papka2\1.xt
\papka2\papka3\3.txt
все что выше papka2 указано не будет(в том числе и буква диска).
Так надо для работы программы.

так что проблема не сдесь=)
Человек_Борща вне форума Ответить с цитированием
Старый 06.06.2010, 23:10   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
поможет кто-нибуть?
да.

1) удалите из процедуры ListFileAndHash
var Dir: string;
и, соответственно
Dir := ExtractFilePath(ParamStr(0));

2) добавьте глобальную переменную Dir (например, в описание формы, или просто, через VAR

3) измените вызов ListFileAndHash (там, где Вы её вызываете - (по какому-о событию...)
вызов осуществите так:
Код:
   Dir := 'ТутВАшаПапка с файлами';
   ListFileAndHash(Dir, .... <дальше как у Вас было>)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.06.2010, 11:42   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

нет , проверил не работает...
Человек_Борща вне форума Ответить с цитированием
Старый 07.06.2010, 13:17   #6
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Вполне работает такой метод. Можно ещё свести задачу лишь к удалению N первых символов. Например, можно заменить процедуру на
Код:
procedure ListFileAndHash(count: integer; StartDir: string; Mask: string; List: TStrings);
Переменную Dir убрать, а из процедуры рекурсивно вызывать
Код:
ListFileAndHash(count, StartDir + SearchRec.Name + '\', Mask, List);
далее заменить удаление из Buf на
Код:
Delete(Buff, 1, count);
А при первоначальном вызове процедуры писать
Код:
ListFileAndHash(length('f:\1'),'f:\1', '*', ListBox1.Items);

Последний раз редактировалось eoln; 07.06.2010 в 13:21.
eoln вне форума Ответить с цитированием
Старый 07.06.2010, 13:26   #7
KPEKEPok
Новичок
Джуниор
 
Регистрация: 07.06.2010
Сообщений: 1
По умолчанию

подкажите пожалуйста. В Листинге программы есть вот такая процедура, которая дальше используется соответственно практически везде.
procedure error(msg:string);
begin
raise exception.create(msg);
end;
препод мне задал вопрос что такое exception.
Я ему отвелил что в данной ситуации я при помощи raise вызываю exception это вызов исключительной ситуации.
он мне задает следующий вопрос:"а что делает exception" почему ты использовал в своей курсовой а я ее не делал.
KPEKEPok вне форума Ответить с цитированием
Старый 07.06.2010, 14:14   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

о теперь работает .. но был баг..
у файлов указанных через путь всегда оставался слеш в начале:
Код:
\1.txt:HASH
избавился вот так:
Код:
procedure ListFileAndHash(Count:Integer;StartDir: string; Mask: string; List: TStrings);
var
  SearchRec: TSearchRec;
  Buff: string;
begin
  //извлепкаем путь до данного exe-файла независимо от того где ое лежит
  if Mask = '' then
    Mask := '*.*';
  //если неуказана маска файлов ставим по умолчанию все.
  if StartDir[Length(StartDir)] <> '\' then
    StartDir := StartDir + '\';
  //
  if FindFirst(StartDir + Mask, faAnyFile, SearchRec) = 0 then
  begin
    repeat Application.ProcessMessages;
      if (SearchRec.Attr and faDirectory) <> faDirectory then
      begin
        if StartDir + SearchRec.Name <> StartDir then
        begin
          case FilesListGenForm.HashGr.ItemIndex of     //Hash type^ MD5 or CRC?
            0: Buff := StartDir + SearchRec.Name + ':' + UpperCase(MD5Print(MD5File(StartDir + SearchRec.Name)));
            1: Buff := StartDir + SearchRec.Name + ':' + FileCRC(StartDir + SearchRec.Name);
          end;
          Delete(Buff, 1,count);
          if Buff[1]='\' then
           Delete(buff, 1, 1);
          List.Add(Buff);
        end;
      end
      else if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then
      begin
        ListFileAndHash(count, StartDir + SearchRec.Name + '\', Mask, List);
      end;
    until FindNext(SearchRec) <> 0;
    FindClose(SearchRec);
  end;
end;
Человек_Борща вне форума Ответить с цитированием
Старый 07.06.2010, 14:16   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

KPEKEPok
по видимому запостил в первую попавшуюся тему.
создай свою тему и там пости.. правило "1 вопрос - 1 тема."
Человек_Борща вне форума Ответить с цитированием
Старый 07.06.2010, 14:54   #10
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
о теперь работает .. но был баг..
у файлов указанных через путь всегда оставался слеш в начале:
Код:
\1.txt:HASH
Странно
Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
а нормальной работой процедуры считается вот такой вывод:
Код:
\Текстовый документ.txt:D41D8CD98F00B204E9800998ECF8427E
\2\Текстовый документ.txt:D41D8CD98F00B204E9800998ECF8427E
\2\3\Текстовый документ.txt:D41D8CD98F00B204E9800998ECF8427E
\2\3\4\Текстовый документ.txt:D41D8CD98F00B204E9800998ECF8427E
eoln вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# ошибка:"Индекс находился вне границ массива" potap88 Помощь студентам 16 18.04.2010 15:50
CR-Team ищет программистов для проeкта "Дальний Свет" Ha3aP Фриланс 6 22.10.2009 19:28
настроить при открытии Excel 2003 в окошке "Тип файлов" вывод пункта "Все файлы (*.*)" по умолчанию? Unior Microsoft Office Excel 2 01.03.2009 02:42
"Текстовые файлы" и "Графика и подпрограммы" Nata!!!@ Помощь студентам 5 05.12.2007 18:17