|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Помогите Срочно! Ошибка доступа к памяти
Ребята помогите в таком вопросе, это фрагмент кода моего приложения, он отвечает за поиск в вбраном каталоге (TreeView1) файлов и подсчета контрольных сумм. Внимание вопрос, после работы с этой кнопкой (procedure TRGZ.Button1Click(Sender: TObject) последующее событие выдает ошибку Acces violation, ошибка доступа к участку памяти и указывается адресс. Полагаю я не правильно обеспечил работу с файлами, буду благодарен любой подсказке.
Код:
procedure TRGZ.Button1Click(Sender: TObject); var sR: TSearchRec; sPath: string; s:string; f:longint; h,cs:DWORD; begin Memo1.lines.add('___________________________________________'); //Определение пути каталога sPath:= ''; if TreeView1.Selected=nil then Memo1.Lines.Add('Ошика! Вы не выбрали каталог!') else begin //begin while TreeView1.Selected <> nil do begin sPath:= TreeView1.Selected.Text +'\'+sPath; TreeView1.Selected:= TreeView1.Selected.Parent; end; Delete(sPath, length(sPath), 1); //Подсчет контрольных сумм if FindFirst(sPath+'\*.*', faAnyFile - faDirectory - faVolumeID, sR) = 0 then begin Memo1.Lines.Add('Найдены файлы со следующими суммами:'); i:=0; repeat f:=fileopen(sR.Name,fmOpenRead); sA[i]:=sPath+'\'+sR.Name; SetLength(s,sR.Size); FileRead(f,s[1],length(s)); fileclose(f); CheckSumMappedFile(@s[1],length(s),@h,@cs); iB[i]:=cs; //Главная функция- изучи ее Memo1.Lines.Add(sA[i]+': '+IntToStr(cs)+';'); inc(i); until FindNext(sR) <> 0; FindClose(sR); end else Memo1.Lines.Add('Файлов не найдено!'); end; //end Memo1.lines.add('___________________________________________'); end; |
#2
|
||||
|
||||
Цитата:
Что такое (как объявлено) sA ? Цитата:
|
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
juraman1 (06.12.2012)
|
#3
|
|||
|
|||
sA- глобальный массив
Код:
procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var RGZ: TRGZ; sA: array [1..1000] of string; iB: array [1..1000] of DWORD; i: integer; implementation функцию изучил) |
#4
|
||||
|
||||
Цитата:
Код:
Memo1.Lines.Add('Найдены файлы со следующими суммами:'); i:=0; repeat f:=fileopen(sR.Name,fmOpenRead); sA[i]:=sPath+'\'+sR.Name; И почему переменная i глобальная? И вообще где проверка, чтобы переменная i не "перевалила" за тыщу? Или ты "даёшь голову на отсечение", что ни в одном каталоге не может быть более 1000 файлов? Цитата:
|
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
juraman1 (06.12.2012)
|
#5
|
|||
|
|||
во первых: спасибо большое! вы оказались правы!!)))
во вторых:переменная i глобальная чтобы знать сколько файлов было записано в массив, а вот массив от 1..1000 как раз потому, что вначале думал в 0-ой элемент длину записывать вместо глобальной i, а что то не получилось и вот исправить забыл з.Ы. премного благодарен!! |
#6
|
|||
|
|||
а вот на счет проверки этой глобальной i я сознательно не парюсь, это ргз, которое мне нужно завтра (т.е. уже сегодня) будет сдать. так что мне нужно было быстро и эффективно сделать, уверен тут еще найдутся прорехи, но увы и ах как писал великий классик А.П.Чехов
а вам я очень благодарен, вы прям из безисходности спасли меня |
#7
|
||||
|
||||
Цитата:
Код:
//Подсчет контрольных сумм if FindFirst(sPath+'\*.*', faAnyFile - faDirectory - faVolumeID, sR) = 0 then ..... f:=fileopen(sR.Name,fmOpenRead); sA[i]:=sPath+'\'+sR.Name; Скорее всего открывать найденный файл нужно тоже из того же каталога: Код:
f:=fileopen(sPath+'\'+sR.Name,fmOpenRead); Цитата:
|
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
juraman1 (06.12.2012)
|
#8
|
|||
|
|||
Код:
//Определение пути каталога sPath:= ''; if TreeView1.Selected=nil then Memo1.Lines.Add('Ошика! Вы не выбрали каталог!') else begin while TreeView1.Selected <> nil do begin sPath:= TreeView1.Selected.Text +'\'+sPath; TreeView1.Selected:= TreeView1.Selected.Parent; end; Delete(sPath, length(sPath), 1); вот в этом фрагменте уже сканится выбрана директория или нет, т.е если она selected, то мы "верстаем" в цикле путь к ней, а выбраная директория уже является директорией по умолчанию, вот как я думаю |
#9
|
||||
|
||||
Цитата:
|