Перейти к содержанию

Как выяснить, есть ли файл на диске или нет [pascal]


Рекомендуемые сообщения

Фукция fsearch не помогает...

FSearch(< имя файла>,<список каталогов >) - поиск файла в списке каталогов. Функция имеет тип PathStr (описана в стандартном модуле Dos).

procedure cr_mas(path,dirlist:pathstr);
begin
qwe:='';
qwe:=fsearch(path,dirlist);
writeln(qwe);
readkey;
if (qwe = 'mass.xdb') and (scr1 = 0) then
begin
reset(f);
for i:= 1 to filesize(f) do
begin
read(f,buf);
mas[i]:=buf;
end;
scr1:=1;
n:=filesize(f);
end;
end;

На экран выводится path (имя искомого файла), заданное в основной программе, хотя по идее должна выводиться пустая строка (файла на диске нет). Соответственно можно спокойно пройти условие if (qwe = 'mass.xdb') and (scr1 = 0) и наткнуться на reset(f)... а файла-то и нету.

Может я процедуру неправильно использую? В справке про нее что-то вообще мало написано, непонятно.

Ссылка на комментарий

Странно... Может ты в переменную dirlist не тот путь пишешь? Функция FSearch работает в BP7 нормально.

Возможность читать файл можно проверять так:

{$I-}

Assign.., Reset..

If IOResult<>0 then ... пишем об ошибке...

{$I+}

Ссылка на комментарий
Может ты в переменную dirlist не тот путь пишешь?
Да нет, правильно. Разве что если только есть разница между "C:\" и "c:\". В assign и fsearch все одинаково написано, перепроверял много раз.

Кроме того, в разных программах эта функция у меня работает по-разному ;) В одной помещает в переменную типа pathstr полный путь, а в этой - только имя файла ;)

Ссылка на комментарий
Если ты бы показал весь свой листинг, то я, может быть, увидел, из-за чего такое происходит )
Посмотри пожалуйста. Программа в процедуре cr_mas натыкается на reset, и соответственно вылетает, если файла в директории нет.


var l,m1,m2,m21,scr1,m4p1,m4p2,m4p3,sortscr:byte;
mas:array[0..10001] of integer;
menu1,menu2,menu3:array[1..5] of string[60];
ch1,ch2,ch3:char;
f:file of integer;
buf,i,j,b,k,n,asd,asd1,op1,op2,op3,op4:integer;
qwe:pathstr;

procedure sozd_file;
begin
clrscr;
textcolor(9);
writeln(menu1[m1]);
textcolor(15);
writeln('Vvedite chislo elementov');
write('n= ');
textcolor(9);
readln(n);
randomize;
rewrite(f);
for i:= 1 to n do mas[i]:=i;
for i:= 1 to n do
begin
asd:=random(n)+1;
asd1:=mas[i];
mas[i]:=mas[asd];
mas[asd]:=asd1;
end;
for i:= 1 to n do
write(f,mas[i]);
writeln;
textcolor(15);
close(f);
writeln('');
textcolor(15);
writeln('File created');
writeln('');
textcolor(7);
writeln('Enter - to main menu');
readln;
scr1:=1;
sortscr:=0;
end;

procedure vv_isk;
begin
writeln('Vvedite iskomii element');
write('k= ');
textcolor(9);
readln(k);
end;

procedure viv_pos;
begin
clrscr;
textcolor(15);
write(menu1[m1]);
textcolor(9);
write(' -> ');
textcolor(15);
writeln(menu3[m21]);
end;

procedure posl_p;
begin
i:=0;
op1:=0;
repeat
inc(i);
op1:=op1+3;
until (k=mas[i]) or (i=n);
if k = mas[i] then
begin
textcolor(9);
writeln('Element naiden')
end
else
begin
textcolor(4);
writeln('Element ne naiden');
end;
textcolor(15);
writeln('');
writeln(op1, ' operacii');
readln;
end;

procedure bistr_posl_p;
begin
i:=1;
op2:=0;
mas[n+1]:=k;
while k<>mas[i] do
begin
inc(i);
op2:=op2+2;
end;
if i<=n then
begin
textcolor(9);
writeln('Element naiden')
end
else
begin
textcolor(4);
writeln('Element ne naiden');
end;
textcolor(15);
writeln(op2,' operacii');
readkey;
end;

procedure sort;
begin
textcolor(15);
write('Sortirovka ');
for i:=2 to n do
begin
gotoxy(12,4);
write(trunc(i / n * 100),'%'); {тут поставил пробелы, код заменялся на смайл}
gotoxy(1,1);
b:=mas[i];
mas[0]:=b;
j:=i-1;
while (mas[j]>B) do
begin
mas[j+1]:=mas[j];
j:=j-1;
end;
mas[j+1]:=b;
end;
gotoxy(1,5);
writeln;
writeln('Massiv otsortirovan!');
sortscr:=1;
end;

procedure posl_p_up_sp;
begin
op3:=0;
i:=0;
mas[n+1]:=29000;
repeat
inc(i);
op3:=op3+2;
until k<=mas[i];
if k = mas[i] then
begin
textcolor(9);
writeln('Element naiden');
end
else
begin
textcolor(4);
writeln('Element ne naiden');
end;
textcolor(15);
writeln(op3,' operacii');
readln;
end;

procedure bin_p;
begin
m4p1:=1;
m4p2:=n;
m4p3:=0;
op4:=0;{schetchik}
while m4p1 < m4p2 do {op1!}
begin
i:=(m4p1+m4p2) div 2; {op2,3!}
op4:=op4+3;
if k < mas[i] then {op4!}
begin
m4p2:=i-1; {op5!}
op4:=op4+2;
end
else
if k = mas[i] then {op6}
begin
m4p1:=m4p2+1; {op7}
m4p3:=1; {op8}
op4:=op4+4;
end
else
if k > mas[i] then
begin
m4p1:=i+1; {op9}
op4:=op4+3;
end;
end;
if m4p3 <> 0 then
begin
textcolor(9);
writeln('Element naiden!');
end
else
begin
textcolor(4);
writeln('Element ne naiden!');
end;
textcolor(15);
writeln(op4,' operacii');
readkey;
end;

procedure cr_mas(path,dirlist:pathstr);
begin
qwe:='';
qwe:=fsearch(path,dirlist);
{writeln(qwe);
readkey;}
if (qwe = 'mass.xdb') and (scr1 = 0) then
begin
reset(f);
for i:= 1 to filesize(f) do
begin
read(f,buf);
mas[i]:=buf;
end;
scr1:=1;
n:=filesize(f);
end;
end;

{mp_start=1}
begin
menu1[1]:='Sozdanie faila';
menu2[1]:='Da';
menu2[1]:='Net';
menu1[2]:='Schitivanie iz faila';
menu3[1]:='Posledovatelnii poisk';
menu3[2]:='Bistrii posledovatelii poisk';
menu3[3]:='Posledovatlnii poisk v uporyadochennom spiske';
menu3[4]:='Binarnii poisk';
menu3[5]:='V glavnoe menu';
menu1[3]:='Vihod';
m1:=1;
m21:=1;
scr1:=0;
assign(f,'c:\justice\mass.xdb');
repeat
repeat
clrscr;
for i:=1 to 3 do
begin
if m1 = i then textcolor(9) else textcolor(15);
writeln(menu1[i]);
end;
ch1:=readkey;
case ch1 of
#72: begin
dec(m1);
if m1<1 then m1:=3;
end;
#80: begin
inc(m1);
if m1>3 then m1:=1;
end;
end;
until ch1 = #13;
textcolor(15);
case m1 of
1: begin
sozd_file;
end;
2: begin
clrscr;
cr_mas('mass.xdb','c:\justice');
if scr1=1 then
begin
repeat
reset(f);
clrscr;
for i:=1 to 5 do
begin
if m21 = i then
textcolor(9)
else textcolor(15);
writeln(menu3[i]);
end;
ch1:=readkey;
case ch1 of
#72: begin
dec(m21);
if m21<1 then m21:=5;
end;
#80: begin
inc(m21);
if m21>5 then m21:=1;
end;
end;
until ch1 = #13;
textcolor(15);
case m21 of
1: begin
viv_pos;
vv_isk;
posl_p; {up}
end;
2: begin
viv_pos;
vv_isk;
bistr_posl_p;
end;
3: begin
viv_pos;
vv_isk;
if sortscr = 0 then
sort
else writeln('Massiv v faile uje otsortirovan!');
posl_p_up_sp;
end;
4: begin
viv_pos;
vv_isk;
if sortscr = 0 then
sort
else writeln('Massiv v faile uje otsortirovan!');
bin_p;
end;
5: begin
end;
end;
end
else
begin
textcolor(4);
writeln('File isnt created');
textcolor(7);
writeln;
writeln('Enter - to main menu');
readln;
end;
end;
end;
until m1 = 3;
end.
uses     crt,dos;

Ссылка на комментарий

Запустил прогу - всё нормально. Имя файла не выводится. (конеш убрал комент-скобки с writeln(qwe) ) Переменная qwe - пустая, до reset не доходит. Прога выводит - "Отсутствует файл".

Добавлено спустя 4 минуты 55 секунд:

Проверил дебаггером - в блок if ... reset ... end прога не заходит. Юзай дебаггер среды, увидишь в нем весь ход программы пошагово.

Добавлено спустя 34 минуты 47 секунд:

Создал у себя папку и файл c:\justice\mass.xdb

Дебагер показал, что переменная qwe = 'c:\justice\mass.xdb' Поэтому прога не заходит в блок Reset. 'c:\justice\mass.xdb' не равно 'mass.xdb'

Сделал так:

FName: string;

XName: NameStr;

XDir: DirStr;

XExt: ExtStr;

процедура FSplit(qwe, XDir, XName, XExt);

FName := XName + XExt; {FName='mass.xdb'}

Теперь прога в блок if.. Reset... заходит.

Добавлено спустя 18 минут 7 секунд:

Удалил файл. Прога в блок if.. Reset не заходит. Всё нормально!

Итоги - юзай процедуру FSplit (модуль dos), чтобы не зависеть от разного поведения функции FSearch (вообще-то она должна выводить полное имя файла (с путём). думаю, что она выводит только имя файла без пути, когда ей передают пустую строку вместо пути. Пустая строка пути означает, что файл ожидается в папке, где сама прога).

И пользуйся окошком дебагера Watch (туда добавить переменные), клавишами F4 (run проги до положения курсора), F7 (пошаговый ран с заходом в процедуры и функции), F8 (пошаговый ран без захода в процедуры и функции). Ctrl-F2 - снять режим дебага.

Ссылка на комментарий

procedure FSplit(XPath: PathStr, var XDir: DirStr; var XName: NameStr; var XExt: ExtStr);

Процедура модуля dos. Разбивает полное имя файла на три части: путь, имя файла и расширение.

XPath - параметр типа PathStr, содержит полное имя файла 'c:\justice\mass.xdb'

XDir - переменная типа DirStr, в которую процедура записывает путь 'c:\justice\'

XName - переменная типа NameStr, в которую процедура записывает имя файла 'mass'

XExt - переменная типа ExtStr, в которую процедура записывает расширение файла '.xdb'

Ссылка на комментарий

Большое спасибо. Вот интересно, почему программа заходила в блок if..reset..end, когда файла на диске небыло? Я специально сделал там вывод qwe, файла нет, а она равна mass.xdb...

Ссылка на комментарий

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...