Contributor: SWAG SUPPORT TEAM { I found a source * COPY.PAS * (don't know where anymore or who posted it) and tried to Write my own move_Files Program based on it. The simple idea is to move the Files specified in paramstr(1) to a destination directory specified in paramstr(2) and create the directories that do not yet exist. On a first look it seems just to work out ok. But yet it does not. to help me find the failure set paramstr(1) to any path you want (For example D:\test\*.txt or whatever) and set paramstr(2) to a non existing path which is C:\A\B\C\D\E\F\G\H\..\Z\A\B\C\D\E\F\ The directories C:\A through C:\A\B\C\D\F\..\Q\R\S will be created and than the Program hangs. Who can help me find what the mistake is? I Really will be grateful For any kind of help. The code is: } {$A+,B-,D+,E+,F-,G-,I-,L+,N-,O-,R+,S-,V+,X-} Program aMOVE; Uses Crt, Dos; Const BufSize = 32768; Var ioCode : Byte; SrcFile, DstFile : File; FileNameA, FileNameB : String; Buffer : Array[1..BufSize] of Byte; RecsRead : Integer; DiskFull : Boolean; CurrDir : DirStr; {Aktuelles Verzeichnis speichern} HelpList : Boolean; {Hilfe uber mogliche Parameter?} i, n : Integer; str : String[1]; SDStr : DirStr; {Quellverzeichnis} SNStr : NameStr; {Quelldateiname} SEStr : ExtStr; {Quelldateierweiterung} DDStr : DirStr; {Zielverzeichnis} DNStr : NameStr; {Zieldateiname} DEStr : ExtStr; {Zieldateierweiterung} SrcInfo : SearchRec; {Liste der Quelldateien} SubDirStr : Array [0..32] of DirStr; key : Char; Procedure SrcFileError(ioCode : Byte); begin Write(#7, 'I/O result of ', ioCode, ' (decimal) ', #26); Case ioCode of $01 : WriteLn(' Source File not found.'); $F3 : WriteLn(' too many Files open.'); else WriteLn(' "Reset" unknown I/O error.'); end; end; Procedure DstFileError(ioCode : Byte); begin Write(#7, 'I/O result of ', ioCode, ' (decimal) ', #26); Case ioCode of $F0 : WriteLn(' Disk data area full.'); $F1 : WriteLn(' Disk directory full.'); $F3 : WriteLn(' too many Files open.'); else WriteLn(' "ReWrite" unknown I/O error.'); end; end; Procedure EXPAR; {externe Parameter abfragen} begin GetDir(0,CurrDir); {Aktuelles Verzeichnis speichern} if DDStr='' then DDStr:= CurrDir; {Wenn keine Zialangabe, dann ins aktuelle Verzeichnis verschieben} FSplit(paramstr(1), SDStr, SNStr, SEStr); end; Procedure Copy2Dest; begin if FileNameB <> FileNameA then begin Assign(SrcFile, FileNameA); Assign(DstFile, FileNameB); {* note second parameter in "reset" and "reWrite" of UNTyped Files. *} {$I-} Reset(SrcFile, 1); {$I+} ioCode := Ioresult; if (ioCode <> 0) then SrcFileError(ioCode) else begin {$I-} ReWrite(DstFile, 1); {$I+} ioCode := Ioresult; if (ioCode <> 0) then DstFileError(ioCode) else begin DiskFull := False; While (not EoF(SrcFile)) and (not DiskFull) do begin {* note fourth parameter in "blockread". *} {$I-} BlockRead(SrcFile, Buffer, BufSize, RecsRead); {$I+} ioCode := Ioresult; if ioCode <> 0 then begin SrcFileError(ioCode); DiskFull := True end else begin {$I-} BlockWrite(DstFile, Buffer, RecsRead); {$I+} ioCode := Ioresult; if ioCode <> 0 then begin DstFileError(ioCode); DiskFull := True end end end; if not DiskFull then WriteLn(FileNameB) end; Close(DstFile) end; Close(SrcFile) end else WriteLn(#7, 'File can not be copied onto itself.') end; Procedure ProofDest; begin if length(paramstr(2)) > 67 then begin Writeln; Writeln(#7,'Invalid destination directory specified.'); Writeln('Program aborted.'); Halt(1); end; FSplit(paramstr(2), DDStr, DNStr, DEStr); if copy(DNStr,length(DNStr),1)<>'.' then begin insert(DNStr,DDStr,length(DDStr)+1); DNStr:=''; end; if copy(DDStr,length(DDStr),1)<>'\' then insert('\',DDSTR,length(DDStr)+1); SubDirStr[0]:= DDStr; For i:= 1 to 20 do begin SubDirStr[i]:=copy(DDStr,1,pos('\',DDStr)); Delete(DDStr,1,pos('\',DDStr)); end; For i:= 32 doWNto 1 do begin if SubDirStr[i]= '' then n:= i-1; end; DDStr:= SubDirStr[0]; SubDirStr[0]:=''; For i:= 1 to n do begin SubDirStr[0]:= SubDirStr[0]+SubDirStr[i]; if copy(SubDirStr[0],length(SubDirStr[0]),1)='\' then delete(SubDirStr[0],length(SubDirStr[0]),1); begin {$I-} MkDir(SubDirStr[0]); {$I+} if Ioresult = 0 then WriteLn('New directory created: ', SubDirStr[0]); end; if copy(SubDirStr[0],length(SubDirStr[0]),1)<>'\' then insert('\',SubDirStr[0],length(SubDirStr[0])+1); end; end; Procedure HandleMove; begin FileNameA:= SDStr+SrcInfo.Name; FileNameB:= DDStr+SrcInfo.Name; Copy2Dest; Erase(SrcFile); end; Procedure ExeMove; begin ProofDest; FindFirst(paramstr(1), AnyFile, SrcInfo); While DosError = 0 do begin HandleMove; FindNext(SrcInfo); end; end; begin SDStr:= ''; SNStr:= ''; SEStr:= ''; DDStr:= ''; DNStr:= ''; DEStr:= ''; For i:=0 to 32 do SubDirStr[i]:=''; ExPar; ExeMove; end.