Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблемы с удалением директории
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
LP
Привет всем! Помогите кому не трудно!
В общем в этой программе:
Код

program delete;
uses dos;
var f:string;
   attr:word;
procedure delete_file(filename:string);
var reg:registers;
begin
filename:=filename+chr(0);
reg.ah:=$41;
reg.dx:=ofs(filename[1]);
reg.ds:=seg(filename[1]);
msdos(reg);
if (reg.flags and 1)=1 then
begin
writeln('Ошибка. Код=',reg.ax);
halt;
end;
end;
procedure set_attr(filename:string;attr:word);
var reg:registers;
begin
filename:=filename+chr(0);
reg.ah:=$43;
reg.dx:=ofs(filename[1]);
reg.ds:=seg(filename[1]);
reg.al:=1;
reg.cx:=attr;
msdos(reg);
if (reg.flags and 1)=1 then
begin
writeln('Ошибка. Код=',reg.ax);
halt;
end;
end;
function get_attr(filename:string):word;
var reg:registers;
begin
filename:=filename+chr(0);
reg.ah:=$43;
reg.dx:=ofs(filename[1]);
reg.ds:=seg(filename[1]);
reg.al:=0;
msdos(reg);
if (reg.flags and 1)=1 then
begin
writeln('Ошибка. Код=',reg.ax);
halt;
end;
get_attr:=reg.cx;
end;
Begin
f:='d:\directory';
attr:=get_attr(f);
if attr=ReadOnly then set_attr(f,attr and 0);
delete_file(f);
end.


Не получается удалить папку, но c файлами все OK.
Запускал под в XP и под чистым ДОСом -разницы нет, папки не хотят удаляться. sad.gif
Правда в ДОСе выдается код ошибки 2(файл не найден), а в XP 5(доступ отвергнут).

Не забываем теги [ CODE] [ /CODE] для исходников
volvo
LP
А что, использовать функцию RmDir для удаления папки нельзя?
Код

Begin
 f:='d:\directory';
 attr:=get_attr(f);
 if attr=ReadOnly then set_attr(f,attr and 0);
 if attr=directory then rmdir(f)
 else delete_file(f);
end.
Altair
Не пытайтесь только удалить папку в которой есть файлы, ничего не выйдет, сначала надо файлы удалить. ;)
LP
volvo,Oleg_Z cпасибо за ответы!

volvo, предмет наз-ся системное программирование, поэтому нельзя sad.gif


Oleg_Z , я с пустой папкой и пытался unsure.gif
Ладно, завтра на свежую голову еще раз посмотрю.
Altair
Так, стоп, системное программирование говоришь?
так надо тогда использовать прерывание
INT21h
функцию 3Ah
эта функция удаляет поддиректорию, так-же как и RMDIR команда...

вот пример кода на чистом асме (под TASM)
Код

ASCstrg db 'C:\TESTDIR\',00H
Mov AH, 3AH
LEA DX,Ascstrg
INT 21H
volvo
LP
А ведь Oleg_Z абсолютно прав - измени функцию Delete_File, чтобы она отдельно учитывала удаление папок:

Код

procedure delete_file(filename:string);
 var reg:registers;
 begin
   filename:=filename+chr(0);
   reg.ah:=$41 - 7*Byte(attr=directory);
   reg.dx:=ofs(filename[1]);
   reg.ds:=seg(filename[1]);
   msdos(reg);
   if (reg.flags and 1)=1 then
   begin
     writeln('Ошибка. Код=',reg.ax); halt;
   end;
 end;
LP
Спасибо! Помогло.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.