回答編集履歴

3

修正

2020/08/21 15:46

投稿

YAmaGNZ
YAmaGNZ

スコア10259

test CHANGED
@@ -70,7 +70,7 @@
70
70
 
71
71
  // もし、列挙するがその下の検索はしないのであれば、Listに追加のみとし、再帰で呼ばないようにする
72
72
 
73
- if ((File.GetAttributes(folder) & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint)
73
+ if (!File.GetAttributes(folder).HasFlag(FileAttributes.ReparsePoint))
74
74
 
75
75
  {
76
76
 

2

シンボリックリンクの回避について追記

2020/08/21 15:46

投稿

YAmaGNZ
YAmaGNZ

スコア10259

test CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
 
4
4
 
5
- 追記
5
+ ### 追記
6
+
7
+
6
8
 
7
9
  自然順のソートなのであれば
8
10
 
@@ -43,3 +45,53 @@
43
45
  ```
44
46
 
45
47
  といった感じで`StrCmpLogicalW`を利用してのソートですかね
48
+
49
+
50
+
51
+ ### さらに追記
52
+
53
+
54
+
55
+ シンボリックリンクを回避するとなると
56
+
57
+ ```C#
58
+
59
+ public void GetSubfolders(string folderName, ref List<string> subFolders)
60
+
61
+ {
62
+
63
+ //folderNameにあるサブフォルダを取得
64
+
65
+ foreach (string folder in GetDirectories(folderName))
66
+
67
+ {
68
+
69
+ // シンボリックリンクの場合は属性がFileAttributes.ReparsePointとなるので除外
70
+
71
+ // もし、列挙するがその下の検索はしないのであれば、Listに追加のみとし、再帰で呼ばないようにする
72
+
73
+ if ((File.GetAttributes(folder) & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint)
74
+
75
+ {
76
+
77
+ //リストに追加
78
+
79
+ subFolders.Add(folder);
80
+
81
+ //再帰的にサブフォルダを取得する
82
+
83
+ GetSubfolders(folder, ref subFolders);
84
+
85
+ }
86
+
87
+
88
+
89
+ }
90
+
91
+ }
92
+
93
+
94
+
95
+ ```
96
+
97
+ このように直下のフォルダのみを列挙し、1つづつ属性をチェックしながら再帰呼び出しを行うのがいいのではないでしょうか

1

追記

2020/08/21 15:33

投稿

YAmaGNZ
YAmaGNZ

スコア10259

test CHANGED
@@ -1 +1,45 @@
1
1
  EnumerateDirectoriesでサブフォルダまで全て列挙するのではなく、直下のフォルダのみ列挙する関数を再帰呼び出しするのはどうでしょう?
2
+
3
+
4
+
5
+ 追記
6
+
7
+ 自然順のソートなのであれば
8
+
9
+ ```C#
10
+
11
+ IEnumerable<string> subFolders = System.IO.Directory.EnumerateDirectories(@"C:\フォルダー", "*", System.IO.SearchOption.AllDirectories);
12
+
13
+ subFolders = subFolders.OrderBy(f => f, new NaturalStringComparer());
14
+
15
+
16
+
17
+
18
+
19
+ public class NaturalStringComparer : IComparer<string>
20
+
21
+ {
22
+
23
+ [System.Runtime.InteropServices.DllImport("shlwapi.dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode, ExactSpelling = true)]
24
+
25
+ private static extern int StrCmpLogicalW(string x, string y);
26
+
27
+
28
+
29
+ public int Compare(string x, string y)
30
+
31
+ {
32
+
33
+ return StrCmpLogicalW(x, y);
34
+
35
+ }
36
+
37
+
38
+
39
+ }
40
+
41
+
42
+
43
+ ```
44
+
45
+ といった感じで`StrCmpLogicalW`を利用してのソートですかね