Версия для печати темы
Форум «Всё о Паскале» _ Задачи _ Работа с директориями и файлами
Автор: setare 1.04.2005 22:30
Здравствуйте! У меня очень легкая программа, но я не могу понять где в моем коде ошибка. Нужно найти все директивы и файлы и записать их в разных созданных файлах. Оно мне ничего не пишет. Что делать?
Исходный код
program files;
uses dos;
type
str79=string[79];
procedure find(var f,f1:text;mask:str79;attr:byte;S:searchRec);
begin
Findfirst('*.*',AnyFile,S);
while DosError=0 do
begin
if S.attr=$10 then
begin
writeln(f,S.name);
FindNext(s);
end
else
if S.attr=$3F then
writeln(f1,S.name,'-',s.size/1024:6:2)
end;
end;
var
flname:string[20];
f,f1:text;
pathstr:string[20];
begin
writeln('Vvedite put:');
readln(pathstr);
writeln('Vvedite imya 1 fila.');
readln(flname);
writeln('Vvedite imya 2 fila.');
readln(flname);
assign(f,flname);
assign(f1,flname);
rewrite(f);
rewrite(f1);
end.
Автор: Altair 1.04.2005 22:35
Э... нет, что-то тут нетак...
начнем с того,что
Код
rewrite(f);
rewrite(f1);
Сотрет файлы найденные и создаст заново...
+ процедура find какая-то страшная...
пробежал ее взгядоми что-тодумаю - а что вы этимхотели сказать?
можете дать задание?
ктати, что за директивы? может директории?
Цитата
Нужно найти все директивы и файлы и записать их в разных созданных файлах.
дамаю задание такое:
Цитата
Найти все директории и их именазаписать в 1 файл.
Найти все файлы и имена записать в 2 файл.
Автор: setare 1.04.2005 22:43
Да, да вы правы. Посто у меня после 5 пары голова уже не варит и все путаю. Извините. Ну так мы разве не используем rewrite когла хотим что-нибудь записать в файл?
А еще через черточку записать размеры файлов в кб.
Автор: volvo 1.04.2005 22:45
setare
И еще один вопрос: Нужно найти все файлы и директории только в одной папке? Или во всех ее поддиректориях? Тогда без рекурсии не обойтись...
Автор: setare 1.04.2005 22:48
Вот точное задание: Нужно создать два файла. В один записать все поддиректории из указанной директории и в другой все файлы из этой же указзаной директории и указать их размер. Путь надо вводить с клавиатуры.
Автор: volvo 1.04.2005 23:00
Код
uses dos;
var
f_files, f_dirs: text;
Procedure ScanDir(Dir:string);
var s_Rec:SearchRec;
begin
FindFirst(Dir+'*.*', AnyFile, s_rec);
while doserror = 0 do begin
{ если найдена директория "." или ".." - ничего не делать }
if (s_Rec.name='.') or (s_rec.name='..') then
else
{ если найдена другая директория }
if (s_Rec.Attr and Directory) = directory then
writeln(f_dirs, Dir+s_Rec.name)
else
{ Значит, нашли файл }
writeln(f_files, Dir+s_rec.name,' - ',s_rec.size/1024:6:2);
FindNext(s_Rec);
end
end;
Var S: string;
begin
assign(f_files, 'first.txt'); rewrite(f_files);
assign(f_dirs, 'second.txt'); rewrite(f_dirs);
{ здесь - ввод пути в переменную S }
ScanDir(S);
close(f_dirs);
close(f_files);
end.
Автор: SHnur 1.04.2005 23:01
Цитата
мы разве не используем rewrite когла хотим что-нибудь записать в файл?
:nono:
reset , rewrite и append используется для открытия файла для чтения или записи .
reset - открывает для чтения и записи существующий файл
append - открывает только для записи существующий файл
rewrite - создаёт новый файл и открывает его для чтения и записи
а уже после открытия файла можно читать или записывать в него используя
write/writeln(f,text) , read/readln(f) и (blockwrite , blockread для блочных файлов)
FAQ по файлам переписывать сюда зачем?
Автор: setare 1.04.2005 23:15
а можно там где мы распечатываем файлы написать через черту так:
writeln(f_files, Dir+s_rec.name,'-',size/1024:6:2); при size:=longint?
А извините, но нельзя ли эту программу написать используя аттрибуты? Пготому что как то сложное решение получилось. С аттрибутами разве не проще? Просто я не очень понимаю то, что вы написали.
Автор: volvo 1.04.2005 23:19
Я исправил... Причем размер стоит брать только для файлов, из той же структуры s_rec
Цитата
А извините, но нельзя ли эту программу написать используя аттрибуты?
А, извините, что Вам легче сказать с первого взгляда, что такое $10 или Directory? $3F или AnyFile? Не нужно переходить на конкретные значения, не привыкайте к этому... Это может сослужить
очень плохую службу... Везде, где только можно, пользуйтесь предопределенными константами
Смотрите комментарии.
Автор: setare 1.04.2005 23:34
Спасибо большое за обьяснение и извините за беспокойство! Я все поняла.