Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с директориями и файлами
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
setare
Здравствуйте! У меня очень легкая программа, но я не могу понять где в моем коде ошибка. Нужно найти все директивы и файлы и записать их в разных созданных файлах. Оно мне ничего не пишет. Что делать?
Исходный код

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
Э... нет, что-то тут нетак...
начнем с того,что
Код
rewrite(f);
  rewrite(f1);

Сотрет файлы найденные и создаст заново...

+ процедура find какая-то страшная...smile.gif пробежал ее взгядоми что-тодумаю - а что вы этимхотели сказать?
можете дать задание?
ктати, что за директивы? может директории?

Цитата
Нужно найти все директивы и файлы и записать их в разных созданных файлах.

дамаю задание такое:
Цитата
Найти все директории и их именазаписать в 1 файл.
Найти все файлы и имена записать в 2 файл.
setare
Да, да вы правы. Посто у меня после 5 пары голова уже не варит и все путаю. Извините. Ну так мы разве не используем rewrite когла хотим что-нибудь записать в файл?

А еще через черточку записать размеры файлов в кб.
volvo
setare
И еще один вопрос: Нужно найти все файлы и директории только в одной папке? Или во всех ее поддиректориях? Тогда без рекурсии не обойтись...
setare
Вот точное задание: Нужно создать два файла. В один записать все поддиректории из указанной директории и в другой все файлы из этой же указзаной директории и указать их размер. Путь надо вводить с клавиатуры.
volvo
Код
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
Цитата
мы разве не используем rewrite когла хотим что-нибудь записать в файл?

:nono:
reset , rewrite и append используется для открытия файла для чтения или записи .

reset - открывает для чтения и записи существующий файл
append - открывает только для записи существующий файл
rewrite - создаёт новый файл и открывает его для чтения и записи

а уже после открытия файла можно читать или записывать в него используя
write/writeln(f,text) , read/readln(f) и (blockwrite , blockread для блочных файлов)

FAQ по файлам переписывать сюда зачем?
setare
а можно там где мы распечатываем файлы написать через черту так:
writeln(f_files, Dir+s_rec.name,'-',size/1024:6:2); при size:=longint?

А извините, но нельзя ли эту программу написать используя аттрибуты? Пготому что как то сложное решение получилось. С аттрибутами разве не проще? Просто я не очень понимаю то, что вы написали.
volvo
Я исправил... Причем размер стоит брать только для файлов, из той же структуры s_rec

Цитата
А извините, но нельзя ли эту программу написать используя аттрибуты?

А, извините, что Вам легче сказать с первого взгляда, что такое $10 или Directory? $3F или AnyFile? Не нужно переходить на конкретные значения, не привыкайте к этому... Это может сослужить очень плохую службу... Везде, где только можно, пользуйтесь предопределенными константами

Смотрите комментарии.
setare
Спасибо большое за обьяснение и извините за беспокойство! Я все поняла.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.