Revision | d1af9e2add251d6d6ab71d361c7e6d0bd7054d90 (tree) |
---|---|
Time | 2012-08-13 04:46:49 |
Author | konekoneko <jbh03215@gmai...> |
Commiter | konekoneko |
リパースポイント、スパースファイルとして作成されたに対してはゼロフィルを行わないようにした
リパースポイントとして作成されたフォルダーを指定した場合、再帰的な破壊は行わないようにした
@@ -25,13 +25,26 @@ namespace CompleteEraser | ||
25 | 25 | public static void BreakFile(string file) |
26 | 26 | { |
27 | 27 | FileAttributes attr = File.GetAttributes(file); |
28 | + | |
28 | 29 | if ((attr & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) |
29 | 30 | File.SetAttributes(file, attr & ~FileAttributes.ReadOnly); |
30 | 31 | |
31 | - string ext = Path.GetExtension(file); | |
32 | + if ((attr & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint && | |
33 | + (attr & FileAttributes.SparseFile) != FileAttributes.SparseFile) | |
34 | + FillFileContent(file); | |
35 | + | |
36 | + string newFile = GenerateRandoName(Path.GetDirectoryName(file), Path.GetFileName(file).Length); | |
37 | + if(File.Exists(newFile) == false) | |
38 | + File.Move(file, newFile); | |
39 | + | |
40 | + File.Delete(newFile); | |
41 | + } | |
32 | 42 | |
43 | + private static void FillFileContent(string file) | |
44 | + { | |
33 | 45 | FileStream fs; |
34 | 46 | FileInfo info = new FileInfo(file); |
47 | + | |
35 | 48 | foreach (AlternateDataStreamInfo alt in info.ListAlternateDataStreams()) |
36 | 49 | { |
37 | 50 | fs = alt.Open(FileMode.Open); |
@@ -39,18 +52,14 @@ namespace CompleteEraser | ||
39 | 52 | fs.Close(); |
40 | 53 | } |
41 | 54 | |
42 | - fs = new FileStream(file, FileMode.Open,FileAccess.Write,FileShare.None,8,FileOptions.WriteThrough); | |
55 | + string ext = Path.GetExtension(file); | |
56 | + | |
57 | + fs = new FileStream(file, FileMode.Open, FileAccess.Write, FileShare.None, 8, FileOptions.WriteThrough); | |
43 | 58 | if (Settings.Default.AlwaysSlowSpeed || Settings.Default.SlowSpeedExt.IndexOf(ext) != -1) |
44 | 59 | BreakFileSlowSpeed(fs); |
45 | 60 | else |
46 | 61 | BreakFileHiSpeed(fs); |
47 | 62 | fs.Close(); |
48 | - | |
49 | - string newFile = GenerateRandoName(Path.GetDirectoryName(file), Path.GetFileName(file).Length); | |
50 | - if(File.Exists(newFile) == false) | |
51 | - File.Move(file, newFile); | |
52 | - | |
53 | - File.Delete(newFile); | |
54 | 63 | } |
55 | 64 | |
56 | 65 | private static void BreakFileSlowSpeed(FileStream fs) |
@@ -76,12 +85,16 @@ namespace CompleteEraser | ||
76 | 85 | |
77 | 86 | public static void BreakFolder(string folder) |
78 | 87 | { |
79 | - IEnumerable<string> files = Directory.EnumerateFiles(folder, "*.*", SearchOption.TopDirectoryOnly); | |
80 | - foreach (string file in files) | |
81 | - BreakFile(file); | |
82 | - IEnumerable<string> dirs = Directory.EnumerateDirectories(folder, "*.*", SearchOption.TopDirectoryOnly); | |
83 | - foreach (string dir in dirs) | |
84 | - BreakFolder(dir); | |
88 | + DirectoryInfo info = new DirectoryInfo(folder); | |
89 | + if ((info.Attributes & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint) | |
90 | + { | |
91 | + IEnumerable<string> files = Directory.EnumerateFiles(folder, "*.*", SearchOption.TopDirectoryOnly); | |
92 | + foreach (string file in files) | |
93 | + BreakFile(file); | |
94 | + IEnumerable<string> dirs = Directory.EnumerateDirectories(folder, "*.*", SearchOption.TopDirectoryOnly); | |
95 | + foreach (string dir in dirs) | |
96 | + BreakFolder(dir); | |
97 | + } | |
85 | 98 | string newName = RenameFolderName(folder); |
86 | 99 | Directory.Delete(newName); |
87 | 100 | } |
@@ -5,6 +5,8 @@ | ||
5 | 5 | |
6 | 6 | ■制限事項 |
7 | 7 | ・MFTレコードに収まるファイルの場合、完全に削除されないことがあります |
8 | +・スパースファイル、リパースポイントとして作成されたファイルに対してゼロフィルは行いません | |
9 | +・リパースポイントとして作成されたフォルダーは適当な名前にリネーム後、リパースポイントのみを削除します | |
8 | 10 | |
9 | 11 | ■アルゴリズム |
10 | 12 | ファイルを完全に削除したい場合、ファイルの内容を適当な文字で埋めてしまうのが一般的です |
@@ -25,4 +27,4 @@ A.2001 | ||
25 | 27 | |
26 | 28 | ■連絡先 |
27 | 29 | サポートや新バージョンのリリースは以下のサイトで行っております |
28 | -http://sourceforge.jp/projects/completeeraser | |
\ No newline at end of file | ||
30 | +http://sourceforge.jp/projects/completeeraser |