OSDN Git Service

一部環境でごみ箱に完全に削除する項目が表示されない不具合を修正した
[completeeraser/CompleteEraser.git] / CompleteEraser / FileBreaker.cs
index 8a49470..c9986f8 100644 (file)
@@ -25,13 +25,26 @@ namespace CompleteEraser
         public static void BreakFile(string file)\r
         {\r
             FileAttributes attr = File.GetAttributes(file);\r
+\r
             if ((attr & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)\r
                 File.SetAttributes(file, attr & ~FileAttributes.ReadOnly);\r
 \r
-            string ext = Path.GetExtension(file);\r
+            if ((attr & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint &&\r
+                (attr & FileAttributes.SparseFile) != FileAttributes.SparseFile)\r
+                FillFileContent(file);\r
+            \r
+            string newFile = GenerateRandoName(Path.GetDirectoryName(file), Path.GetFileName(file).Length);\r
+            if(File.Exists(newFile) == false)\r
+                File.Move(file, newFile);\r
+            \r
+            File.Delete(newFile);\r
+        }\r
 \r
+        private static void FillFileContent(string file)\r
+        {\r
             FileStream fs;\r
             FileInfo info = new FileInfo(file);\r
+\r
             foreach (AlternateDataStreamInfo alt in info.ListAlternateDataStreams())\r
             {\r
                 fs = alt.Open(FileMode.Open);\r
@@ -39,18 +52,14 @@ namespace CompleteEraser
                 fs.Close();\r
             }\r
 \r
-            fs = new FileStream(file, FileMode.Open);\r
+            string ext = Path.GetExtension(file);\r
+\r
+            fs = new FileStream(file, FileMode.Open, FileAccess.Write, FileShare.None, 8, FileOptions.WriteThrough);\r
             if (Settings.Default.AlwaysSlowSpeed || Settings.Default.SlowSpeedExt.IndexOf(ext) != -1)\r
                 BreakFileSlowSpeed(fs);\r
             else\r
                 BreakFileHiSpeed(fs);\r
             fs.Close();\r
-\r
-            string newFile = GenerateRandoName(Path.GetDirectoryName(file), Path.GetFileName(file).Length);\r
-            if(File.Exists(newFile) == false)\r
-                File.Move(file, newFile);\r
-            \r
-            File.Delete(newFile);\r
         }\r
 \r
         private static void BreakFileSlowSpeed(FileStream fs)\r
@@ -76,12 +85,16 @@ namespace CompleteEraser
 \r
         public static void BreakFolder(string folder)\r
         {\r
-            IEnumerable<string> files = Directory.EnumerateFiles(folder, "*.*", SearchOption.TopDirectoryOnly);\r
-            foreach (string file in files)\r
-                BreakFile(file);\r
-            IEnumerable<string> dirs = Directory.EnumerateDirectories(folder, "*.*", SearchOption.TopDirectoryOnly);\r
-            foreach (string dir in dirs)\r
-                BreakFolder(dir);\r
+            DirectoryInfo info = new DirectoryInfo(folder);\r
+            if ((info.Attributes & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint)\r
+            {\r
+                IEnumerable<string> files = Directory.EnumerateFiles(folder, "*.*", SearchOption.TopDirectoryOnly);\r
+                foreach (string file in files)\r
+                    BreakFile(file);\r
+                IEnumerable<string> dirs = Directory.EnumerateDirectories(folder, "*.*", SearchOption.TopDirectoryOnly);\r
+                foreach (string dir in dirs)\r
+                    BreakFolder(dir);\r
+            }\r
             string newName = RenameFolderName(folder);\r
             Directory.Delete(newName);\r
         }\r