Модераторы: 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   Вверх
p0s0l
Дата 25.9.2003, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



А еще:
вызываться будет так:
Find(ParamStr(2));



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


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, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


LoneLINEss
****


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

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



Цитата
if ((SearchRec.Attr and faDirectory) = faDirectory) and
  ((SearchRec.Attr and faSysFile) <> faSysFile) and
  (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then begin

Не работает.


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

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


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


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

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



Код
procedure Find(cDir : string);
var
SearchRec: TSearchRec; // информация о файде или каталоге
begin
if cDir[length(cDir)] <> '\' then cDir := cDir+'\';

if FindFirst(cDir + 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(cDir + '*', faDirectory, SearchRec) = 0 then
    begin
       repeat
           if (SearchRec.Attr and faDirectory) <>0 then
               begin
                 // каталоги .. и . тоже каталоги,
                 // но в них входить не надо !!!
              if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
                     Find(cDir + SearchRec.Name); // выполнить поиск в подкаталоге
       until FindNext(SearchRec) <> 0;
       FindClose(SearchRec);
    end;
end;
.....
....
...
// щелчок на кнопке Поиск
begin
if ParamCount>0
then
begin
      FileName := paramStr(1);  // что искать
      cDir := paramStr(2);      // где искать
      n:=0;                    // кол-во найденных файлов
      Find(cDir);                    // начать поиск
end;



Это сообщение отредактировал(а) p0s0l - 26.9.2003, 15:45


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


Advanced Lamer
****


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

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



p0s0l так в факе такая же ошибка! Вот я смотрю что моя программа тормoзит и не все дириктории обходит! А порою просто зависает, не смотря на то что я все учел hmmm.gif


Это сообщение отредактировал(а) Monty - 26.9.2003, 00:03


--------------------
...
О, вещая моя печаль,
О, тихая моя свобода
И неживого небосвода
Всегда смеющийся хрусталь!
PM MAIL ICQ   Вверх
p0s0l
Дата 26.9.2003, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Дак блин, выяснит кто-нибудь наконец, на каких директориях гнется, или нет confused.gifconfused.gif!!!!
У меня XP,NTFS - нигде не гнется...



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


Advanced Lamer
****


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

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



Цитата(p0s0l @ 26.9.2003, 13:44)
Дак блин, выяснит кто-нибудь наконец, на каких директориях гнется, или нет confused.gifconfused.gif!!!!
У меня XP,NTFS - нигде не гнется...

В том то и дело что у меня по началу гнулась прога, потом я заглянул в этот топик и увидел в чем же ошибка! Рекурсивный обход я взял из нашего Фака ........ теперь все работает wink.gif
Лично у меня прога удалила все файлы и папки с извращеными именами и т.д. ........ а до этого зависала так что Терминировать не мог и жал RESET smile.gif

Это сообщение отредактировал(а) Monty - 26.9.2003, 14:57


--------------------
...
О, вещая моя печаль,
О, тихая моя свобода
И неживого небосвода
Всегда смеющийся хрусталь!
PM MAIL ICQ   Вверх
p0s0l
Дата 26.9.2003, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата
потом я заглянул в этот топик и увидел в чем же ошибка!

В чем ошибка ?



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


Advanced Lamer
****


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

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



Цитата(p0s0l @ 26.9.2003, 14:43)
Цитата
потом я заглянул в этот топик и увидел в чем же ошибка!

В чем ошибка ?

У меня было:
Код
.........
if SearchRec.Attr = faDirectory then begin
 if (SearchRec.Name <> '' ) and (SearchRec.Name <> '.') and (SearchRec.Name <> '..')
   then MyRemoveDir(sFileName);
   else begin
................

а стало:
Код
.............
if (SearchRec.Attr and faDirectory) <> 0 then begin
 if (SearchRec.Name <> '' ) and (SearchRec.Name <> '.') and (SearchRec.Name <> '..')
   then MyRemoveDir(sFileName);
   else begin
................

При этом все отлично работает smile.gif ......... я случайно сам не ошибся?
Лично я в это еще не въехал smile.gif

PS и так: "SearchRec.Attr <> faDirectory" не работает ........


--------------------
...
О, вещая моя печаль,
О, тихая моя свобода
И неживого небосвода
Всегда смеющийся хрусталь!
PM MAIL ICQ   Вверх
Borland_Delphi_6
Дата 27.9.2003, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


LoneLINEss
****


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

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



p0s0l у мя твой код не работает sad.gif


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

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


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


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

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



Borland_Delphi_6, Ну выясни же наконец на каких каталогах вылетает!
Вот добавь такое (жирным выделено):
procedure Find
var
SearchRec: TSearchRec; // информация о файде или каталоге
f : TextFile;
begin
...
if ...
begin
...
AssignFile(f, 'log.txt');
Rewrite(f);
WriteLn(f, cDir + SearchRec.Name);
CloseFile(f);

Find
...
end;

Когда прога вылетит скажи что содержится в файле log.txt...

Это сообщение отредактировал(а) p0s0l - 27.9.2003, 11:45


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


LoneLINEss
****


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

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



Теперь вообще все время гнется.... Тобишь я ее запускаю, даю парамметры, а она мне IO Errrrrrrrrrror!


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

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


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



А я делаю так и ошибок не было ни разу
[CODE]Procedure ScanDir(Dir:String);//сканирование диска
Var
SearchRec:TSearchRec;
I: Byte;
begin
with fmFileMask, fmMain, DM do begin
Try
tSpis.DisableControls;//таблица, куда добавляются путь и имя файла
a:=False;
if Dir<>'' then//если передаваемый параметр не пуст
//добавить слеш если он отсутствует
if Dir[length(Dir)]<>'\' then Dir:=Dir+'\';
//если что-то найдено
if FindFirst(Dir+'*.*', faAnyFile, SearchRec)=0 then
repeat
if A=True then BREAK;//прерываем сканирование
//если начало папки - все пропускаем
if (SearchRec.name='.') or (SearchRec.name='..') then continue;
//если найдена папка
if (SearchRec.Attr and faDirectory)<>0 then begin
ScanDir(Dir+SearchRec.name);//найдена папка: "Dir+SearchRec.name"
try
//если включено -искать папки- cbFolders - TCheckBox
if (cbFolders.Checked) then
begin//добавляем имя и путь
tSpis.Append;
tSpis.FieldByName('DirName').AsString:=ExtractFileName(Dir+SearchRec.name);
tSpis.FieldByName('PathName').AsString:=Dir+SearchRec.name;
tSpis.FieldByName('NoDisk').AsString:=tOpisNODISK.AsString;
tSpis.FieldByName('IsFolder').AsInteger:=0;
//если включено -импорт содержимого текстового файла, то добавляем это в Memo-
if (cbReadMe.Checked) and (edReadMe.Text<>'') then
begin//если файл найден, загружаем его содержимое в TDBMemo
if FileExists(dir+SearchRec.name+'\'+edReadMe.Text) then
try
dbMemo1.Lines.LoadFromFile(dir+SearchRec.name+'\'+edReadMe.Text);
except
abort;
end;
end;//if - readme
tSpis.Post;
end;//if - folders
except
beep;
showmessage('Произошла ошибка,'+#13+'Операция будет прервана!');
tSpis.Cancel;
exit;
end;//try-except
end//if
else begin//найден файл
try
//если включено -искать все файлы-
if (cbFiles.Checked) then begin
//если отключено -искать все файлы-
if not (cbAllFiles.Checked) then begin
//если расширение найденного файла соответствует списку -lbExt- (lbExt - TListBox)
For I:=0 to lbExt.Items.Count-1 do
if ((UpperCase(ExtractFileExt(ExtractFileName(Dir+SearchRec.name)))=
UpperCase(lbExt.Items.Strings[i]))) then
begin
tSpis.Append;
tSpis.FieldByName('DirName').AsString:=ExtractFileName(Dir+SearchRec.name);
tSpis.FieldByName('PathName').AsString:=ExtractFilePath(Dir+SearchRec.name);
tSpis.FieldByName('NoDisk').AsString:=tOpisNODISK.AsString;
tSpis.FieldByName('IsFolder').AsInteger:=1;//1-это не папка
tSpis.Post;
end;//if - UpperCase
end//if - AllFiles
else//если вкл. -все файлы-
begin
tSpis.Append;
tSpis.FieldByName('DirName').AsString:=ExtractFileName(Dir+SearchRec.name);
tSpis.FieldByName('PathName').AsString:=ExtractFilePath(Dir+SearchRec.name);
tSpis.FieldByName('IsFolder').AsInteger:=1;//1-это не папке (см событие в dbGrid)
tSpis.Post;
end;
end//if - Files
except
beep;
showmessage('Произошла ошибка,'+#13+'Операция будет прервана!');
exit;
end;//try-except
end;//else
fmStopScan.lbScan.Caption:=Dir+SearchRec.name;
application.ProcessMessages;

until FindNext(SearchRec)<>0;
finally
tSpis.EnableControls;
FindClose(SearchRec);
end;//try-finally
end;//with
end;[CODE]

Это сообщение отредактировал(а) dsergey - 27.9.2003, 23:21
PM MAIL   Вверх
p0s0l
Дата 28.9.2003, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Сделай перед вызовом Find(в самом Find'е) такое:
WriteLn(cDir + SearchRec.Name);
Вызывай проект так:
project1 c:\ *.exe >1.txt
(^^^ это пример, главное - жирное)
Потом скажи что будет в конце файла 1.txt...



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


Лентяй
***


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

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



Цитата
При этом все отлично работает  ......... я случайно сам не ошибся?
Лично я в это еще не въехал


Не ошибся. Attr - это набор битовых флагов. Если файл отвечает определенному атрибуту (скрытый, директория, системный и т.п.) устанавливается соответсвующий бит в Attr.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Monty
  Дата 29.9.2003, 05:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Advanced Lamer
****


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

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



Цитата(Fantasist @ 29.9.2003, 03:43)
Цитата
При этом все отлично работает  ......... я случайно сам не ошибся?
Лично я в это еще не въехал


Не ошибся. Attr - это набор битовых флагов. Если файл отвечает определенному атрибуту (скрытый, директория, системный и т.п.) устанавливается соответсвующий бит в Attr.

Вот это очень интересно smile.gif
Я сделал чтобы программа выводила значение [/B]SearchRec.Attr and faDirectory[B] в файл и получается что если директория то значение 16, если не директория то 0 smile.gif ....... но не понятно почему, наверно просто я не до конца понял что такое AND:
Код
1 and 1 = 1
1 and 0 = 0
0 and 1 = 0
0 and 0 = 0

Правильно? Вроде да, но писал по памяти smile.gif .... и то это я знаю это с элетроники wink.gif ..... но как происходит тоже самое но со значениями INTEGER ?? hmmm.gif


--------------------
...
О, вещая моя печаль,
О, тихая моя свобода
И неживого небосвода
Всегда смеющийся хрусталь!
PM MAIL ICQ   Вверх
dm9
Дата 29.9.2003, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



>но как происходит тоже самое но со значениями INTEGER ?

Побитово... 1-й с 1-ым, 2-й со 2-ым...

PS Или это шутка? :\ Такие вещи надо понимать...

Это сообщение отредактировал(а) dm9 - 29.9.2003, 10:49
PM MAIL ICQ   Вверх
Monty
Дата 29.9.2003, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Advanced Lamer
****


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

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



Цитата(dm9 @ 29.9.2003, 09:49)
>но как происходит тоже самое но со значениями INTEGER ?

Побитово... 1-й с 1-ым, 2-й со 2-ым...

PS Или это шутка? :\ Такие вещи надо понимать...

Нет не шутка smile.gif ..... не сталкивался с этим, но:
Код
22 and 11 = 2
22 and 22 = 22
22 and 33 = 0
11 and 55 = 3

и так можно продолжать долго, только это мне не понято smile.gif ..... не вижу логики, если можно, то сложите мне это побитам =)


--------------------
...
О, вещая моя печаль,
О, тихая моя свобода
И неживого небосвода
Всегда смеющийся хрусталь!
PM MAIL ICQ   Вверх
p0s0l
Дата 29.9.2003, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



22 = 10110
11 = 01011
======== AND
02 = 00010

22 = 010110
33 = 100001
========= AND
00 = 000000



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


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


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

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



А, забыл сказать, как получаются единицы и нули:
22 = 16+4+2 = 2^4 + 2^2 + 2^1 = 10110 (нули стоят на местах 2^3 и 2^0)
11 = 8+2+1 ...

Ну блин это должны в школе рассказывать...



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


Advanced Lamer
****


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

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



Но тогда как обьяснить это?
Цитата
if (SearchRec.Attr and faDirectory) <> 0 then begin
if (SearchRec.Name <> '' ) and (SearchRec.Name <> '.') and (SearchRec.Name <> '..')
  then MyRemoveDir(sFileName);
  else begin


Это сообщение отредактировал(а) Monty - 29.9.2003, 19:05


--------------------
...
О, вещая моя печаль,
О, тихая моя свобода
И неживого небосвода
Всегда смеющийся хрусталь!
PM MAIL ICQ   Вверх
p0s0l
Дата 29.9.2003, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата
Но тогда как обьяснить это?

Monty, ну прям не знаю...
faDirectory = $10 = 16 = 00010000;
Проверкой (Attr and faDirectory) <> 0 проверяется, включен ли нужный бит в аттрибутах. Я просто так привык писать - так быстрее пишется и код получается на микроны быстрее (т.к. для сравнение с нулем быстрее, чем сравнение с к-л числом), чем такая проверка:
if (Attr and faDirectory) = faDirectory...

Хотя если faDirectory было бы комбинацией нескольких бит, то пришлось бы делать второй вариант...

Пример:
1) Attr = 00110110 (число от понта, но 4-ый бит включен, значит это каталог)
(Attr and faDirectory) = (00110110 and 00010000) = 00010000 = 16
if (16 <> 0) then ... - видно, что if сработает...

2) Attr = 00100110 (тоже самое число, но 4-ый бит выключен, это не каталог)
(Attr and faDirectory) = (00100110 and 00010000) = 00000000 = 0
if (0 <> 0) then ... - видно, что if не сработает...

Это сообщение отредактировал(а) p0s0l - 29.9.2003, 21:32


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


Advanced Lamer
****


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

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



p0s0l спасибо, теперь все ясно .... что какжый бит отвечает за то или иное значение атрибута smile.gif ... т.е. четвертый бит это директория ...... все ясно =)
Именно этого я не знал smile.gif ...... думал что не по битам, а по числам ........

Это сообщение отредактировал(а) Monty - 29.9.2003, 22:42


--------------------
...
О, вещая моя печаль,
О, тихая моя свобода
И неживого небосвода
Всегда смеющийся хрусталь!
PM MAIL ICQ   Вверх
iZZi
Дата 30.9.2003, 06:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот вам кусок Windows.pas :
Код

{line 2250}
 FILE_SHARE_READ                     = $00000001;
 {$EXTERNALSYM FILE_SHARE_READ}
 FILE_SHARE_WRITE                    = $00000002;
 {$EXTERNALSYM FILE_SHARE_WRITE}
 FILE_SHARE_DELETE                   = $00000004;
 {$EXTERNALSYM FILE_SHARE_DELETE}
 FILE_ATTRIBUTE_READONLY             = $00000001;
 {$EXTERNALSYM FILE_ATTRIBUTE_READONLY}
 FILE_ATTRIBUTE_HIDDEN               = $00000002;
 {$EXTERNALSYM FILE_ATTRIBUTE_HIDDEN}
 FILE_ATTRIBUTE_SYSTEM               = $00000004;
 {$EXTERNALSYM FILE_ATTRIBUTE_SYSTEM}
 FILE_ATTRIBUTE_DIRECTORY            = $00000010;
 {$EXTERNALSYM FILE_ATTRIBUTE_DIRECTORY}
 FILE_ATTRIBUTE_ARCHIVE              = $00000020;
 {$EXTERNALSYM FILE_ATTRIBUTE_ARCHIVE}
 FILE_ATTRIBUTE_NORMAL               = $00000080;
 {$EXTERNALSYM FILE_ATTRIBUTE_NORMAL}
 FILE_ATTRIBUTE_TEMPORARY            = $00000100;
 {$EXTERNALSYM FILE_ATTRIBUTE_TEMPORARY}
 FILE_ATTRIBUTE_COMPRESSED           = $00000800;
 {$EXTERNALSYM FILE_ATTRIBUTE_COMPRESSED}
 FILE_ATTRIBUTE_OFFLINE              = $00001000;
 {$EXTERNALSYM FILE_ATTRIBUTE_OFFLINE}


Вот вам все эти аттрибуты и за что каждый отвечает. У меня дома где - то есть прога - поисковик, недоделанная, но там все работает. Там у меня были проблемы с системными папками, но потом и их пофиксил. Просто проверяйте на включенность соответствующих флагов и все.
PM MAIL   Вверх
Borland_Delphi_6
Дата 1.10.2003, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


LoneLINEss
****


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

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



p0s0l
Сделал как ты говорил. В конце файла:
Цитата
d:\Macro Magic\Tutorial\My Macros
Exception EInOutError in module timesaver.exe at 0004E6D4.
Invalid filename.



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

Мои фотографии
PM MAIL WWW   Вверх
Dmitry V.Abramov
Дата 1.10.2003, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 30.9.2003
Где: Saint-Petersburg

Репутация: 5
Всего: 4



Цитата(Borland_Delphi_6 @ 1.10.2003, 09:28)
Сделал как ты говорил. В конце файла:
Цитата
d:\Macro Magic\Tutorial\My Macros
Exception EInOutError in module timesaver.exe at 0004E6D4.
Invalid filename.

Немая сцена....

Мы все, из-за угла глазевшие за здесь происходящим (прям как в порту на погрузке, или на стройке), с нетерпением ждали завершения, а получили еще одно продолжение...

Ребята, вы уж опубликуйте целиком текст который тестируете! А то вот такие вещи "Exception EInOutError in module timesaver.exe at 0004E6D4" заставляют думать, что что-то там есть еще - слишком большой адрес для консольного приложения опубликованного в самом начале.

И потом, если есть Exception EInOutError, то почему утверждают что оно не перехватывается?
--------------------
/DVA
PM MAIL WWW   Вверх
Страницы: (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.2142 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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