Changeset 2656


Ignore:
Timestamp:
5/24/2012 4:10:12 AM (3 years ago)
Author:
lowjoel
Message:
Location:
trunk/eraser/Eraser.DefaultPlugins/ErasureTargets
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/eraser/Eraser.DefaultPlugins/ErasureTargets/FileErasureTarget.cs

    r2606 r2656  
    7676            FileInfo fileInfo = new FileInfo(Path); 
    7777 
    78             if (fileInfo.Exists) 
     78            try 
    7979            { 
    8080                result.AddRange(GetPathADSes(fileInfo)); 
    8181                result.Add(new StreamInfo(Path)); 
     82            } 
     83            catch (SharingViolationException) 
     84            { 
     85                Logger.Log(S._("Could not list the Alternate Data Streams for file {0} " + 
     86                    "because the file is being used by another process. The file will not " + 
     87                    "be erased.", fileInfo.FullName), LogLevel.Error); 
     88            } 
     89            catch (FileNotFoundException) 
     90            { 
     91            } 
     92            catch (DirectoryNotFoundException) 
     93            { 
    8294            } 
    8395 
  • trunk/eraser/Eraser.DefaultPlugins/ErasureTargets/FileSystemObjectErasureTarget.cs

    r2653 r2656  
    142142 
    143143        /// <summary> 
    144         /// Adds ADSes of the given file to the list, forcing the open handles to the 
    145         /// files closed if necessary. 
    146         /// </summary> 
    147         /// <param name="file">The file to look for ADSes</param> 
     144        /// Returns the ADSes of the given file, forcing open handles to the files closed 
     145        /// if necessary. 
     146        /// </summary> 
     147        /// <param name="file">The file to look for ADSes.</param> 
     148        /// <exception cref="SharingViolationException">Thrown when the file cannot be unlocked 
     149        /// and enumerated for ADSes.</exception> 
    148150        protected static StreamInfo[] GetPathADSes(FileInfo file) 
    149151        { 
     152            int attempts = 1; 
     153            return GetPathADSes(file, ref attempts); 
     154        } 
     155 
     156        /// <summary> 
     157        /// Returns the ADSes of the given file, forcing open handles to the files closed 
     158        /// if necessary. 
     159        /// </summary> 
     160        /// <param name="file">The file to look for ADSes.</param> 
     161        /// <param name="attempts">The number of tries to close open handles. Abort after a 
     162        /// large number of tries (currently 10 attempts)</param> 
     163        /// <returns>The list of ADSes the file contains.</returns> 
     164        private static StreamInfo[] GetPathADSes(FileInfo file, ref int attempts) 
     165        { 
    150166            try 
    151167            { 
     
    154170            catch (FileNotFoundException) 
    155171            { 
     172                return new StreamInfo[0]; 
    156173            } 
    157174            catch (SharingViolationException) 
     
    161178                    throw; 
    162179 
    163                 StringBuilder processStr = new StringBuilder(); 
    164                 foreach (OpenHandle handle in OpenHandle.Close(file.FullName)) 
    165                 { 
    166                     try 
    167                     { 
    168                         processStr.AppendFormat( 
    169                             System.Globalization.CultureInfo.InvariantCulture, 
    170                             "{0}, ", handle.Process.MainModule.FileName); 
    171                     } 
    172                     catch (System.ComponentModel.Win32Exception) 
    173                     { 
    174                         processStr.AppendFormat( 
    175                             System.Globalization.CultureInfo.InvariantCulture, 
    176                             "Process ID {0}, ", handle.Process.Id); 
    177                     } 
    178                 } 
    179  
    180                 if (processStr.Length == 0) 
    181                     return GetPathADSes(file); 
     180                //Retry closing the file 10 times. If we can't do that, we should abort 
     181                //since we may not be able to get the process information of processes 
     182                //running with higher privileges. 
     183                if (OpenHandle.Close(file.FullName).Count == 0 && attempts < 10) 
     184                    return GetPathADSes(file, ref attempts); 
    182185                else 
    183186                    throw; 
  • trunk/eraser/Eraser.DefaultPlugins/ErasureTargets/FolderErasureTarget.cs

    r2654 r2656  
    166166                        LogLevel.Information); 
    167167                } 
     168                catch (SharingViolationException) 
     169                { 
     170                    Logger.Log(S._("Could not list the Alternate Data Streams for file {0} " + 
     171                        "because the file is being used by another process. The file will not " + 
     172                        "be erased.", file.FullName), LogLevel.Error); 
     173                } 
    168174            } 
    169175 
  • trunk/eraser/Eraser.DefaultPlugins/ErasureTargets/RecycleBinErasureTarget.cs

    r2653 r2656  
    160160                            LogLevel.Information); 
    161161                    } 
     162                    catch (SharingViolationException) 
     163                    { 
     164                        Logger.Log(S._("Could not list the Alternate Data Streams for file {0} " + 
     165                            "because the file is being used by another process. The file will not " + 
     166                            "be erased.", fileInfo.FullName), LogLevel.Error); 
     167                    } 
    162168                } 
    163169 
  • trunk/eraser/Eraser.DefaultPlugins/ErasureTargets/SecureMoveErasureTarget.cs

    r2606 r2656  
    123123            foreach (FileInfo info in files) 
    124124            { 
    125                 //Add the alternate data streams 
    126                 result.AddRange(GetPathADSes(info)); 
    127  
    128                 //And the file itself 
    129                 result.Add(new StreamInfo(info.FullName)); 
     125                try 
     126                { 
     127                    //Add the alternate data streams 
     128                    result.AddRange(GetPathADSes(info)); 
     129 
     130                    //And the file itself 
     131                    result.Add(new StreamInfo(info.FullName)); 
     132                } 
     133                catch (SharingViolationException) 
     134                { 
     135                    Logger.Log(S._("Could not list the Alternate Data Streams for file {0} " + 
     136                        "because the file is being used by another process. The file will not " + 
     137                        "be erased.", info.FullName), LogLevel.Error); 
     138                } 
     139                catch (FileNotFoundException) 
     140                { 
     141                } 
     142                catch (DirectoryNotFoundException) 
     143                { 
     144                } 
    130145            } 
    131146 
Note: See TracChangeset for help on using the changeset viewer.