|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Ошибка Handle (При запуске (рандомно) + после удаления Директории с файлами)
Добрый вечер ув. программеры!
Нужна ваша помощь, пишу курсовой, тема, грубо говоря "Эмулятор проводника". О программе: 3 формы: Авторизация, Регистрация, Проводник. Логины хранятся в файле и туда же записываются. Моя проблема: Случайным образом, иногда при запуске, иногда при выборе рабочей директории вылетает ошибка типа: EExternalException C0000008 (При запуске), либо после удаления директории с файлами, тогда ошибка типа С0000235. Менял функцию удаления директории с файлами, не запускал её вобще, ошибка остается. Код не полный, в начале описана функция и процедура которыми я пытался удалить папку с файлами. Далее блок обработки. Основное окно программы, сам проводник: Код:
unit Unit2; function TForm2.DelDir(dir: string): Boolean; var fos: TSHFileOpStruct; begin ZeroMemory(@fos, SizeOf(fos)); with fos do begin wFunc := FO_DELETE; fFlags := FOF_SILENT or FOF_NOCONFIRMATION; pFrom := PChar(dir + #0); end; Result := (0 = ShFileOperation(fos)); end; //процедура удаления каталога со всем содержимым procedure RemoveAll(path: string); var sr: TSearchRec; //Переменная для "перелистывания" файлов //Сокращение от SearchResult begin if FindFirst(path + '\*.*', faAnyFile, sr) = 0 then // begin repeat //Процедура удаления всех файлов в указанной директории // if sr.Attr and faDirectory = 0 then begin DeleteFile(path + '\' + sr.name); end else begin if pos('.', sr.name) <= 0 then RemoveAll(path + '\' + sr.name); //Рекурсивный вызов процедуры удаления end; until FindNext(sr) <> 0; //Пока есть файлы - удалять end; FindClose(sr); //Освобождаем память поиска RemoveDirectory(PChar(path)); //Удаляем уже пустую директорию end; //Конец процедуры //------------------------------------------------------------------------------------------------------------ else //Начинается проверка на удаление директории if Form1.ExtractValue(per,' ', 1)='dld' then //Если 1я часть dld //Т.е. удаление //-------Начало тела обработки возможности удаления директории begin if Form1.ExtractValue(per,' ', 2)<>'' then //2я часть не пустая ? begin //нет. //4--------Обработка пути---------------------------------------------------------------------- dir:=Form1.ExtractValue(per,' ', 2); //Занесли в переменную 2ю часть, т.е. возможный путь папки //Далее проверка синтасиса, если первые 3 символа #00 то if dir[1]='#' then if dir[2]='0' then if dir[3]='0' then //то проверяем последний символ if dir[length(dir)]='#' then //Равен # ? //1----------------------------- begin //Да, тогда проверяем ещё 2 символа перед # if dir[length(dir)-1]='0' then if dir[length(dir)-2]='0' then //Если они равны 00 т.е. в итоге 00# то for i:=4 to length(dir)-3 do begin //Начиная с 4ого символа(пропускаем #00) //Записываем путь в переменную посимвольно //До конца строки без 00# temp1:=temp1+dir[i]; slabel1.Caption:=temp1; ch1:=1; end; end //1---------------------------- else //Нет! последний символ не # значит в пути были пробелы begin for i:=4 to length(dir) do //Записать в переменную всю часть пути до пробела temp1:=temp1+dir[i]; ch:=1; //Присвоить идентификатору наличия пробелов значение "есть пробелы" end; if ch=1 then //Если были пробелы while ch1=0 do //Пока идентификатор выхода равен нулю begin //Тело дозаписи частей пути разделенных пробелами------------------------ if Form1.ExtractValue(per,' ', b)<>'' then //Если 3-я часть СТРОКИ УПРАВЛЕНИЯ не пустая, то //sLabel8.Caption:=Form1.ExtractValue(per,' ', b); begin //2---------------------------------------------------- //Записываем в переменную часть директории, //т.е. 3ю часть СТРОКИ УПРАВЛЕНИЯ dir1:=Form1.ExtractValue(per,' ', b); //Если последний символ этой части равен # то if dir1[length(dir1)]='#' then //Проверяем предпоследний, и предпредпоследний символы //Они должны равняться 00 if dir1[length(dir1)-1]='0' then if dir1[length(dir1)-2]='0' then //В итоге окончание равно 00# begin //3------------------------------------------------- //Если конструкция окончания 00# то temp1:=temp1+' ';//Дописываем в переменную пути пробел for i:=1 to length(dir1)-3 do temp1:=temp1+dir1[i]; //И в цикле добавляем всю строку относящуюся к пути, т.е. без 00# slabel1.Caption:=temp1;//Выводим последний исп. путь ch1:=1; //присваиваем идентификатору выхода, значение 1, истина break; //Прерываем выполнение цикла Вайл //3------------------------------------------------- end; //Если не вышли из цикла, значит управляющей конструкции // 00# небыло, тогда дописываем пробел к переменной пути temp1:=temp1+' '; for i:=1 to length(dir1) do temp1:=temp1+dir1[i]; //И в цикле записываем всё содержимое считанной ранее части b:=b+1; //Прибавляем к номеру считываемой части 1 //2---------------------------------------------------- end; //Конец тела дозаписи частей разделенных пробелами----------------------- end; //удаление директории {//}if ch1=1 then {//} begin {//} try //Попробывать {//} begin RemoveAll(temp1); {//} //RemoveAll(temp1); //Вызываем функцию удаления, удаляем {//} sCheckBox1.Checked:=true; //Ставим галочку в чекбокс {//} showmessage('Директория '+temp1+' удалена!'); {//} end; {//} except //При ошибке удаления {//} begin {//} if SelectDirectory('Удаление каталога', '', temp1) then {//} //Ручной выбор каталога для удаления, с помощью диалога {//} begin {//} RemoveAll(temp1); //Удаляем выбранный каталог {//} sCheckBox1.Checked:=true; //Галочку о выполнении команды {//} end {//} else showmessage('Ошибка удаления!'); {//} end; {//} end; {//} end; //конец удаления директории //4-----Конец обработки пути----------------------------------------------------------- end; Сразу все не учтешь (я про пост). Так что если затупил, и чего-то не добавил напишите, и как только, так сразу я отвечу. Загрузил весь проект в архив, стоит каспер 2013 :) |