teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

修正

2020/08/21 15:46

投稿

YAmaGNZ
YAmaGNZ

スコア10654

answer CHANGED
@@ -34,7 +34,7 @@
34
34
  {
35
35
  // シンボリックリンクの場合は属性がFileAttributes.ReparsePointとなるので除外
36
36
  // もし、列挙するがその下の検索はしないのであれば、Listに追加のみとし、再帰で呼ばないようにする
37
- if ((File.GetAttributes(folder) & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint)
37
+ if (!File.GetAttributes(folder).HasFlag(FileAttributes.ReparsePoint))
38
38
  {
39
39
  //リストに追加
40
40
  subFolders.Add(folder);

2

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

2020/08/21 15:46

投稿

YAmaGNZ
YAmaGNZ

スコア10654

answer CHANGED
@@ -1,6 +1,7 @@
1
1
  EnumerateDirectoriesでサブフォルダまで全て列挙するのではなく、直下のフォルダのみ列挙する関数を再帰呼び出しするのはどうでしょう?
2
2
 
3
- 追記
3
+ ### 追記
4
+
4
5
  自然順のソートなのであれば
5
6
  ```C#
6
7
  IEnumerable<string> subFolders = System.IO.Directory.EnumerateDirectories(@"C:\フォルダー", "*", System.IO.SearchOption.AllDirectories);
@@ -20,4 +21,29 @@
20
21
  }
21
22
 
22
23
  ```
23
- といった感じで`StrCmpLogicalW`を利用してのソートですかね
24
+ といった感じで`StrCmpLogicalW`を利用してのソートですかね
25
+
26
+ ### さらに追記
27
+
28
+ シンボリックリンクを回避するとなると
29
+ ```C#
30
+ public void GetSubfolders(string folderName, ref List<string> subFolders)
31
+ {
32
+ //folderNameにあるサブフォルダを取得
33
+ foreach (string folder in GetDirectories(folderName))
34
+ {
35
+ // シンボリックリンクの場合は属性がFileAttributes.ReparsePointとなるので除外
36
+ // もし、列挙するがその下の検索はしないのであれば、Listに追加のみとし、再帰で呼ばないようにする
37
+ if ((File.GetAttributes(folder) & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint)
38
+ {
39
+ //リストに追加
40
+ subFolders.Add(folder);
41
+ //再帰的にサブフォルダを取得する
42
+ GetSubfolders(folder, ref subFolders);
43
+ }
44
+
45
+ }
46
+ }
47
+
48
+ ```
49
+ このように直下のフォルダのみを列挙し、1つづつ属性をチェックしながら再帰呼び出しを行うのがいいのではないでしょうか

1

追記

2020/08/21 15:33

投稿

YAmaGNZ
YAmaGNZ

スコア10654

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