Skip to content

Commit bc0ac62

Browse files
Use FileStream to remove internal buffer allocations
1 parent cd171c2 commit bc0ac62

2 files changed

Lines changed: 29 additions & 3 deletions

File tree

src/ImageSharp.Web/Resolvers/PhysicalFileSystemCacheResolver.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public PhysicalFileSystemCacheResolver(FileInfo metaFileInfo, FormatUtilities fo
3232
/// <inheritdoc/>
3333
public async Task<ImageCacheMetadata> GetMetaDataAsync()
3434
{
35-
using Stream stream = this.metaFileInfo.OpenRead();
35+
using Stream stream = OpenFileStream(this.metaFileInfo.FullName);
3636
this.metadata = await ImageCacheMetadata.ReadAsync(stream);
3737
return this.metadata;
3838
}
@@ -44,7 +44,21 @@ public Task<Stream> OpenReadAsync()
4444
this.metaFileInfo.FullName,
4545
this.formatUtilities.GetExtensionFromContentType(this.metadata.ContentType));
4646

47-
return Task.FromResult<Stream>(File.OpenRead(path));
47+
return Task.FromResult(OpenFileStream(path));
48+
}
49+
50+
private static Stream OpenFileStream(string path)
51+
{
52+
// We are setting buffer size to 1 to prevent FileStream from allocating it's internal buffer
53+
// 0 causes constructor to throw
54+
int bufferSize = 1;
55+
return new FileStream(
56+
path,
57+
FileMode.Open,
58+
FileAccess.Read,
59+
FileShare.ReadWrite,
60+
bufferSize,
61+
FileOptions.Asynchronous | FileOptions.SequentialScan);
4862
}
4963
}
5064
}

src/ImageSharp.Web/Resolvers/PhysicalFileSystemResolver.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,18 @@ public PhysicalFileSystemResolver(FileInfo fileInfo, in ImageMetadata metadata)
2929
public Task<ImageMetadata> GetMetaDataAsync() => Task.FromResult(this.metadata);
3030

3131
/// <inheritdoc/>
32-
public Task<Stream> OpenReadAsync() => Task.FromResult<Stream>(this.fileInfo.OpenRead());
32+
public Task<Stream> OpenReadAsync()
33+
{
34+
// We are setting buffer size to 1 to prevent FileStream from allocating it's internal buffer
35+
// 0 causes constructor to throw
36+
int bufferSize = 1;
37+
return Task.FromResult<Stream>(new FileStream(
38+
this.fileInfo.FullName,
39+
FileMode.Open,
40+
FileAccess.Read,
41+
FileShare.ReadWrite,
42+
bufferSize,
43+
FileOptions.Asynchronous | FileOptions.SequentialScan));
44+
}
3345
}
3446
}

0 commit comments

Comments
 (0)