Skip to content

Commit a483996

Browse files
committed
Added FileIO-like methods to BaseStorageFile
1 parent be35a17 commit a483996

File tree

4 files changed

+41
-19
lines changed

4 files changed

+41
-19
lines changed

Files/Extensions/ShellNewEntryExtensions.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,8 @@ public static async Task<FilesystemResult<BaseStorageFile>> Create(this ShellNew
8585
{
8686
if (shellEntry.Data != null)
8787
{
88-
//await FileIO.WriteBytesAsync(createdFile.Result, this.Data); // Calls unsupported OpenTransactedWriteAsync
89-
using (var fileStream = await createdFile.Result.OpenStreamForWriteAsync())
90-
{
91-
await fileStream.WriteAsync(shellEntry.Data, 0, shellEntry.Data.Length);
92-
await fileStream.FlushAsync();
93-
}
88+
//await FileIO.WriteBytesAsync(createdFile.Result, shellEntry.Data); // Calls unsupported OpenTransactedWriteAsync
89+
await createdFile.Result.WriteBytesAsync(shellEntry.Data);
9490
}
9591
}
9692
return createdFile;

Files/Filesystem/StorageItems/BaseStorageItem.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Collections.Generic;
44
using System.Linq;
55
using System.Runtime.InteropServices.WindowsRuntime;
6+
using System.Text;
67
using System.Threading.Tasks;
78
using Windows.Foundation;
89
using Windows.Foundation.Metadata;
@@ -461,5 +462,40 @@ StorageItemContentProperties IStorageItemProperties.Properties
461462
return null;
462463
}
463464
}
465+
466+
public async Task<string> ReadTextAsync(int maxLength = -1)
467+
{
468+
using var inputStream = await OpenSequentialReadAsync();
469+
using var dataReader = new DataReader(inputStream);
470+
StringBuilder builder = new StringBuilder();
471+
uint bytesRead, bytesToRead;
472+
do
473+
{
474+
bytesToRead = maxLength < 0 ? 4096 : (uint)Math.Min(maxLength, 4096);
475+
bytesRead = await dataReader.LoadAsync(bytesToRead);
476+
builder.Append(dataReader.ReadString(bytesRead));
477+
} while (bytesRead > 0);
478+
return builder.ToString();
479+
}
480+
481+
public async Task WriteTextAsync(string text)
482+
{
483+
using var stream = await OpenAsync(FileAccessMode.ReadWrite, StorageOpenOptions.AllowOnlyReaders);
484+
using var outputStream = stream.GetOutputStreamAt(0);
485+
using var dataWriter = new DataWriter(outputStream);
486+
dataWriter.WriteString(text);
487+
await dataWriter.StoreAsync();
488+
await stream.FlushAsync();
489+
}
490+
491+
public async Task WriteBytesAsync(byte[] dataBytes)
492+
{
493+
using var stream = await OpenAsync(FileAccessMode.ReadWrite, StorageOpenOptions.AllowOnlyReaders);
494+
using var outputStream = stream.GetOutputStreamAt(0);
495+
using var dataWriter = new DataWriter(outputStream);
496+
dataWriter.WriteBytes(dataBytes);
497+
await dataWriter.StoreAsync();
498+
await stream.FlushAsync();
499+
}
464500
}
465501
}

Files/Filesystem/StorageItems/StreamWithContentType.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,8 @@ public NonSeekableRandomAccessStream(Stream baseStream, ulong size)
120120

121121
public IInputStream GetInputStreamAt(ulong position)
122122
{
123-
throw new NotSupportedException();
123+
Seek(position);
124+
return this;
124125
}
125126

126127
public IOutputStream GetOutputStreamAt(ulong position)

Files/ViewModels/Previews/BasePreviewModel.cs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -153,18 +153,7 @@ public override Task<List<FileProperty>> LoadPreviewAndDetails()
153153

154154
public static async Task<string> ReadFileAsText(BaseStorageFile file, int maxLength = 10 * 1024 * 1024)
155155
{
156-
using (var stream = await file.OpenStreamForReadAsync())
157-
{
158-
var result = new StringBuilder();
159-
var bytesRead = 0;
160-
do
161-
{
162-
var buffer = new byte[maxLength];
163-
bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
164-
result.Append(Encoding.UTF8.GetString(buffer, 0, bytesRead));
165-
} while (bytesRead > 0 && result.Length <= maxLength);
166-
return result.ToString();
167-
}
156+
return await file.ReadTextAsync(maxLength);
168157
}
169158
}
170159
}

0 commit comments

Comments
 (0)