Changeset 1576


Ignore:
Timestamp:
1/18/2010 10:19:38 AM (4 years ago)
Author:
lowjoel
Message:

Throw an IOException when we can't access a given file instead of a FileLoadException? since FileLoadExceptions? are for assemblies which don't load properly. Addresses #284: Eraser.Util rewrite

Location:
branches/eraser6/CodeReview
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/eraser6/CodeReview/Eraser.Manager/DirectExecutor.cs

    r1570 r1576  
    625625                        info.FullName), LogLevel.Error)); 
    626626                } 
    627                 catch (FileLoadException) 
    628                 { 
    629                     if (!ManagerLibrary.Settings.ForceUnlockLockedFiles) 
     627                catch (IOException) 
     628                { 
     629                    if (System.Runtime.InteropServices.Marshal.GetLastWin32Error() == 
     630                        Win32ErrorCode.SharingViolation) 
     631                    { 
     632                        if (!ManagerLibrary.Settings.ForceUnlockLockedFiles) 
     633                            throw; 
     634 
     635                        List<System.Diagnostics.Process> processes = 
     636                            new List<System.Diagnostics.Process>(); 
     637                        foreach (OpenHandle handle in OpenHandle.Items) 
     638                            if (handle.Path == paths[i]) 
     639                                processes.Add(System.Diagnostics.Process.GetProcessById(handle.ProcessId)); 
     640 
     641                        StringBuilder processStr = new StringBuilder(); 
     642                        foreach (System.Diagnostics.Process process in processes) 
     643                            processStr.AppendFormat(System.Globalization.CultureInfo.InvariantCulture, 
     644                                "{0}, ", process.MainModule.FileName); 
     645 
     646                        task.Log.LastSessionEntries.Add(new LogEntry(S._( 
     647                                "Could not force closure of file \"{0}\" (locked by {1})", 
     648                                paths[i], processStr.ToString().Remove(processStr.Length - 2)), 
     649                            LogLevel.Error)); 
     650                    } 
     651                    else 
    630652                        throw; 
    631  
    632                     List<System.Diagnostics.Process> processes = new List<System.Diagnostics.Process>(); 
    633                     foreach (OpenHandle handle in OpenHandle.Items) 
    634                         if (handle.Path == paths[i]) 
    635                             processes.Add(System.Diagnostics.Process.GetProcessById(handle.ProcessId)); 
    636  
    637                     StringBuilder processStr = new StringBuilder(); 
    638                     foreach (System.Diagnostics.Process process in processes) 
    639                         processStr.AppendFormat(System.Globalization.CultureInfo.InvariantCulture, 
    640                             "{0}, ", process.MainModule.FileName); 
    641  
    642                     task.Log.LastSessionEntries.Add(new LogEntry(S._( 
    643                         "Could not force closure of file \"{0}\" (locked by {1})", 
    644                         paths[i], processStr.ToString().Remove(processStr.Length - 2)), LogLevel.Error)); 
    645653                } 
    646654                finally 
  • branches/eraser6/CodeReview/Eraser.Manager/Task.cs

    r1572 r1576  
    459459                } 
    460460            } 
    461             catch (FileLoadException) 
    462             { 
    463                 //The system cannot open the file, try to force the file handle to close. 
    464                 if (!ManagerLibrary.Settings.ForceUnlockLockedFiles) 
     461            catch (IOException) 
     462            { 
     463                if (System.Runtime.InteropServices.Marshal.GetLastWin32Error() == 
     464                    Win32ErrorCode.SharingViolation) 
     465                { 
     466                    //The system cannot open the file, try to force the file handle to close. 
     467                    if (!ManagerLibrary.Settings.ForceUnlockLockedFiles) 
     468                        throw; 
     469 
     470                    foreach (OpenHandle handle in OpenHandle.Items) 
     471                        if (handle.Path == file && handle.Close()) 
     472                        { 
     473                            GetPathADSes(list, out totalSize, file); 
     474                            return; 
     475                        } 
     476                } 
     477                else 
    465478                    throw; 
    466  
    467                 foreach (OpenHandle handle in OpenHandle.Items) 
    468                     if (handle.Path == file && handle.Close()) 
    469                     { 
    470                         GetPathADSes(list, out totalSize, file); 
    471                         return; 
    472                     } 
    473479            } 
    474480            catch (UnauthorizedAccessException e) 
  • branches/eraser6/CodeReview/Eraser.Util/Win32ErrorCodes.cs

    r1566 r1576  
    2424using System.Text; 
    2525using System.Runtime.InteropServices; 
     26using System.IO; 
    2627 
    2728namespace Eraser.Util 
     
    3435        /// <param name="errorCode">The error code to convert.</param> 
    3536        /// <returns>A HRESULT value representing the error code.</returns> 
    36         internal static int GetHRForWin32Error(int errorCode) 
     37        private static int GetHRForWin32Error(int errorCode) 
    3738        { 
    3839            const uint FACILITY_WIN32 = 7; 
     
    4849        internal static Exception GetExceptionForWin32Error(int errorCode) 
    4950        { 
    50             int HR = GetHRForWin32Error(errorCode); 
    51             return Marshal.GetExceptionForHR(HR); 
     51            switch (errorCode) 
     52            { 
     53                case NoError:           return null; 
     54                case SharingViolation:  return new IOException(); 
     55 
     56                default: 
     57                    int HR = GetHRForWin32Error(errorCode); 
     58                    return Marshal.GetExceptionForHR(HR); 
     59            } 
    5260        } 
    5361 
Note: See TracChangeset for help on using the changeset viewer.