@@ -74,44 +74,11 @@ public static ValueTask<string> ReadAllTextAsync(this VirtualFile file, Cancella
7474 /// </returns>
7575 public static async ValueTask < string > ReadAllTextAsync ( this VirtualFile file , Encoding ? encoding , CancellationToken cancellationToken = default )
7676 {
77- //
78- // Use a manual read loop since .NET 6 lacks a StreamReader.ReadToEndAsync overload that accepts a CancellationToken.
79- // This ensures the operation remains responsive to cancellation requests.
80- //
81-
82- const int BufferSize = 4096 ;
83-
8477 // ReSharper disable once UseAwaitUsing
8578 using var stream = await file . OpenReadAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
86- var reader = new StreamReader ( stream , encoding ??= Encoding . UTF8 ) ;
87- var buffer = ( char [ ] ? ) null ;
88-
89- try
90- {
91- cancellationToken . ThrowIfCancellationRequested ( ) ;
92-
93- buffer = ArrayPool < char > . Shared . Rent ( encoding . GetMaxCharCount ( BufferSize ) ) ;
94- var sb = new StringBuilder ( ) ;
95-
96- while ( true )
97- {
98- var count = await reader
99- . ReadAsync ( new Memory < char > ( buffer ) , cancellationToken )
100- . ConfigureAwait ( false ) ;
101-
102- if ( count == 0 )
103- return sb . ToString ( ) ;
104-
105- sb . Append ( buffer . AsSpan ( 0 , count ) ) ;
106- }
107- }
108- finally
109- {
110- reader . Dispose ( ) ;
79+ using var reader = new StreamReader ( stream , encoding ! ) ;
11180
112- if ( buffer is not null )
113- ArrayPool < char > . Shared . Return ( buffer ) ;
114- }
81+ return await reader . ReadToEndAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
11582 }
11683
11784 /// <summary>
@@ -142,11 +109,8 @@ public static async ValueTask<string[]> ReadAllLinesAsync(this VirtualFile file,
142109 using var reader = new StreamReader ( stream , encoding ! ) ;
143110
144111 var list = new List < string > ( ) ;
145- while ( await reader . ReadLineAsync ( ) . ConfigureAwait ( false ) is { } line )
146- {
147- cancellationToken . ThrowIfCancellationRequested ( ) ;
112+ while ( await reader . ReadLineAsync ( cancellationToken ) . ConfigureAwait ( false ) is { } line )
148113 list . Add ( line ) ;
149- }
150114
151115 return list . ToArray ( ) ;
152116 }
@@ -165,7 +129,7 @@ public static async ValueTask<byte[]> ReadAllBytesAsync(this VirtualFile file, C
165129 // ReSharper disable once UseAwaitUsing
166130 using var stream = await file . OpenReadAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
167131
168- var length = GetStreamLength ( stream ) ;
132+ var length = stream . CanSeek ? stream . Length : 0 ;
169133 if ( length > Array . MaxLength )
170134 throw new IOException ( "The file is too large." ) ;
171135
@@ -179,15 +143,15 @@ static async ValueTask<byte[]> ReadAllBytesImplAsync(Stream stream, Cancellation
179143 {
180144 var bytes = new byte [ stream . Length ] ;
181145 var index = 0 ;
146+
182147 do
183148 {
184149 var count = await stream . ReadAsync ( bytes . AsMemory ( index ) , cancellationToken ) . ConfigureAwait ( false ) ;
185150 if ( count == 0 )
186151 Error_EndOfStream ( ) ;
187152
188153 index += count ;
189- }
190- while ( index < bytes . Length ) ;
154+ } while ( index < bytes . Length ) ;
191155
192156 return bytes ;
193157 }
@@ -225,29 +189,11 @@ static byte[] ResizeBuffer(byte[] oldArray)
225189 var newArray = ArrayPool < byte > . Shared . Rent ( ( int ) length ) ;
226190 oldArray . AsSpan ( ) . TryCopyTo ( newArray ) ;
227191
228- var rented = oldArray ;
229- oldArray = newArray ;
230-
231- ArrayPool < byte > . Shared . Return ( rented ) ;
232- return oldArray ;
192+ ArrayPool < byte > . Shared . Return ( oldArray ) ;
193+ return newArray ;
233194 }
234195 }
235196
236- static long GetStreamLength ( Stream stream )
237- {
238- try
239- {
240- if ( stream . CanSeek )
241- return stream . Length ;
242- }
243- catch
244- {
245- // skip
246- }
247-
248- return 0 ;
249- }
250-
251197 static void Error_EndOfStream ( ) =>
252198 throw new EndOfStreamException ( ) ;
253199 }
@@ -334,7 +280,7 @@ public static async ValueTask WriteAllLinesAsync(this VirtualFile file, IEnumera
334280 await using var writer = new StreamWriter ( stream , encoding , bufferSize : - 1 , leaveOpen : false ) ;
335281
336282 foreach ( var line in contents )
337- await writer . WriteLineAsync ( line ) . ConfigureAwait ( false ) ;
283+ await writer . WriteLineAsync ( line . AsMemory ( ) , cancellationToken ) . ConfigureAwait ( false ) ;
338284 }
339285
340286 /// <summary>
0 commit comments