Changeset 2338


Ignore:
Timestamp:
10/30/2011 1:21:08 AM (7 months ago)
Author:
lowjoel
Message:

Merged revision(s) 2335-2337 from trunk/eraser: Allow file unlocking to be done in the actual erasure as well, in addition to when finding stream ADSes. This allows a greater number of files to be unlocked. Addresses #394.

Location:
branches/eraser6/6.0
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • branches/eraser6/6.0

  • branches/eraser6/6.0/Eraser.Manager/DirectExecutor.cs

    r2331 r2338  
    768768                        info.IsReadOnly = false; 
    769769 
    770                     //Make sure the file does not have any attributes which may affect 
    771                     //the erasure process 
    772                     if ((info.Attributes & FileAttributes.Compressed) != 0 ||  
    773                         (info.Attributes & FileAttributes.Encrypted) != 0 || 
    774                         (info.Attributes & FileAttributes.SparseFile) != 0) 
    775                     { 
    776                         //Log the error 
    777                         task.Log.LastSessionEntries.Add(new LogEntry(S._("The file {0} could " + 
    778                             "not be erased because the file was either compressed, encrypted or " + 
    779                             "a sparse file.", info.FullName), LogLevel.Error)); 
    780                         continue; 
    781                     } 
    782  
    783770                    long itemWritten = 0; 
    784                     fsManager.EraseFileSystemObject(info, method, 
     771                    TryEraseFilesystemObject(task, method, info, fsManager,  
    785772                        delegate(long lastWritten, long totalData, int currentPass) 
    786773                        { 
     
    811798                        info.FullName), LogLevel.Error)); 
    812799                } 
    813                 catch (FileLoadException) 
    814                 { 
    815                     if (!ManagerLibrary.Settings.ForceUnlockLockedFiles) 
    816                         throw; 
    817  
    818                     List<System.Diagnostics.Process> processes = new List<System.Diagnostics.Process>(); 
    819                     foreach (OpenHandle handle in OpenHandle.Items) 
    820                         if (handle.Path == paths[i]) 
    821                             processes.Add(System.Diagnostics.Process.GetProcessById(handle.ProcessId)); 
    822  
    823                     string lockedBy = null; 
    824                     if (processes.Count > 0) 
    825                     { 
    826                         StringBuilder processStr = new StringBuilder(); 
    827                         foreach (System.Diagnostics.Process process in processes) 
    828                         { 
    829                             try 
    830                             { 
    831                                 processStr.AppendFormat(System.Globalization.CultureInfo.InvariantCulture, 
    832                                     "{0}, ", process.MainModule.FileName); 
    833                             } 
    834                             catch (System.ComponentModel.Win32Exception) 
    835                             { 
    836                             } 
    837                         } 
    838  
    839                         lockedBy = S._("(locked by {0})", processStr.ToString().Remove(processStr.Length - 2)); 
    840                     } 
    841  
    842                     task.Log.LastSessionEntries.Add(new LogEntry(S._( 
    843                         "Could not force closure of file \"{0}\" {1}", paths[i], 
    844                         lockedBy == null ? string.Empty : lockedBy).Trim(), LogLevel.Error)); 
     800                catch (FileLoadException e) 
     801                { 
     802                    task.Log.LastSessionEntries.Add(new LogEntry(e.Message, LogLevel.Error)); 
    845803                } 
    846804                finally 
     
    922880        } 
    923881 
     882        private void TryEraseFilesystemObject(Task task, ErasureMethod method, StreamInfo info, 
     883            FileSystem fsManager, ErasureMethodProgressFunction progressCallback) 
     884        { 
     885            for (int i = 0; ; ++i) 
     886            { 
     887                try 
     888                { 
     889                    //Make sure the file does not have any attributes which may affect 
     890                    //the erasure process 
     891                    if ((info.Attributes & FileAttributes.Compressed) != 0 || 
     892                        (info.Attributes & FileAttributes.Encrypted) != 0 || 
     893                        (info.Attributes & FileAttributes.SparseFile) != 0) 
     894                    { 
     895                        //Log the error 
     896                        task.Log.LastSessionEntries.Add(new LogEntry(S._("The file {0} could " + 
     897                            "not be erased because the file was either compressed, encrypted or " + 
     898                            "a sparse file.", info.FullName), LogLevel.Error)); 
     899                        return; 
     900                    } 
     901 
     902                    fsManager.EraseFileSystemObject(info, method, progressCallback); 
     903                    return; 
     904                } 
     905                catch (FileLoadException e) 
     906                { 
     907                    if (!ManagerLibrary.Settings.ForceUnlockLockedFiles) 
     908                        throw; 
     909 
     910                    //Try closing all open handles. If it succeeds, we can run the erase again. 
     911                    List<System.Diagnostics.Process> processes = new List<System.Diagnostics.Process>(); 
     912                    bool closed = true; 
     913                    foreach (OpenHandle handle in OpenHandle.Items) 
     914                        if (handle.Path == info.File.FullName) 
     915                        { 
     916                            processes.Add(System.Diagnostics.Process.GetProcessById(handle.ProcessId)); 
     917                            closed = closed && handle.Close(); 
     918                        } 
     919 
     920                    //To prevent Eraser from deadlocking, we will only attempt this once. Some 
     921                    //programs may be aggressive and keep a handle open in a tight loop. 
     922                    if (!closed || i >= 1) 
     923                    { 
     924                        string lockedBy = null; 
     925                        if (processes.Count > 0) 
     926                        { 
     927                            StringBuilder processStr = new StringBuilder(); 
     928                            foreach (System.Diagnostics.Process process in processes) 
     929                            { 
     930                                try 
     931                                { 
     932                                    processStr.AppendFormat(System.Globalization.CultureInfo.InvariantCulture, 
     933                                        "{0}, ", process.MainModule.FileName); 
     934                                } 
     935                                catch (System.ComponentModel.Win32Exception) 
     936                                { 
     937                                } 
     938                            } 
     939 
     940                            lockedBy = S._("(locked by {0})", processStr.ToString().Remove(processStr.Length - 2)); 
     941                        } 
     942 
     943                        throw new FileLoadException(S._( 
     944                            "Could not force closure of file \"{0}\" {1}", info.File.FullName, 
     945                            lockedBy == null ? string.Empty : lockedBy).Trim(), info.File.FullName, 
     946                            e); 
     947                    } 
     948                } 
     949            } 
     950        } 
     951 
    924952        /// <summary> 
    925953        /// The thread object. 
  • branches/eraser6/6.0/Eraser.Manager/Strings.en.resx

    r2169 r2338  
    157157    <value>The file {0} was not erased as the file does not exist.</value> 
    158158  </data> 
     159  <data name="The file {0} could not be erased because the file's permissions prevent access to the file." xml:space="preserve"> 
     160    <value>The file {0} could not be erased because the file's permissions prevent access to the file.</value> 
     161  </data> 
     162  <data name="Removing folders..." xml:space="preserve"> 
     163    <value>Removing folders...</value> 
     164  </data> 
     165  <data name="The folder {0} could not be deleted because the folder's permissions prevents the deletion of the folder." xml:space="preserve"> 
     166    <value>The folder {0} could not be deleted because the folder's permissions prevents the deletion of the folder.</value> 
     167  </data> 
     168  <data name="Emptying recycle bin..." xml:space="preserve"> 
     169    <value>Emptying recycle bin...</value> 
     170  </data> 
    159171  <data name="The file {0} could not be erased because the file was either compressed, encrypted or a sparse file." xml:space="preserve"> 
    160172    <value>The file {0} could not be erased because the file was either compressed, encrypted or a sparse file.</value> 
    161173  </data> 
    162   <data name="The file {0} could not be erased because the file's permissions prevent access to the file." xml:space="preserve"> 
    163     <value>The file {0} could not be erased because the file's permissions prevent access to the file.</value> 
    164   </data> 
    165174  <data name="(locked by {0})" xml:space="preserve"> 
    166175    <value>(locked by {0})</value> 
     
    169178    <value>Could not force closure of file \"{0}\" {1}</value> 
    170179  </data> 
    171   <data name="Removing folders..." xml:space="preserve"> 
    172     <value>Removing folders...</value> 
    173   </data> 
    174   <data name="The folder {0} could not be deleted because the folder's permissions prevents the deletion of the folder." xml:space="preserve"> 
    175     <value>The folder {0} could not be deleted because the folder's permissions prevents the deletion of the folder.</value> 
    176   </data> 
    177   <data name="Emptying recycle bin..." xml:space="preserve"> 
    178     <value>Emptying recycle bin...</value> 
    179   </data> 
    180180  <data name="EntropySource GUID not found: {0}" xml:space="preserve"> 
    181181    <value>EntropySource GUID not found: {0}</value> 
  • branches/eraser6/6.0/Eraser.Manager/Strings.it.resx

    r2169 r2338  
    157157    <value>Il file {0} non è stato pulito perchè il file non esiste.</value> 
    158158  </data> 
     159  <data name="The file {0} could not be erased because the file's permissions prevent access to the file." xml:space="preserve"> 
     160    <value>Il file {0} non può essere pulito perchè i permessi su di esso ne impediscono l'accesso.</value> 
     161  </data> 
     162  <data name="Removing folders..." xml:space="preserve"> 
     163    <value>Rimozione cartelle...</value> 
     164  </data> 
     165  <data name="The folder {0} could not be deleted because the folder's permissions prevents the deletion of the folder." xml:space="preserve"> 
     166    <value>(Untranslated)</value> 
     167  </data> 
     168  <data name="Emptying recycle bin..." xml:space="preserve"> 
     169    <value>Pulizia del cestino...</value> 
     170  </data> 
    159171  <data name="The file {0} could not be erased because the file was either compressed, encrypted or a sparse file." xml:space="preserve"> 
    160172    <value>Il file {0} non può essere pulito perchè è compresso, crittato o distribuito.</value> 
    161173  </data> 
    162   <data name="The file {0} could not be erased because the file's permissions prevent access to the file." xml:space="preserve"> 
    163     <value>Il file {0} non può essere pulito perchè i permessi su di esso ne impediscono l'accesso.</value> 
    164   </data> 
    165174  <data name="(locked by {0})" xml:space="preserve"> 
    166175    <value>(Untranslated)</value> 
     
    168177  <data name="Could not force closure of file \&quot;{0}\&quot; {1}" xml:space="preserve"> 
    169178    <value>(Untranslated)</value> 
    170   </data> 
    171   <data name="Removing folders..." xml:space="preserve"> 
    172     <value>Rimozione cartelle...</value> 
    173   </data> 
    174   <data name="The folder {0} could not be deleted because the folder's permissions prevents the deletion of the folder." xml:space="preserve"> 
    175     <value>(Untranslated)</value> 
    176   </data> 
    177   <data name="Emptying recycle bin..." xml:space="preserve"> 
    178     <value>Pulizia del cestino...</value> 
    179179  </data> 
    180180  <data name="EntropySource GUID not found: {0}" xml:space="preserve"> 
  • branches/eraser6/6.0/Eraser.Manager/Strings.nl.resx

    r2169 r2338  
    157157    <value>(Untranslated)</value> 
    158158  </data> 
     159  <data name="The file {0} could not be erased because the file's permissions prevent access to the file." xml:space="preserve"> 
     160    <value>(Untranslated)</value> 
     161  </data> 
     162  <data name="Removing folders..." xml:space="preserve"> 
     163    <value>(Untranslated)</value> 
     164  </data> 
     165  <data name="The folder {0} could not be deleted because the folder's permissions prevents the deletion of the folder." xml:space="preserve"> 
     166    <value>(Untranslated)</value> 
     167  </data> 
     168  <data name="Emptying recycle bin..." xml:space="preserve"> 
     169    <value>(Untranslated)</value> 
     170  </data> 
    159171  <data name="The file {0} could not be erased because the file was either compressed, encrypted or a sparse file." xml:space="preserve"> 
    160172    <value>(Untranslated)</value> 
    161173  </data> 
    162   <data name="The file {0} could not be erased because the file's permissions prevent access to the file." xml:space="preserve"> 
    163     <value>(Untranslated)</value> 
    164   </data> 
    165174  <data name="(locked by {0})" xml:space="preserve"> 
    166175    <value>(Untranslated)</value> 
     
    169178    <value>(Untranslated)</value> 
    170179  </data> 
    171   <data name="Removing folders..." xml:space="preserve"> 
    172     <value>(Untranslated)</value> 
    173   </data> 
    174   <data name="The folder {0} could not be deleted because the folder's permissions prevents the deletion of the folder." xml:space="preserve"> 
    175     <value>(Untranslated)</value> 
    176   </data> 
    177   <data name="Emptying recycle bin..." xml:space="preserve"> 
    178     <value>(Untranslated)</value> 
    179   </data> 
    180180  <data name="EntropySource GUID not found: {0}" xml:space="preserve"> 
    181181    <value>(Untranslated)</value> 
  • branches/eraser6/6.0/Eraser.Manager/Strings.pl.resx

    r2169 r2338  
    157157    <value>Plik {0} nie został wymazany, bo nie istnieje.</value> 
    158158  </data> 
     159  <data name="The file {0} could not be erased because the file's permissions prevent access to the file." xml:space="preserve"> 
     160    <value>Plik {0} nie mógł być wymazany z powodu ograniczonego prawa dostępu do pliku.</value> 
     161  </data> 
     162  <data name="Removing folders..." xml:space="preserve"> 
     163    <value>Usuwanie katalogów...</value> 
     164  </data> 
     165  <data name="The folder {0} could not be deleted because the folder's permissions prevents the deletion of the folder." xml:space="preserve"> 
     166    <value>(Untranslated)</value> 
     167  </data> 
     168  <data name="Emptying recycle bin..." xml:space="preserve"> 
     169    <value>Opróżnianie kosza...</value> 
     170  </data> 
    159171  <data name="The file {0} could not be erased because the file was either compressed, encrypted or a sparse file." xml:space="preserve"> 
    160172    <value>Plik {0} nie mógł być wymazany, bo był skompresowany, zaszyfrowany lub rozrzedzony.</value> 
    161173  </data> 
    162   <data name="The file {0} could not be erased because the file's permissions prevent access to the file." xml:space="preserve"> 
    163     <value>Plik {0} nie mógł być wymazany z powodu ograniczonego prawa dostępu do pliku.</value> 
    164   </data> 
    165174  <data name="(locked by {0})" xml:space="preserve"> 
    166175    <value>(zablokowane przez {0})</value> 
     
    169178    <value>Nie można wymusić zamknięcia pliku \"{0}\" {1}</value> 
    170179  </data> 
    171   <data name="Removing folders..." xml:space="preserve"> 
    172     <value>Usuwanie katalogów...</value> 
    173   </data> 
    174   <data name="The folder {0} could not be deleted because the folder's permissions prevents the deletion of the folder." xml:space="preserve"> 
    175     <value>(Untranslated)</value> 
    176   </data> 
    177   <data name="Emptying recycle bin..." xml:space="preserve"> 
    178     <value>Opróżnianie kosza...</value> 
    179   </data> 
    180180  <data name="EntropySource GUID not found: {0}" xml:space="preserve"> 
    181181    <value>Nie znaleziono źródła entropii GUID: {0}</value> 
  • branches/eraser6/6.0/Eraser.Manager/Strings.resx

    r2169 r2338  
    157157    <value>The file {0} was not erased as the file does not exist.</value> 
    158158  </data> 
     159  <data name="The file {0} could not be erased because the file's permissions prevent access to the file." xml:space="preserve"> 
     160    <value>The file {0} could not be erased because the file's permissions prevent access to the file.</value> 
     161  </data> 
     162  <data name="Removing folders..." xml:space="preserve"> 
     163    <value>Removing folders...</value> 
     164  </data> 
     165  <data name="The folder {0} could not be deleted because the folder's permissions prevents the deletion of the folder." xml:space="preserve"> 
     166    <value>The folder {0} could not be deleted because the folder's permissions prevents the deletion of the folder.</value> 
     167  </data> 
     168  <data name="Emptying recycle bin..." xml:space="preserve"> 
     169    <value>Emptying recycle bin...</value> 
     170  </data> 
    159171  <data name="The file {0} could not be erased because the file was either compressed, encrypted or a sparse file." xml:space="preserve"> 
    160172    <value>The file {0} could not be erased because the file was either compressed, encrypted or a sparse file.</value> 
    161173  </data> 
    162   <data name="The file {0} could not be erased because the file's permissions prevent access to the file." xml:space="preserve"> 
    163     <value>The file {0} could not be erased because the file's permissions prevent access to the file.</value> 
    164   </data> 
    165174  <data name="(locked by {0})" xml:space="preserve"> 
    166175    <value>(locked by {0})</value> 
     
    169178    <value>Could not force closure of file \"{0}\" {1}</value> 
    170179  </data> 
    171   <data name="Removing folders..." xml:space="preserve"> 
    172     <value>Removing folders...</value> 
    173   </data> 
    174   <data name="The folder {0} could not be deleted because the folder's permissions prevents the deletion of the folder." xml:space="preserve"> 
    175     <value>The folder {0} could not be deleted because the folder's permissions prevents the deletion of the folder.</value> 
    176   </data> 
    177   <data name="Emptying recycle bin..." xml:space="preserve"> 
    178     <value>Emptying recycle bin...</value> 
    179   </data> 
    180180  <data name="EntropySource GUID not found: {0}" xml:space="preserve"> 
    181181    <value>EntropySource GUID not found: {0}</value> 
Note: See TracChangeset for help on using the changeset viewer.