Browse Source

Correct copy of files to temp directory and removal of temp directory

git-svn-id: trunk@38960 -
pierre 7 years ago
parent
commit
8911709f36
1 changed files with 93 additions and 22 deletions
  1. 93 22
      tests/utils/dosbox/dosbox_wrapper.pas

+ 93 - 22
tests/utils/dosbox/dosbox_wrapper.pas

@@ -93,6 +93,17 @@ begin
   end;
   end;
 end;
 end;
 
 
+{ File names in Config entries assume that
+  executables have no suffix }
+function TargetFileExists(AName : string) : boolean;
+begin
+  result:=SysUtils.FileExists(AName);
+  if not result then
+    result:=SysUtils.FileExists(AName+'.exe');
+  if not result then
+    result:=SysUtils.FileExists(AName+'.EXE');
+end;
+
 procedure CopyFile(ASrcFileName, ADestFileName: string);
 procedure CopyFile(ASrcFileName, ADestFileName: string);
 var
 var
   SrcF, DestF: File;
   SrcF, DestF: File;
@@ -108,29 +119,34 @@ begin
       ADestFileName:=ADestFileName+'.exe';
       ADestFileName:=ADestFileName+'.exe';
     end;
     end;
   if verbose then
   if verbose then
-    Writeln('CopyFile ', ASrcFileName, '->', ADestFileName);
+    Writeln('CopyFile "', ASrcFileName, '" -> "', ADestFileName,'"');
   OldFileMode := FileMode;
   OldFileMode := FileMode;
   try
   try
-    AssignFile(SrcF, ASrcFileName);
-    AssignFile(DestF, ADestFileName);
-    FileMode := fmOpenRead;
-    Reset(SrcF, 1);
     try
     try
-      FileMode := fmOpenWrite;
+      AssignFile(SrcF, ASrcFileName);
+      AssignFile(DestF, ADestFileName);
+      FileMode := fmOpenRead;
+      Reset(SrcF, 1);
       try
       try
-        Rewrite(DestF, 1);
-        repeat
-          BlockRead(SrcF, Buf, SizeOf(Buf), BytesRead);
-          BlockWrite(DestF, Buf, BytesRead);
-        until BytesRead < SizeOf(Buf);
+        FileMode := fmOpenWrite;
+        try
+          Rewrite(DestF, 1);
+          repeat
+            BlockRead(SrcF, Buf, SizeOf(Buf), BytesRead);
+            BlockWrite(DestF, Buf, BytesRead);
+          until BytesRead < SizeOf(Buf);
+        finally
+          CloseFile(DestF);
+        end;
       finally
       finally
-        CloseFile(DestF);
+        CloseFile(SrcF);
       end;
       end;
     finally
     finally
-      CloseFile(SrcF);
+      FileMode := OldFileMode;
     end;
     end;
-  finally
-    FileMode := OldFileMode;
+  except
+   on E : Exception do
+     writeln('Error: '+ E.ClassName + #13#10 + E.Message );
   end;
   end;
 end;
 end;
 
 
@@ -192,6 +208,8 @@ var
         begin
         begin
           LocalFile:=Trim(GetToken(fl, [' ',',',';']));
           LocalFile:=Trim(GetToken(fl, [' ',',',';']));
           Result.Add(LocalFile);
           Result.Add(LocalFile);
+          if verbose then
+            writeln('Adding file ',LocalFile,' from Config.Files');
         end;
         end;
 
 
       if Config.ConfigFileSrc<>'' then
       if Config.ConfigFileSrc<>'' then
@@ -200,18 +218,24 @@ var
             Result.AddObject(Config.ConfigFileSrc,RelativeToConfigMarker)
             Result.AddObject(Config.ConfigFileSrc,RelativeToConfigMarker)
           else
           else
             Result.AddObject(Config.ConfigFileSrc+'='+Config.ConfigFileDst,RelativeToConfigMarker);
             Result.AddObject(Config.ConfigFileSrc+'='+Config.ConfigFileDst,RelativeToConfigMarker);
+          if verbose then
+            writeln('Adding config file Src=',Config.ConfigFileSrc,' Dst=',Config.ConfigFileDst);
         end;
         end;
       while dfl <> '' do
       while dfl <> '' do
         begin
         begin
           LocalFile:=Trim(GetToken(dfl, [' ',',',';']));
           LocalFile:=Trim(GetToken(dfl, [' ',',',';']));
           Result.Add(LocalFile);
           Result.Add(LocalFile);
+          if verbose then
+            writeln('Adding file ',LocalFile,' from Config.DelFiles');
         end;
         end;
      end;
      end;
 
 
 var
 var
   ddir : string;
   ddir : string;
+  param1_dir : string;
 begin
 begin
-  if not IsAbsolute(SourceFileName) and not FileExists(SourceFileName) then
+  param1_dir:=ExtractFilePath(ParamStr(1));
+  if not IsAbsolute(SourceFileName) and not TargetFileExists(SourceFileName) then
     begin
     begin
       ddir:=GetEnvironmentVariable('BASEDIR');
       ddir:=GetEnvironmentVariable('BASEDIR');
       if ddir='' then
       if ddir='' then
@@ -219,7 +243,7 @@ begin
       // writeln('Start ddir=',ddir);
       // writeln('Start ddir=',ddir);
       while (ddir<>'') do
       while (ddir<>'') do
         begin
         begin
-          if FileExists(ddir+DirectorySeparator+SourceFileName) then
+          if TargetFileExists(ddir+DirectorySeparator+SourceFileName) then
             begin
             begin
               SourceFileName:=ddir+DirectorySeparator+SourceFileName;
               SourceFileName:=ddir+DirectorySeparator+SourceFileName;
               break;
               break;
@@ -235,8 +259,8 @@ begin
               // writeln('Next ddir=',ddir);
               // writeln('Next ddir=',ddir);
             end;
             end;
         end;
         end;
-     end;
-  if not FileExists(SourceFileName) then
+    end;
+  if not TargetFileExists(SourceFileName) then
     begin
     begin
       writeln('File ',SourceFileName,' not found');
       writeln('File ',SourceFileName,' not found');
       exit;
       exit;
@@ -270,7 +294,10 @@ begin
             s:='config/'+LocalFile
             s:='config/'+LocalFile
           else
           else
             s:=LocalPath+LocalFile;
             s:=LocalPath+LocalFile;
-          CopyFile(s,DosBoxDir+DirectorySeparator+RemoteFile);
+          if not TargetFileExists(s) then
+            if TargetFileExists(param1_dir+DirectorySeparator+LocalFile) then
+              s:=param1_dir+DirectorySeparator+LocalFile;
+          CopyFile(s,DosBoxDir+RemoteFile);
           TmpFileList.Add(RemoteFile);
           TmpFileList.Add(RemoteFile);
         end;
         end;
       FileList.Free;
       FileList.Free;
@@ -374,10 +401,54 @@ begin
 end;
 end;
 
 
 
 
-procedure DeleteIfExists(const AFileName: string);
+function DeleteIfExists(const AFileName: string) : boolean;
 begin
 begin
+  result:=false;
   if FileExists(AFileName) then
   if FileExists(AFileName) then
-    DeleteFile(AFileName);
+    result:=DeleteFile(AFileName);
+  if not result and FileExists(AFileName+'.exe') then
+    result:=DeleteFile(AFileName+'.exe');
+  if not result and FileExists(AFileName+'.EXE') then
+    result:=DeleteFile(AFileName+'.EXE');
+end;
+
+{ RemoveDir, with removal of files or subdirectories inside first.
+  ADirName is supposed to finish with DirectorySeparator }
+function RemoveDir(const ADirName: string) : boolean;
+var
+  Info : TSearchRec;
+begin
+  Result:=true;
+  If FindFirst (AdirName+'*',faAnyFile and faDirectory,Info)=0 then
+    begin
+      repeat
+        with Info do
+          begin
+           If (Attr and faDirectory) = faDirectory then
+             begin
+               { Skip present and parent directory }
+               if (Name<>'..') and (Name<>'.') then
+                 if not RemoveDir(ADirName+Name+DirectorySeparator) then
+                   begin
+                     writeln('Failed to remove dir '+ADirName+Name+DirectorySeparator);
+                     result:=false;
+                     FindClose(Info);
+                     exit;
+                   end;
+             end
+          else
+            if not DeleteFile(ADirName+Name) then
+              begin
+                writeln('Failed to remove file '+ADirName+Name);
+                result:=false;
+                FindClose(Info);
+                exit;
+              end;
+        end;
+    Until FindNext(info)<>0;
+    end;
+  FindClose(Info);
+  RemoveDir:=SysUtils.RemoveDir(ADirName);
 end;
 end;
 
 
 procedure Cleanup(const ADosBoxDir: string);
 procedure Cleanup(const ADosBoxDir: string);