Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.141.200.147] |
|
Сообщ.
#1
,
|
|
|
Как узнать есть ли на диске файл с данным именем?
Вариант вроде етого мне ненравиться, из-за лишних действий. function est_takoe_file(fname:string):boolean; var F:file of byte; t:byte; begin assign(F,Fname); reset(F); {I-} read(F,t); if IOresult=0 then est_takoe_file:=true{File вполне съедобное} else est_takoe_file:=false; {такое File есть нельзя} {I+} close(F); end; |
Сообщ.
#2
,
|
|
|
А FindFirst из юнита Dos, стало быть, не подходит?
|
Сообщ.
#3
,
|
|
|
2Mixxx
Опиши эту функцию в каком-нибудь модуле, откомпиль и вызывай всегда из других проектов. Так ты скоро про неё забудешь даже, потому что в программе она у тебя светиться не будет. |
Сообщ.
#4
,
|
|||
|
А друго-го способа нету? |
Сообщ.
#5
,
|
|||
|
Т.е. C глаз долой - из сердца вон! >:( ИМХО: Это плохая идея. |
Сообщ.
#6
,
|
|||
|
Еще, например, какое-то прерывание есть… |
Сообщ.
#7
,
|
|||
|
И как к нему обратиться? |
Сообщ.
#9
,
|
|
|
АААааа, еггог! reset(f) если файла нет, выдаст runtime error 100, потому как контроль ввода-вывода еще включен. А надо вот как:
assign(f,fname); {$i-} reset(f); close(f); {$i+} est_takoe_file:=ioresult=0; |
Сообщ.
#10
,
|
|
|
{*--- From mailserver by Valery Votintsev ---*} function FileExists(FileName: string): Boolean; { Returns True if file exists; otherwise, it returns False } var DirInfo: SearchRec; begin FindFirst(Filename, Archive, DirInfo); FileExists:=(DosError = 0); DosError:=0; end; { FileExists } |
Сообщ.
#11
,
|
|
|
А FindClose разве делать не надо?
|
Сообщ.
#12
,
|
|
|
Нет, не надо.
Это же не Дельфи, а Борланд Паскаль :) |
Сообщ.
#13
,
|
|
|
Не проще будет составить модуль со своими функциями и данную назвать:
function FileExist(FileName: string): boolean; И потом писать: uses MyFiles .... if FileExist('proba.pas') then... А юзать для неё (правильно тебе сказали) - FindFirst... ;D |
Сообщ.
#14
,
|
|||
|
А если есть каталог с таким именем? FindFirst скажет, что такой есть, а на Reset RuntimeError словишь! Надо либо проверять, не каталог ли нам FindFirst вернула, либо делать через Assign/Reset. Тока не повторяйте ошибки первого примера: файл надо закрывать только если он открылся |
Сообщ.
#15
,
|
|
|
FindFirst не скажет, что есть каталог, если в атрибутах не указано Directory.
Если тебе нужны длинные имена, можешь попробовать вот это: Var lngDosError: Word; { Результат последней операции с длинными именами } { Эту переменную следует проверять после использовании процедур или } { функций данного модуля. После использовании процедур/функций других } { модулей (например, System или Dos) следует проверять код ошибки через } { переменные соответствующих модулей! } Const lngSubstedPaths: Boolean = True; { Данная переменная используется функциями lngTrueName, lngShortName и } { lngLongName. Если значение переменной = FALSE, то функции возращают } { физический путь к файлу, если он находится на Subst-диске, если TRUE, } { то возвращается виртуальный путь к файлу. } {$S-} Procedure LString2ASCIIZ; assembler; Asm { DS:SI = LString; ES:DI = Buffer for ASCIIZ } cld push si push di lodsb xor ah,ah mov cx,ax rep movsb xchg ax,cx stosb xchg ax,cx pop di pop si End; { DS:SI = LString; ES:DI = ASCIIZ; AX = Length; CX is destroyed } {$S-} Procedure ASCIIZ2LString; assembler; Asm { DS:SI = ASCIIZ; ES:DI = Buffer for LString } cld mov cx,255 xor ax,ax repne scasb std jnz @ inc cx cmpsb @:not cx xor ch,ch mov ax,cx add si,ax rep movsb stosb cld cmpsb End; { DS:SI = ASCIIZ; ES:DI = LString; AX = Length; CX is destroyed } {$S+} Function TrueNameFunction(const Name: String): String; assembler; Var ASCIIZ: array [0..260] of Char; Asm push ds mov ch,lngSubstedPaths or ch,ch jz @NotSubsted mov ch,80h @NotSubsted: push cx lds si,Name push ss pop es lea di,ASCIIZ call LString2ASCIIZ mov ax,7160h pop cx push ss pop ds mov si,di les di,@Result stc int 21h jnc @Ok mov byte ptr es:[di],0 jmp @Error @Ok: mov si,di call ASCIIZ2LString xor ax,ax @Error: pop ds mov lngDosError,ax End; {$S-} Function lngTrueName(const Name: String): String; assembler; { Получить полное имя файла Name (аналогично функции FExpand модуля DOS) } { Значение переменной lngSubstedPaths учитывается (см. комментарии) } Asm xor cl,cl jmp TrueNameFunction+3 End; {$S-} Function lngShortName(const LongName: String): String; assembler; { Получить полное короткое имя _существующего_ файла } { Значение переменной lngSubstedPaths учитывается... } Asm mov cl,1 jmp TrueNameFunction+3 End; {$S-} Function lngLongName(const ShortName: String): String; assembler; { Получить полное длинное имя _существующего_ файла } { Значение переменной lngSubstedPaths учитывается... } Asm mov cl,2 jmp TrueNameFunction+3 End; Var F: File; S: String; Begin S := ParamStr(1); If S = '' then Begin WriteLn('Необходимо задать имя файла!'); Halt End; S := lngShortName(S); If S <> '' then Begin FileMode := 0; { Чтоб открывались ReadOnly-файлы } {$I-} Assign(F, S); Reset(F); {$I+} If IOResult = 0 then Begin Close(F); WriteLn('Файл найден!') End else WriteLn('Файл не открывается или это каталог!') End else WriteLn('Файл НЕ найден!') End. p.s. Если что-то захочешь сказать/спросить - пиши в приват, т.к. здесь очень редко бываю. |
Сообщ.
#16
,
|
|
|
Ну вы блин даёте, а что не знаете о стандартной паскалевской функции FSearch, FSplit, FExpand?
|
Сообщ.
#17
,
|
|
|
Кстати, да! Сам всегда через FSearch делал, а сейчас забыл
Правильно проверять так: FSearch('ИмяФайлаСИменемПути', '') , а не FSearch('ИмяФайла', 'ПутьКФайлу') !!! |
Сообщ.
#18
,
|
|
|
Можно и через FileSearch из модуля windows попробовать.......
uses windos; var p:pchar; s:array[0..100(длина названия)] of char; d:array[0..100(длина пути к файлу)] of char; begin writeln('Имя файла'); readln(s); p:=strnew(s); filesearch(d,p,getenvvar('path')); if d[0]=#0 then writeln('Файла на диске нет') else writeln('Путь к файлу - ',fileexpand (d,d)); end. Добавлено в : Из модуля WinDos |