![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
||||
|
||||
|
Цитата:
|