9
9
10
10
namespace Files . App . Storage
11
11
{
12
- [ DebuggerDisplay ( "{" + nameof ( ToString ) + "()" ) ]
13
- public sealed class WindowsFolder : WindowsStorable , IChildFolder , IDisposable
12
+ [ DebuggerDisplay ( "{" + nameof ( ToString ) + "()} " ) ]
13
+ public sealed class WindowsFolder : WindowsStorable , IChildFolder
14
14
{
15
15
public WindowsFolder ( ComPtr < IShellItem > nativeObject )
16
16
{
@@ -26,81 +26,64 @@ public unsafe WindowsFolder(IShellItem* nativeObject)
26
26
27
27
public unsafe WindowsFolder ( Guid folderId )
28
28
{
29
- Guid folderIdLocal = folderId ;
30
- Guid IID_IShellItem = IShellItem . IID_Guid ;
31
29
ComPtr < IShellItem > pItem = default ;
32
30
33
- HRESULT hr = PInvoke . SHGetKnownFolderItem ( & folderIdLocal , KNOWN_FOLDER_FLAG . KF_FLAG_DEFAULT , HANDLE . Null , & IID_IShellItem , ( void * * ) pItem . GetAddressOf ( ) ) ;
34
- if ( hr . Succeeded )
31
+ HRESULT hr = PInvoke . SHGetKnownFolderItem ( & folderId , KNOWN_FOLDER_FLAG . KF_FLAG_DEFAULT , HANDLE . Null , IID . IID_IShellItem , ( void * * ) pItem . GetAddressOf ( ) ) ;
32
+ if ( hr . Failed )
35
33
{
36
- ThisPtr = pItem ;
37
- return ;
38
- }
34
+ fixed ( char * pszShellPath = $ "Shell:::{ folderId : B} ")
35
+ hr = PInvoke . SHCreateItemFromParsingName ( pszShellPath , null , IID . IID_IShellItem , ( void * * ) pItem . GetAddressOf ( ) ) ;
39
36
40
- fixed ( char * pszShellPath = $ "Shell:::{ folderId : B} ")
41
- hr = PInvoke . SHCreateItemFromParsingName ( pszShellPath , null , & IID_IShellItem , ( void * * ) pItem . GetAddressOf ( ) ) ;
42
- if ( hr . Succeeded )
43
- {
44
- ThisPtr = pItem ;
45
- return ;
37
+ // Invalid FOLDERID; this should never happen.
38
+ hr . ThrowOnFailure ( ) ;
46
39
}
40
+
41
+ ThisPtr = pItem ;
47
42
}
48
43
49
- public async IAsyncEnumerable < IStorableChild > GetItemsAsync ( StorableType type = StorableType . All , [ EnumeratorCancellation ] CancellationToken cancellationToken = default )
44
+ public IAsyncEnumerable < IStorableChild > GetItemsAsync ( StorableType type = StorableType . All , CancellationToken cancellationToken = default )
50
45
{
51
- using ComPtr < IEnumShellItems > pEnumShellItems = GetEnumShellItems ( ) ;
52
- while ( GetNext ( pEnumShellItems ) is { } pShellItem && ! pShellItem . IsNull )
53
- {
54
- cancellationToken . ThrowIfCancellationRequested ( ) ;
46
+ return GetItems ( ) . ToAsyncEnumerable ( ) ;
55
47
56
- var pShellFolder = pShellItem . As < IShellFolder > ( ) ;
57
- var isFolder = IsFolder ( pShellItem ) ;
48
+ unsafe IEnumerable < IStorableChild > GetItems ( )
49
+ {
50
+ ComPtr < IEnumShellItems > pEnumShellItems = default ;
51
+ GetEnumerator ( ) ;
58
52
59
- if ( type is StorableType . File && ! isFolder )
53
+ ComPtr < IShellItem > pShellItem = default ;
54
+ while ( GetNext ( ) && ! pShellItem . IsNull )
60
55
{
61
- yield return new WindowsFile ( pShellItem ) ;
56
+ cancellationToken . ThrowIfCancellationRequested ( ) ;
57
+ var isFolder = pShellItem . HasShellAttributes ( SFGAO_FLAGS . SFGAO_FOLDER ) ;
58
+
59
+ if ( type is StorableType . File && ! isFolder )
60
+ {
61
+ yield return new WindowsFile ( pShellItem ) ;
62
+ }
63
+ else if ( type is StorableType . Folder && isFolder )
64
+ {
65
+ yield return new WindowsFolder ( pShellItem ) ;
66
+ }
67
+ else
68
+ {
69
+ continue ;
70
+ }
62
71
}
63
- else if ( type is StorableType . Folder && isFolder )
72
+
73
+ yield break ;
74
+
75
+ unsafe void GetEnumerator ( )
64
76
{
65
- yield return new WindowsFile ( pShellItem ) ;
77
+ HRESULT hr = ThisPtr . Get ( ) ->BindToHandler ( null , BHID . BHID_EnumItems , IID . IID_IEnumShellItems , ( void * * ) pEnumShellItems . GetAddressOf ( ) ) ;
78
+ hr . ThrowIfFailedOnDebug ( ) ;
66
79
}
67
- else
80
+
81
+ unsafe bool GetNext ( )
68
82
{
69
- continue ;
83
+ HRESULT hr = pEnumShellItems . Get ( ) ->Next ( 1 , pShellItem . GetAddressOf ( ) ) ;
84
+ return hr . ThrowIfFailedOnDebug ( ) == HRESULT . S_OK ;
70
85
}
71
-
72
- await Task . Yield ( ) ;
73
86
}
74
-
75
- unsafe ComPtr < IEnumShellItems > GetEnumShellItems ( )
76
- {
77
- ComPtr < IEnumShellItems > pEnumShellItems = default ;
78
- Guid IID_IEnumShellItems = typeof ( IEnumShellItems ) . GUID ;
79
- Guid BHID_EnumItems = PInvoke . BHID_EnumItems ;
80
- HRESULT hr = ThisPtr . Get ( ) ->BindToHandler ( null , & BHID_EnumItems , & IID_IEnumShellItems , ( void * * ) pEnumShellItems . GetAddressOf ( ) ) ;
81
- return pEnumShellItems ;
82
- }
83
-
84
- unsafe ComPtr < IShellItem > GetNext ( ComPtr < IEnumShellItems > pEnumShellItems )
85
- {
86
- ComPtr < IShellItem > pShellItem = default ;
87
- HRESULT hr = pEnumShellItems . Get ( ) ->Next ( 1 , pShellItem . GetAddressOf ( ) ) ;
88
- return pShellItem ;
89
- }
90
-
91
- unsafe bool IsFolder ( ComPtr < IShellItem > pShellItem )
92
- {
93
- return pShellItem . Get ( ) ->GetAttributes ( SFGAO_FLAGS . SFGAO_FOLDER , out var specifiedAttribute ) . Succeeded &&
94
- specifiedAttribute is SFGAO_FLAGS . SFGAO_FOLDER ;
95
- }
96
- }
97
-
98
- // Disposer
99
-
100
- /// <inheritdoc/>
101
- public void Dispose ( )
102
- {
103
- ThisPtr . Dispose ( ) ;
104
87
}
105
88
}
106
89
}
0 commit comments