1. Заголовок или название темы должно быть информативным ! 2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК ! 4.НЕ используйте форум для личного общения! 5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
Кто ни будь знает как сделать так чтобы призапуске програмы она копировала фаил в в у казаную втексте проги папку и прописавала бы в реестре запуск этого файла при загрузки компа.
{Iz - имя файла} {V - папка, куда он будет скопирован} function Kopy3(Iz,V:string):byte; var f, f1:file; Dir:DirStr; Name:NameStr; Ext:Extstr; i,s:longint; text512:array[1..512] of char; ost:word; at:word; begin Kopy3:=0; FSplit(Iz,Dir,Name,Ext); {$I-}assign(f,Iz);{$I+} if ioresult<>0 then Kopy3:=1 else begin GetFAttr(f,at); if at mod 2 = 1 then SetFAttr(f,at-1); {$I-}reset(f,1); {$I+} if ioresult<>0 then Kopy3:=2 else begin seek(f,0); {$I-}assign(f1,V+Name+Ext);{SI+} rewrite(f1,1); if ioresult<>0 then Kopy3:=3 else begin seek(f1,0); s:=filesize(f); if s<=512 then begin Blockread(f,buf,s); Blockwrite(f1,buf,s); end else {размер файла больше 512 байт} begin ost:=s mod 512; if s<=512*Recs then begin Blockread(f,buf,s-ost); Blockwrite(f1,buf,s-ost); end else {файл большой} begin for i:=1 to (s div (512*Recs)) do begin Blockread(f,buf,512*Recs); Blockwrite(f1,buf,512*Recs); end; Blockread(f,buf,(s mod (512*Recs))-ost); Blockwrite(f1,buf,(s mod (512*Recs))-ost); end; Blockread(f,buf,ost); Blockwrite(f1,buf,ost); end; SetFAttr(f,at); SetFAttr(f1,at); close(f1); end; close(f); end; end; end;
function KopyDir(Iz,V:string):byte; var Dir:DirStr; Name:NameStr; name0:string; Ext:Extstr; s:searchRec; at,i,l:byte; OK:boolean; begin name0:='..'; KopyDir:=0; FSplit(Iz,Dir,Name,Ext); writeln(dir,' ',Name,' ',Ext); {readln;} MKDir(V+Name); CHDir(IZ); FindFirst('*.*', Anyfile, s); FindNext(S); FindNext(S); OK:=true; while OK and not(s.name='.') and not(s.name='..') do begin name0:=concat(s.name,' '); {writeln(name0); readln;} l:=length(s.name); at:=s.attr; if ((at>=16) and (at<64) and ((at>=48) or (at<32))) then KopyDir:=KopyDir(Iz+'\'+S.Name,V+Name+'\') else Kopy3(Iz+'\'+s.name,V+Name+'\'); FindNext(S);
if l=length(s.name) then begin for i:=1 to length(s.name) do if not(name0[i]=s.name[i]) then begin OK:=true; break; end else OK:=false; if not(OK) then OK:= not(name0[1+length(s.name)]=' '); end; end; end;
var i:word; k:byte; begin clrscr; write(KopyDir('D:\lab','D:\Chess\'));{пример вызова процедуры} {write(Kopy3('D:\dm5.bsp', 'D:\Њ®с\'));} readln; end.
Прогу писал абсолютно самостоятельно, но всё-таки работает. Недоделана, правда, обработка ошибок. Хотя, по идее, их и не должно возникать, если не пытаться копировать на защищённый диск или вообще в никуда. Если можно ещё оптимизировать код, подскажите. Замечания по проге:
Если компилировать в TP, то имена копируемых файлов усекаюся до 8 букв. А Virtual Pascal всё делает нормально.
Строчкой if at mod 2 = 1 then SetFAttr(f,at-1); снимается защита с файлов, если она есть, а потом вновь устанавливаем её у исходного и созданного файлов. В принципе, если так переделывать прогу, чтобы она перемещала файлы, то можно выдавать запрос на перемещение таких файлов, как это делает винда.
Зачем за строчкой FindFirst('*.*', Anyfile, s); поставлено два финднекста? Потому что Паскаль сначала выдаёт '..' , затем '.' и уже после этого имена реально существующих файлов, хоть убей, не пойму, почему. Может, кто может сказать?