Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при поиске файлов 
:(
    Опции темы
Borland_Delphi_6
Дата 23.9.2003, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


LoneLINEss
****


Профиль
Группа: Участник Клуба
Сообщений: 2509
Регистрация: 5.11.2002
Где: in fortune dreams ...

Репутация: нет
Всего: 20



Написал небольшую консольную программку для поиска файлов. Все работает, только когда идет поиском НЕ на диске C:\, файлы находятсЯ, но выдается ошибка. Вот полный код программы:

Код

program timesaver;

{$APPTYPE CONSOLE}
uses
 Windows,
 SysUtils,
 FileCtrl;
var
  FileName: string;  // имя или маска искомого файла
  cDir: string;
  filst:TextFile;
  n: integer;       // кол-во файлов, удовлетворяющих запросу
  winner:TextFile;
  Complete:String;
// поиск файла в текущем каталоге
procedure Find;
var
  SearchRec: TSearchRec; // информация о файде или каталоге
begin
  GetDir(0,cDir); // получить имя текущего каталога
  if cDir[length(cDir)] <> '\' then cDir := cDir+'\';

  if FindFirst(FileName, faArchive,SearchRec) = 0 then
      repeat
         if (SearchRec.Attr and faAnyFile) = SearchRec.Attr then
            begin
              writeln(cDir +  SearchRec.Name);
              n := n + 1;
            end;
       until FindNext(SearchRec) <> 0;

      // обработка подкаталогов текущего каталога
      if FindFirst('*', faDirectory, SearchRec) = 0 then
         repeat
             if (SearchRec.Attr and faDirectory) = SearchRec.Attr then
                 begin
                   // каталоги .. и . тоже каталоги,
                   // но в них входить не надо !!!
                   if SearchRec.Name[1] <> '.' then
                      begin
                        ChDir(SearchRec.Name);// войти в каталог
                        Find; // выполнить поиск в подкаталоге
                        ChDir('..');// выйти из каталога
                      end;
                 end;
         until FindNext(SearchRec) <> 0;
end;

// возвращает каталог, выбранный пользователем
function GetPath(mes: string):string;
var
 Root: string;      // корневой каталог
 pwRoot : PWideChar;
 Dir: string;
begin
 Root := ''; // корневой каталог - папка Рабочий стол
 GetMem(pwRoot, (Length(Root)+1) * 2);
 pwRoot := StringToWideChar(Root,pwRoot,MAX_PATH*2);
 if SelectDirectory(mes, pwRoot, Dir)
    then
         if length(Dir) = 2  // пользователь выбрал корневой каталог
             then GetPath := Dir+'\'
             else GetPath := Dir
    else
         GetPath := '';
end;

// щелчок на кнопке Поиск
begin
if ParamCount>0
then
begin
       FileName := paramStr(1);  // что искать
       cDir := paramStr(2);      // где искать
       n:=0;                    // кол-во найденных файлов
       ChDir(cDir);             // войти в каталог начала поиска
       Find;                    // начать поиск
end;
end.

Вроде бы так. На скорую руку обрезал, возможно, будут какие-нить мелкие ошибки.
PS Выдает ошибку Invalid File Name


--------------------
Blind Guardian Fan :: BMSTU Student :: A polar bear is a rectangular bear after a coordinate transform.

Мои фотографии
PM MAIL WWW   Вверх
dm9
Дата 23.9.2003, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



У меня работает. Сначала при поиске по диску D:\ выдал ошибку. Мне кажется, дело было в том, что там некоторые папки были запрещены для просмотра. По диску E:\ поиск нормальный.
PM MAIL ICQ   Вверх
p0s0l
Дата 23.9.2003, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Пара замечаний:
1)Забываешь делать FindClose - утечка ресурсов
2)Интересная строка
if (SearchRec.Attr and faDirectory) = SearchRec.Attr then
У меня из-за неё из 10 каталогов проверяет только 3...
Нужно так:
if (SearchRec.Attr and faDirectory) <> 0 then
3)Также не очень понятно, зачем тут стоит faArchive:
if FindFirst(FileName, faArchive,SearchRec) = 0 then
Просто ставь faAnyFile
4)Эта строка будет true в любом случае, так что её можно убрать:
if (SearchRec.Attr and faAnyFile) = SearchRec.Attr then
5)Такая проверка неправильная:
if SearchRec.Name[1] <> '.' then
Т.к. могут быть каталоги, начинающиеся с точки: ".exe", "...zzz"

А так всё работает, ничего не вылетает...



--------------------
С уважением, г-н Посол.
PM   Вверх
Borland_Delphi_6
Дата 23.9.2003, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


LoneLINEss
****


Профиль
Группа: Участник Клуба
Сообщений: 2509
Регистрация: 5.11.2002
Где: in fortune dreams ...

Репутация: нет
Всего: 20



p0s0l
Можешь написать поправленный код?


--------------------
Blind Guardian Fan :: BMSTU Student :: A polar bear is a rectangular bear after a coordinate transform.

Мои фотографии
PM MAIL WWW   Вверх
p0s0l
Дата 23.9.2003, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Код
// поиск файла в текущем каталоге
procedure Find;
var
 SearchRec: TSearchRec; // информация о файде или каталоге
begin
 GetDir(0,cDir); // получить имя текущего каталога
 if cDir[length(cDir)] <> '\' then cDir := cDir+'\';

 if FindFirst(FileName, faAnyFile,SearchRec) = 0 then
 begin
     repeat
           writeln(cDir +  SearchRec.Name);
           n := n + 1;
           inc(cnt);
      until FindNext(SearchRec) <> 0;
    FindClose(SearchRec);
 end;

     // обработка подкаталогов текущего каталога
     if FindFirst('*', faDirectory, SearchRec) = 0 then
     begin
        repeat
            if (SearchRec.Attr and faDirectory) <>0 then
                begin
                  // каталоги .. и . тоже каталоги,
                  // но в них входить не надо !!!
                  if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
                     begin
                       ChDir(SearchRec.Name);// войти в каталог
                       Find; // выполнить поиск в подкаталоге
                       ChDir('..');// выйти из каталога
                     end;
                end;
        until FindNext(SearchRec) <> 0;
        FindClose(SearchRec);
     end;
end;




Это сообщение отредактировал(а) p0s0l - 23.9.2003, 20:59


--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 23.9.2003, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Borland_Delphi_6 - если ты уже успел посмотреть предыдущий пост, то опять придется его посмотреть, т.к. я тогда забыл одну вещь исправить...


--------------------
С уважением, г-н Посол.
PM   Вверх
Borland_Delphi_6
Дата 24.9.2003, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


LoneLINEss
****


Профиль
Группа: Участник Клуба
Сообщений: 2509
Регистрация: 5.11.2002
Где: in fortune dreams ...

Репутация: нет
Всего: 20



Ok, большое спасибо!
Но у меня все равно вылетает.... Какое-то "неизвестное программное исключение", а в консоле пишит "Invalid File Name". Запускаю под XP, компилю под Delphi 6.


--------------------
Blind Guardian Fan :: BMSTU Student :: A polar bear is a rectangular bear after a coordinate transform.

Мои фотографии
PM MAIL WWW   Вверх
p0s0l
Дата 24.9.2003, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Ок, тогда тебе нужно узнать на каких именах гнется прога.
Измени такое место:
if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
begin
WriteLn ('***', cDir, ' *** ', SearchRec.Name);
ChDir(SearchRec.Name);// войти в каталог
....
И посмотри, в какой каталог была последняя попытка перейти...
Потом скажи их названия...

Ну а если выяснять причину влом, то сделай так:
Код
if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
begin
 try
   ChDir(SearchRec.Name);// войти в каталог
   Find; // выполнить поиск в подкаталоге
   ChDir('..');// выйти из каталога
 except
 end;
end;


Это сообщение отредактировал(а) p0s0l - 24.9.2003, 09:53


--------------------
С уважением, г-н Посол.
PM   Вверх
Borland_Delphi_6
Дата 24.9.2003, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


LoneLINEss
****


Профиль
Группа: Участник Клуба
Сообщений: 2509
Регистрация: 5.11.2002
Где: in fortune dreams ...

Репутация: нет
Всего: 20



Цитата
Ну а если выяснять причину влом, то сделай так:

Сделал так никакого результата...



--------------------
Blind Guardian Fan :: BMSTU Student :: A polar bear is a rectangular bear after a coordinate transform.

Мои фотографии
PM MAIL WWW   Вверх
Borland_Delphi_6
Дата 25.9.2003, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


LoneLINEss
****


Профиль
Группа: Участник Клуба
Сообщений: 2509
Регистрация: 5.11.2002
Где: in fortune dreams ...

Репутация: нет
Всего: 20



Как хотя бы скрыть ошибку?


--------------------
Blind Guardian Fan :: BMSTU Student :: A polar bear is a rectangular bear after a coordinate transform.

Мои фотографии
PM MAIL WWW   Вверх
x77
Дата 25.9.2003, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



дело, как мне кажется, в следующем. в w2k/xp есть такая штука, как System Volume Information. это каталог. но войти в него нельзя. ни в досе, ни в фаре, ни в эксплорере. а поскольку раполагаться он может на разных винтах, а где-то его может и не быть вообще, то и ошибки воттак "гуляют" - у кого глючит, у кого нет. попробуй рекурсивно входить только в те каталоги, которые не являются системными, т.е.

Код

 ...
 if ((SearchRec.Attr and faDirectory) = faDirectory) and
   ((SearchRec.Attr and faSysFile) <> faSysFile) and
   (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then begin
   ...
 end;
 ...



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Borland_Delphi_6
Дата 25.9.2003, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


LoneLINEss
****


Профиль
Группа: Участник Клуба
Сообщений: 2509
Регистрация: 5.11.2002
Где: in fortune dreams ...

Репутация: нет
Всего: 20



Ну, System Volume Information прежде всего должен быть на диске с, а там ошибки не выдает.


--------------------
Blind Guardian Fan :: BMSTU Student :: A polar bear is a rectangular bear after a coordinate transform.

Мои фотографии
PM MAIL WWW   Вверх
x77
Дата 25.9.2003, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



он может быть на любом диске. попробуй исключить системные каталоги из рекурсивного обхода.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
x77
Дата 25.9.2003, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



З.Ы. у меня был похожий глюк. прога обшаривала указанный каталог и все подкаталоги и вытаскивала из них все иконки из всего, чего можно (dll, exe, etc.). nt у меня тогда стояла на диске d. так вот ,когда я задавал поиск по диску С:\, всё было хорошо. а на D - валилась в AV. лечить это таким образом смысла не имело, т.к. иконки обычно и лежат в системных файлах smile.gif я просто плюнул. но дело, imho, именно в них.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
p0s0l
Дата 25.9.2003, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Попробуй не использовать chdir, по-моему в нём все дело...
Для этого в функции Find добавь параметр пути:

Код
procedure Find(cDir : string);
begin
if cDir[length(cDir)] <> '\' then cDir := cDir+'\';
...
                if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
                    begin
                      Find(cDir + SearchRec.Name); // выполнить поиск в подкаталоге
                    end;
...
end;




--------------------
С уважением, г-н Посол.
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1129 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.