private void DeleteFileSystemInfo(FileSystemInfo info) { info.CreationTime = info.LastWriteTime = info.LastAccessTime = MinTimestamp; info.Attributes = FileAttributes.Normal; info.Attributes = FileAttributes.NotContentIndexed; for (int i = 0, tries = 0; i < FileNameErasePasses; ++tries) { string newPath = GenerateRandomFileName(info.GetParent(), info.Name.Length); try { info.MoveTo(newPath); ++i; } catch (IOException e) { switch (System.Runtime.InteropServices.Marshal.GetLastWin32Error()) { case Win32ErrorCode.AccessDenied: throw new UnauthorizedAccessException(S._("The file {0} could not " + "be erased because the file's permissions prevent access to the file.", info.FullName)); case Win32ErrorCode.SharingViolation: if (tries > FileNameEraseTries) throw new IOException(S._("The file {0} is currently in use and " + "cannot be removed.", info.FullName), e); Thread.Sleep(100); break; default: throw; } } } for (int i = 0; i < FileNameEraseTries; ++i) try { info.Delete(); break; } catch (IOException e) { switch (System.Runtime.InteropServices.Marshal.GetLastWin32Error()) { case Win32ErrorCode.AccessDenied: throw new UnauthorizedAccessException(S._("The file {0} could not " + "be erased because the file's permissions prevent access to the file.", info.FullName), e); case Win32ErrorCode.SharingViolation: if (i > FileNameEraseTries) throw new IOException(S._("The file {0} is currently in use and " + "cannot be removed.", info.FullName), e); Thread.Sleep(100); break; default: throw; } } }