Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
6 / 0 / 0
Регистрация: 24.11.2012
Сообщений: 125

Исправить ошибку, возникающую при поиске файлов

25.11.2012, 02:07. Показов 1365. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,уважаемые форумчане! Написала программу,которая выполняет поиск файлов и столкнулась с такой проблемой,если количество файлов не слишком большое,то программа работает отлично,а если количество файлов большое,например 200,то выдаёт ошибку доступа вроде - "Project1.exe raised exception class EInOutError with message 'File acces denied'". скажите,пожалуйста, в чем проблема.Заранее спасибо.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
unit FindFile_;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,ExtCtrls,Buttons,
  FileCtrl, ComCtrls, Gauges, DB, DBTables,BDE, DBCtrls, Grids, DBGrids,
  DBClient, ADODB ;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;       // что искать
    Edit2: TEdit;       // результат поиска
    Button1: TButton;   // кнопка Найти
    Button2: TButton;   // кнопка Обзор
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Button3: TButton;
    Edit5: TEdit;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
implementation
 
{$R *.dfm}
type
 TStringGridX = class(TStringGrid);
 
var
   FileName: string;  // имя или маска искомого файла
   cDir: string;
   n: integer;       // кол-во файлов, удовлетворяющих запросу
// поиск файла в текущем каталоге
procedure Find;
var
   SearchRec: TSearchRec; // информация о файле или каталоге
 
begin
   GetDir(0,cDir); // получить имя текущего каталога
   if cDir[length(cDir)] <> '\' then cDir := cDir+'\';
 
   if FindFirst(FileName, faAnyFile,SearchRec) = 0 then
       repeat
          if (SearchRec.Attr and faAnyFile) = SearchRec.Attr then
             begin
               Form1.ListBox1.Items.Add(cDir+SearchRec.Name);
               n := n + 1;
               end;
        until FindNext(SearchRec) <> 0;
 
       if FindFirst('*', faAnyFile, SearchRec) = 0 then
          repeat
              if (SearchRec.Attr and faDirectory) = faDirectory then
                    // каталоги .. и . тоже каталоги,
                    // но в них входить не надо !!!
                    if SearchRec.Name[1] <> '.' then
                       begin
                         ChDir(SearchRec.Name);// войти в каталог
                         Find; // выполнить поиск в подкаталоге
                         ChDir('..');// выйти из каталога
                       end;
          until FindNext(SearchRec) <> 0;
end;
// щелчок на кнопке Найти
procedure TForm1.Button1Click(Sender: TObject);
begin
        if not DirectoryExists(Edit2.Text) then
        begin
            ShowMessage('Каталог указан неверно.');
            Edit2.SetFocus;
            exit;
        end;
 
        Button1.Enabled := False;
        Label4.Caption := '';
        Label4.Repaint;
        ListBox1.Clear;             // очистить поле Memo1
        Label4.Caption := '';
        FileName := Edit1.Text;  // что искать
        cDir := Edit2.Text;      // где искать
        n:=0;                    // кол-во найденных файлов
        ChDir(cDir);             // войти в каталог начала поиска
        Find;                    // начать поиск
        if n = 0 then
           ShowMessage('Файлов, удовлетворяющих критерию поиска нет.')
        else Label4.Caption := 'Найдено файлов:' + IntToStr(n);
        Button1.Enabled := True;
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;
// щелчок на кнопке Обзор
procedure TForm1.Button2Click(Sender: TObject);
var
  Path: string;
begin
  Path := GetPath('Выберите папку');
  if Path <> ''
     then Edit2.Text := Path;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Form1.Close;
end;
 
 
procedure TForm1.ListBox1Click(Sender: TObject);
var  Start_From : Longint;
begin
Edit5.Text:=ListBox1.Items[ListBox1.ItemIndex];
end;
end.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.11.2012, 02:07
Ответы с готовыми решениями:

Феномен, при поиске файлов
Феномен при поиске файло Начинаю искать файлы на диске где установлена операционная система. Входе работы алгоритма все файлы ищуться...

Не могу исправить ошибку при создании Хранителя экрана
делаю хранитель экрана, но не могу разобраться в ошибках. Что не так и почему не работает? Помогите разобраться. // Cfg.dfm object...

Исправить ошибку линковщика, возникающую при применении шаблонов
Добрый вечер. С применением шаблонов не могу собрать код.Высвечивается ошибка линковщика. Может кто-нибудь подсказать,в чем дело? ...

13
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33184 / 21482 / 8231
Регистрация: 22.10.2011
Сообщений: 36,851
Записей в блоге: 12
25.11.2012, 03:39
Цитата Сообщение от Nastya12 Посмотреть сообщение
скажите,пожалуйста, в чем проблема.
Пожалуйста. Для начала приведи программу в правильный вид, потом требуй от нее правильной работы.

FindFirst начинает поиск, FindNext его продолжает. Где процедура FindClose, которая текущий поиск должна закрывать? Ведь ясно документация говорит:
Note: FindFirst allocates resources (memory) that must be released by calling FindClose.
0
6 / 0 / 0
Регистрация: 24.11.2012
Сообщений: 125
25.11.2012, 03:41  [ТС]
Если бы я знала,что конкретно не так,я бы сюда не писала,в чем конкретно непорядок в программе??Только в FindClose?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33184 / 21482 / 8231
Регистрация: 22.10.2011
Сообщений: 36,851
Записей в блоге: 12
25.11.2012, 03:43
Для начала - да. Потому что у тебя выделяются ресурсы, которые не освобождаются. Исправь и проверь. С большой степенью вероятности ошибка уйдет. Не уйдет - будем искать дальше. Потому что структуру твоих папок на диске (в которых осуществляется поиск) знаешь только ты.
0
6 / 0 / 0
Регистрация: 24.11.2012
Сообщений: 125
25.11.2012, 23:33  [ТС]
Ошибка не устранилась...

Добавлено через 19 часов 45 минут
Эй,люди....Помогите,пожалуйста, найти ошибку...
0
106 / 82 / 15
Регистрация: 07.06.2011
Сообщений: 588
Записей в блоге: 2
26.11.2012, 00:25
Добавь
Delphi
1
Findclose(SearchRec);
в двух местах после унтилей - в 64 и 76 строках.
0
6 / 0 / 0
Регистрация: 24.11.2012
Сообщений: 125
26.11.2012, 02:17  [ТС]
Не помогло
0
angstrom
26.11.2012, 03:17
Скинь архив.
6 / 0 / 0
Регистрация: 24.11.2012
Сообщений: 125
26.11.2012, 04:32  [ТС]
Вот,держите...
Вложения
Тип файла: rar Новая папка (2).rar (182.0 Кб, 3 просмотров)
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
26.11.2012, 09:31
Программа может искать файлы совсем не там, где это предполагает пользователь.
Delphi
1
2
3
4
5
6
procedure Find;
var
 SearchRec: TSearchRec; // информация о файле или каталоге
begin
   GetDir(0,cDir); // получить имя текущего каталога
   if cDir[length(cDir)] <> '\' then cDir := cDir+'\';
Если файлов много и, соответственно, программа работает достаточно продолжительное время, то пользователь может переключиться в другую программу. Например, может попытаться в MS Word открыть документ. А диалог открытия файла в MS Word, Excel и во многих других программах изменяет текущую папку. В этом случае GetDir() вернёт путь к той папке, в которой пользователь выбрал документ (в MS Word). И программа продолжит поиск именно в этой папке.
Чтобы программа работала надёжно, алгоритм должен вообще не зависеть от текущей папки.
0
106 / 82 / 15
Регистрация: 07.06.2011
Сообщений: 588
Записей в блоге: 2
26.11.2012, 10:27
Да, это была припарка. Алгоритм неполноценный. Тебе вообще какие файлы нужно найти? Все?
0
angstrom
26.11.2012, 12:04
Дополнение: даже в таком виде никакого EInOutError не возникает. Для каталога Windows было найдено более 27000 файлов.
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
26.11.2012, 13:26
Цитата Сообщение от angstrom Посмотреть сообщение
Дополнение: даже в таком виде никакого EInOutError не возникает.
Согласен - такого исключения, EInOutError, в этом коде не может быть. Оно может возникнуть при попытке открыть файл. А функции FindFirst(), FindNext() работают с таблицей размещения файлов, а не с самими файлами. Видимо опубликованный код отличается от исходного.
---
Я тоже прогу попробовал запустить - отработало всё без ошибок на большом количестве файлов.
1
6 / 0 / 0
Регистрация: 24.11.2012
Сообщений: 125
26.11.2012, 21:18  [ТС]
Тему можно закрыть,я переделала другим способом,все получилось,всем спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.11.2012, 21:18
Помогаю со студенческими работами здесь

Исправить ошибку, возникающую при вставке скопированных данных из одного файла в другой
Добрый вечер всем читающим. Столкмнулся для себя с не решаемой ошибкой, для которой хотелось бы найти Ответ. программа заключатся в...

Visual Studio. С++. ООП. Как исправить ошибку, возникающую при попытке запустить код?
1) “Возникли ошибки сборки. Продолжить и запустить последний успешно построенный вариант? ” 2) Ещё возникают ошибки LNK2005. 3)...

Найти и устранить ошибку в коде программы, возникающую при сортировке самодельного списка
Доброго времени суток! Сделал сортировку, при отладке видно, что он сортирует, но в конце выбивает ошибку, помогите, пожалуйста. ...

Обработать ошибку, возникающую при вызове функции GetObject в случае, когда нет доступных экземпляров объекта
на строке Set wa = GetObject(, &quot;Word.Application&quot;) выдает ошибку Run-time error 429; ActiveX component can't create object Option...

Как отловить ошибку возникающую до загрузки программы?
Вот голова - WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR strParams, int) { try { Application-&gt;Initialize(); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru