Добрый вечер ув. программеры!
Нужна ваша помощь, пишу курсовой, тема, грубо говоря "Эмулятор проводника".
О программе:
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 :)