Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Файловая система
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.12.2012, 01:02
Waypma Waypma вне форума
Прохожий
 
Регистрация: 15.12.2012
Сообщения: 1
Репутация: 10
По умолчанию Ошибка 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 :)
Вложения
Тип файла: rar wp.rar (649.3 Кбайт, 2 просмотров)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:30.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter