1
1
namespace Hexa . NET . ImGui . Widgets . Dialogs
2
2
{
3
3
using Hexa . NET . Utilities ;
4
- using Microsoft . CodeAnalysis ;
5
4
using System ;
6
5
using System . Collections . Generic ;
7
- using System . Diagnostics . CodeAnalysis ;
8
6
using System . IO ;
9
- using System . Reflection ;
10
7
using System . Runtime . CompilerServices ;
11
8
using System . Runtime . InteropServices ;
12
9
using System . Text ;
@@ -20,6 +17,10 @@ public static long GetFileSize(string filePath)
20
17
{
21
18
return GetFileMetadataWindows ( filePath ) . Size ;
22
19
}
20
+ else if ( RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) )
21
+ {
22
+ return GetFileMetadataOSX ( filePath ) . Size ;
23
+ }
23
24
else
24
25
{
25
26
return GetFileMetadataUnix ( filePath ) . Size ;
@@ -32,6 +33,10 @@ public static FileMetadata GetFileMetadata(string filePath)
32
33
{
33
34
return GetFileMetadataWindows ( filePath ) ;
34
35
}
36
+ else if ( RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) )
37
+ {
38
+ return GetFileMetadataOSX ( filePath ) ;
39
+ }
35
40
else
36
41
{
37
42
return GetFileMetadataUnix ( filePath ) ;
@@ -44,12 +49,49 @@ public static IEnumerable<FileMetadata> EnumerateEntries(string path, string pat
44
49
{
45
50
return EnumerateEntriesWin ( path , pattern , option ) ;
46
51
}
52
+ else if ( RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) )
53
+ {
54
+ return EnumerateEntriesOSX ( path , pattern , option ) ;
55
+ }
47
56
else
48
57
{
49
58
return EnumerateEntriesUnix ( path , pattern , option ) ;
50
59
}
51
60
}
52
61
62
+ public static readonly char DirectorySeparatorChar = Path . DirectorySeparatorChar ;
63
+ public static readonly char AltDirectorySeparatorChar = Path . AltDirectorySeparatorChar ;
64
+
65
+ public static void CorrectPath ( StdString str )
66
+ {
67
+ byte * ptr = str . Data ;
68
+ byte * end = ptr + str . Size ;
69
+ while ( ptr != end )
70
+ {
71
+ byte c = * ptr ;
72
+ if ( c == '/' || c == '\\ ' )
73
+ {
74
+ * ptr = ( byte ) DirectorySeparatorChar ;
75
+ }
76
+ ptr ++ ;
77
+ }
78
+ }
79
+
80
+ public static void CorrectPath ( StdWString str )
81
+ {
82
+ char * ptr = str . Data ;
83
+ char * end = ptr + str . Size ;
84
+ while ( ptr != end )
85
+ {
86
+ char c = * ptr ;
87
+ if ( c == '/' || c == '\\ ' )
88
+ {
89
+ * ptr = DirectorySeparatorChar ;
90
+ }
91
+ ptr ++ ;
92
+ }
93
+ }
94
+
53
95
#region WIN32
54
96
55
97
public static IEnumerable < FileMetadata > EnumerateEntriesWin ( string path , string pattern , SearchOption option )
@@ -60,6 +102,7 @@ public static IEnumerable<FileMetadata> EnumerateEntriesWin(string path, string
60
102
StdWString str = path ;
61
103
str . Append ( '\\ ' ) ;
62
104
str . Append ( '*' ) ;
105
+ CorrectPath ( str ) ;
63
106
walkStack . Push ( str ) ;
64
107
}
65
108
@@ -129,19 +172,24 @@ private static nint StartSearch(StdWString st, out WIN32_FIND_DATA data)
129
172
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
130
173
private static FileMetadata Convert ( WIN32_FIND_DATA data , StdWString path )
131
174
{
132
- FileMetadata metadata = new ( ) ;
133
175
int length = StrLen ( data . cFileName ) ;
134
- StdWString str = new ( length + path . Size + 1 ) ;
135
- for ( int i = 0 ; i < path . Size - 1 ; i ++ )
176
+ StdWString str ;
177
+ if ( path [ path . Size - 1 ] != '/' || path [ path . Size - 1 ] != ' \\ ' )
136
178
{
137
- str . Append ( path [ i ] ) ;
179
+ str = new ( length + 1 + path . Size ) ;
180
+ str . Append ( path ) ;
181
+ str . Append ( '/' ) ;
182
+ str . Append ( data . cFileName , length ) ;
138
183
}
139
-
140
- for ( int i = 0 ; i < length ; i ++ )
184
+ else
141
185
{
142
- str . Append ( data . cFileName [ i ] ) ;
186
+ str = new ( length + path . Size ) ;
187
+ str . Append ( path ) ;
188
+ str . Append ( data . cFileName , length ) ;
143
189
}
190
+ * ( str . Data + str . Size ) = '\0 ' ;
144
191
192
+ FileMetadata metadata = new ( ) ;
145
193
metadata . Path = str ;
146
194
metadata . CreationTime = DateTime . FromFileTime ( data . ftCreationTime ) ;
147
195
metadata . LastAccessTime = DateTime . FromFileTime ( data . ftLastAccessTime ) ;
@@ -498,8 +546,10 @@ public bool ShouldIgnore()
498
546
499
547
public static IEnumerable < FileMetadata > EnumerateEntriesUnix ( string path , string pattern , SearchOption option )
500
548
{
549
+ StdString str = path ;
550
+ CorrectPath ( str ) ;
501
551
UnsafeStack < StdString > walkStack = new ( ) ;
502
- walkStack . Push ( path ) ;
552
+ walkStack . Push ( str ) ;
503
553
504
554
while ( walkStack . TryPop ( out var dir ) )
505
555
{
@@ -555,17 +605,26 @@ private static bool TryReadDir(nint dirHandle, out DirEnt dirEnt)
555
605
556
606
private static FileMetadata Convert ( DirEnt entry , StdString path )
557
607
{
558
- MemoryDump ( & entry ) ;
559
608
int length = NET . Utilities . Utils . StrLen ( entry . d_name ) ;
560
- StdWString str = new ( path . Size + 1 + length ) ;
561
- str . Append ( path ) ;
562
- str . Append ( '/' ) ;
563
- str . Append ( entry . d_name ) ;
609
+ StdWString str ;
610
+ if ( path . Data [ path . Size - 1 ] != '/' )
611
+ {
612
+ str = new ( path . Size + 1 + length ) ;
613
+ str . Append ( path ) ;
614
+ str . Append ( '/' ) ;
615
+ str . Append ( entry . d_name ) ;
616
+ }
617
+ else
618
+ {
619
+ str = new ( path . Size + length ) ;
620
+ str . Append ( path ) ;
621
+ str . Append ( entry . d_name ) ;
622
+ }
564
623
* ( str . Data + str . Size ) = '\0 ' ;
565
- FileMetadata meta = new ( ) ;
566
- meta . Path = str ;
567
624
625
+ FileMetadata meta = default ;
568
626
FileStat ( str , out var stat ) ;
627
+ meta . Path = str ;
569
628
meta . CreationTime = DateTimeOffset . FromUnixTimeSeconds ( stat . StCtime ) . LocalDateTime . AddTicks ( ( long ) ( stat . StCtimensec / 100 ) ) ;
570
629
meta . LastAccessTime = DateTimeOffset . FromUnixTimeSeconds ( stat . StAtime ) . LocalDateTime . AddTicks ( ( long ) ( stat . StAtimensec / 100 ) ) ;
571
630
meta . LastWriteTime = DateTimeOffset . FromUnixTimeSeconds ( stat . StMtime ) . LocalDateTime . AddTicks ( ( long ) ( stat . StMtimensec / 100 ) ) ;
@@ -773,8 +832,10 @@ public bool ShouldIgnore()
773
832
774
833
public static IEnumerable < FileMetadata > EnumerateEntriesOSX ( string path , string pattern , SearchOption option )
775
834
{
835
+ StdString str = path ;
836
+ CorrectPath ( str ) ;
776
837
UnsafeStack < StdString > walkStack = new ( ) ;
777
- walkStack . Push ( path ) ;
838
+ walkStack . Push ( str ) ;
778
839
779
840
while ( walkStack . TryPop ( out var dir ) )
780
841
{
@@ -832,10 +893,21 @@ private static bool OSXTryReadDir(nint dirHandle, out OSXDirEnt dirEnt)
832
893
private static FileMetadata OSXConvert ( OSXDirEnt entry , StdString path )
833
894
{
834
895
int length = entry . d_namlen ;
835
- StdWString str = new ( path . Size + 1 + length ) ;
836
- str . Append ( path ) ;
837
- str . Append ( '/' ) ;
838
- str . Append ( entry . d_name , length ) ;
896
+ StdWString str ;
897
+ if ( path . Data [ path . Size - 1 ] != '/' )
898
+ {
899
+ str = new ( path . Size + 1 + length ) ;
900
+ str . Append ( path ) ;
901
+ str . Append ( '/' ) ;
902
+ str . Append ( entry . d_name , length ) ;
903
+ }
904
+ else
905
+ {
906
+ str = new ( path . Size + length ) ;
907
+ str . Append ( path ) ;
908
+ str . Append ( entry . d_name , length ) ;
909
+ }
910
+
839
911
* ( str . Data + str . Size ) = '\0 ' ;
840
912
841
913
FileMetadata meta = default ;
0 commit comments