From 5167a67e8f93b24c22e5add29f2eba07f2e710c8 Mon Sep 17 00:00:00 2001 From: rameel Date: Wed, 1 Apr 2026 18:10:17 +0500 Subject: [PATCH] Polish XML comments and fix typos --- REVIEW.md | 255 ++++++++++++++++++ .../VirtualFile.cs | 24 +- .../VirtualFileExtensions.cs | 2 +- .../VirtualFileSystemExtensions.cs | 30 ++- .../VirtualNode.cs | 4 +- .../AmazonS3FileSystem.cs | 4 +- src/Ramstack.FileSystem.Amazon/S3File.cs | 2 +- .../S3UploadStream.cs | 4 +- src/Ramstack.FileSystem.Azure/AzureFile.cs | 2 +- .../CompositeFile.cs | 2 +- src/Ramstack.FileSystem.Google/GcsFile.cs | 2 +- .../PhysicalFileSystem.cs | 2 +- .../PrefixedFile.cs | 2 +- src/Ramstack.FileSystem.Sub/SubFile.cs | 2 +- 14 files changed, 297 insertions(+), 40 deletions(-) create mode 100644 REVIEW.md diff --git a/REVIEW.md b/REVIEW.md new file mode 100644 index 0000000..642a8b4 --- /dev/null +++ b/REVIEW.md @@ -0,0 +1,255 @@ +# Code Review: Ramstack.FileSystem + +## Обзор + +Результаты полного code review библиотеки Ramstack.FileSystem. +Документ служит планом работ по исправлению найденных проблем. + +--- + +## 1. Баги и проблемы в коде + +### 1.1 Отсутствие проверки отмены в цикле `WriteAllLinesAsync` + +**Файл:** `src/Ramstack.FileSystem.Abstractions/VirtualFileExtensions.cs`, строки 336–337 +**Серьёзность:** Средняя + +Метод `WriteAllLinesAsync` принимает `CancellationToken`, но не проверяет отмену внутри цикла `foreach`. Это несовместимо с `ReadAllLinesAsync` (строка 147), где `cancellationToken.ThrowIfCancellationRequested()` вызывается корректно. + +**Сейчас:** +```csharp +foreach (var line in contents) + await writer.WriteLineAsync(line).ConfigureAwait(false); +``` + +**Исправление:** +```csharp +foreach (var line in contents) +{ + cancellationToken.ThrowIfCancellationRequested(); + await writer.WriteLineAsync(line).ConfigureAwait(false); +} +``` + +--- + +### 1.2 Некорректная обработка отмены в `AsyncEnumeratorAdapter` + +**Файл:** `src/Ramstack.FileSystem.Abstractions/Utilities/EnumerableExtensions.cs`, строка 51 +**Серьёзность:** Средняя + +`MoveNextAsync` при отмене возвращает `false` вместо выброса `OperationCanceledException`. Это маскирует отмену под нормальное завершение перечисления. + +**Сейчас:** +```csharp +var result = !cancellationToken.IsCancellationRequested && enumerator.MoveNext(); +return new ValueTask(result); +``` + +**Исправление:** +```csharp +cancellationToken.ThrowIfCancellationRequested(); +return new ValueTask(enumerator.MoveNext()); +``` + +--- + +### 1.3 Отсутствие проверки `null` в конструкторе `CompositeFileSystem` + +**Файл:** `src/Ramstack.FileSystem.Composite/CompositeFileSystem.cs`, строки 36–37 +**Серьёзность:** Средняя + +Конструктор, принимающий `IEnumerable`, не проверяет аргумент на `null`, в отличие от `params`-перегрузки (строка 28). + +**Сейчас:** +```csharp +public CompositeFileSystem(IEnumerable fileSystems) => + InternalFileSystems = fileSystems.ToArray(); +``` + +**Исправление:** +```csharp +public CompositeFileSystem(IEnumerable fileSystems) +{ + ArgumentNullException.ThrowIfNull(fileSystems); + InternalFileSystems = fileSystems.ToArray(); +} +``` + +--- + +### 1.4 Отсутствие вызова `base.Dispose(disposing)` в `S3UploadStream` + +**Файл:** `src/Ramstack.FileSystem.Amazon/S3UploadStream.cs`, строки 153–160 +**Серьёзность:** Низкая (для `Stream` — no-op, но нарушение паттерна) + +Метод `Dispose(bool)` делегирует работу `DisposeAsync()`, но не вызывает `base.Dispose(disposing)`. + +**Исправление:** +```csharp +protected override void Dispose(bool disposing) +{ + if (disposing) + { + using var scope = NullSynchronizationContext.CreateScope(); + DisposeAsync().AsTask().Wait(); + } + + base.Dispose(disposing); +} +``` + +--- + +## 2. Опечатки в XML-комментариях + +### 2.1 Дублирование артикля "the" + +**Файл:** `src/Ramstack.FileSystem.Abstractions/VirtualFileSystemExtensions.cs`, строка 192 + +**Сейчас:** `"Asynchronously writes the specified string to the specified the file."` +**Исправление:** `"Asynchronously writes the specified string to the specified file."` + +--- + +### 2.2 Перепутан порядок слов + +**Файл:** `src/Ramstack.FileSystem.Physical/PhysicalFileSystem.cs`, строка 24 + +**Сейчас:** `"The physical path of root the directory."` +**Исправление:** `"The physical path of the root directory."` + +--- + +## 3. Несогласованности в XML-комментариях + +### 3.1 Описание параметра `cancellationToken` + +Основной вариант (подавляющее большинство): `"An optional cancellation token to cancel the operation."` + +Нестандартные варианты, требующие унификации: + +| Файл | Строка | Текущий текст | +|------|--------|--------------| +| `VirtualFileSystemExtensions.cs` | 27 | `"The optional cancellation token used for canceling the operation."` | +| `VirtualFileSystemExtensions.cs` | 40 | `"The optional cancellation token used for canceling the operation."` | +| `VirtualFileSystemExtensions.cs` | 276 | `"A cancellation token to cancel the operation."` | +| `VirtualFileSystemExtensions.cs` | 302 | `"An optional cancellation token to cancel the operation. Defaults to ."` | +| `VirtualFileSystemExtensions.cs` | 316 | `"A token to cancel the operation. Defaults to ."` | +| `VirtualFileSystemExtensions.cs` | 335 | `"A cancellation token to cancel the operation."` | +| `VirtualFileExtensions.cs` | 384 | `"An optional cancellation token to cancel the operation. Defaults to ."` | +| `VirtualNode.cs` | 65 | `"A cancellation token to cancel the operation."` | +| `VirtualNode.cs` | 120 | `"A cancellation token to cancel the operation."` | +| `GcsFile.cs` | 145 | `"A cancellation token to cancel the operation."` | +| `AzureFile.cs` | 120 | `"A cancellation token to cancel the operation."` | +| `S3File.cs` | 137 | `"A cancellation token to cancel the operation."` | +| `S3UploadStream.cs` | 218 | `"A cancellation token to cancel the operation."` | +| `S3UploadStream.cs` | 272 | `"A cancellation token to cancel the operation."` | +| `AmazonS3FileSystem.cs` | 111 | `"A cancellation token to cancel the operation."` | +| `AmazonS3FileSystem.cs` | 122 | `"A cancellation token to cancel the operation."` | + +**Рекомендация:** Унифицировать все до `"An optional cancellation token to cancel the operation."` — без суффикса `"Defaults to..."`. + +--- + +### 3.2 Описание параметра `encoding` + +Три разных варианта: + +| Текст | Файлы и строки | +|-------|----------------| +| `"The character encoding to use."` | `VirtualFileExtensions.cs:29`, `VirtualFileSystemExtensions.cs:39` | +| `"The encoding applied to the contents."` | `VirtualFileExtensions.cs:69,133`, `VirtualFileSystemExtensions.cs:115,142` | +| `"The encoding to apply to the string."` | `VirtualFileExtensions.cs:272,297,326`, `VirtualFileSystemExtensions.cs:183,210,237` | + +**Рекомендация:** Унифицировать до `"The encoding to use."` или разграничить: для чтения — `"The encoding applied to the contents."`, для записи — `"The encoding to apply to the string."`. + +--- + +### 3.3 Использование "should" вместо "will" в remarks + +**Файл:** `src/Ramstack.FileSystem.Abstractions/VirtualFile.cs`, строки 188–190 + +В `VirtualFile.WriteCoreAsync` remarks используют `"should"`: +```xml +If the file does not exist, it should be created. +...the existing file should be overwritten. +...an exception should be thrown. +``` + +В `VirtualFileSystemExtensions.cs` (строки 322–324) аналогичный remarks использует `"will"`: +```xml +If the file does not exist, it will be created. +``` + +**Рекомендация:** Для абстрактного метода (`WriteCoreAsync`) `"should"` может быть допустимо (предписание реализации), но для единообразия лучше использовать `"must"` или `"will"`. + +--- + +### 3.4 Несогласованность `` для async-методов + +**Файл:** `src/Ramstack.FileSystem.Abstractions/VirtualFileSystemExtensions.cs`, строки 29, 42 + +Используется `"A task representing the asynchronous operation and returns..."` — это не стандартный формат и не упоминает `ValueTask`/`Task` через ``. + +Остальные методы используют: +```xml +/// A representing the asynchronous operation. +``` + +**Рекомендация:** Унифицировать до: +```xml +/// A representing the asynchronous operation. +/// The task result contains a that reads from the text file. +``` + +--- + +### 3.5 Описание параметра `file` в обёрточных классах + +Разные формулировки для одного и того же: + +| Файл | Текст | +|------|-------| +| `CompositeFile.cs:21` | `"The to wrap."` | +| `GlobbingFile.cs:21` | `"The instance to wrap."` | +| `ReadonlyFile.cs:18` | `"The instance to wrap."` | +| `PrefixedFile.cs:20` | `"The underlying that this instance wraps."` | +| `SubFile.cs:19` | `"The underlying instance to wrap."` | + +**Рекомендация:** Унифицировать, например, до `"The instance to wrap."`. + +--- + +### 3.6 Описание параметра `fs` в `VirtualFileSystemExtensions.cs` + +Два варианта: + +| Текст | Строки | +|-------|--------| +| `"The file system to use."` | Большинство методов | +| `"The instance."` | Строки 299, 312 (CopyFileAsync) | + +**Рекомендация:** Унифицировать до `"The file system to use."`. + +--- + +## 4. План работ + +### Приоритет: Высокий +1. Исправить опечатку "the specified the file" (`VirtualFileSystemExtensions.cs:192`) +2. Исправить опечатку "root the directory" (`PhysicalFileSystem.cs:24`) +3. Добавить `cancellationToken.ThrowIfCancellationRequested()` в `WriteAllLinesAsync` (`VirtualFileExtensions.cs:336`) +4. Исправить `AsyncEnumeratorAdapter.MoveNextAsync` — бросать `OperationCanceledException` вместо возврата `false` (`EnumerableExtensions.cs:51`) +5. Добавить `ArgumentNullException.ThrowIfNull` в конструктор `CompositeFileSystem` (`CompositeFileSystem.cs:36`) + +### Приоритет: Средний +6. Унифицировать описания `cancellationToken` (16 мест — см. раздел 3.1) +7. Унифицировать описания `encoding` (12 мест — см. раздел 3.2) +8. Исправить "should" → "will"/"must" в `VirtualFile.cs:188-190` +9. Унифицировать `` для `OpenTextAsync` (`VirtualFileSystemExtensions.cs:29,42`) +10. Унифицировать описания параметра `file` в обёрточных классах (5 мест — см. раздел 3.5) +11. Унифицировать описания параметра `fs` (`VirtualFileSystemExtensions.cs:299,312`) + +### Приоритет: Низкий +12. Добавить `base.Dispose(disposing)` в `S3UploadStream.Dispose` (`S3UploadStream.cs:153`) diff --git a/src/Ramstack.FileSystem.Abstractions/VirtualFile.cs b/src/Ramstack.FileSystem.Abstractions/VirtualFile.cs index 78ff4c6..5db7414 100644 --- a/src/Ramstack.FileSystem.Abstractions/VirtualFile.cs +++ b/src/Ramstack.FileSystem.Abstractions/VirtualFile.cs @@ -72,7 +72,7 @@ public ValueTask OpenWriteAsync(CancellationToken cancellationToken = de /// /// /// If the file does not exist, it will be created. - /// If it exists and is , the existing file will be overwritten. + /// If the file exists and is , the existing file will be overwritten. /// If is and the file exists, an exception will be thrown. /// /// @@ -111,7 +111,7 @@ public ValueTask DeleteAsync(CancellationToken cancellationToken = default) /// /// /// If the file does not exist, it will be created. - /// If it exists and is , the existing file will be overwritten. + /// If the file exists and is , the existing file will be overwritten. /// If is and the file exists, an exception will be thrown. /// /// @@ -137,7 +137,7 @@ public ValueTask CopyToAsync(string destinationPath, bool overwrite, Cancellatio /// /// /// If the file does not exist, it will be created. - /// If it exists and is , the existing file will be overwritten. + /// If the file exists and is , the existing file will be overwritten. /// If is and the file exists, an exception will be thrown. /// /// @@ -185,9 +185,9 @@ public ValueTask CopyToAsync(VirtualFile destination, bool overwrite, Cancellati /// /// /// - /// If the file does not exist, it should be created. - /// If the file exists and is , the existing file should be overwritten. - /// If is and the file exists, an exception should be thrown. + /// If the file does not exist, it must be created. + /// If the file exists and is , the existing file must be overwritten. + /// If is and the file exists, an exception must be thrown. /// /// protected abstract ValueTask WriteCoreAsync(Stream stream, bool overwrite, CancellationToken cancellationToken); @@ -212,9 +212,9 @@ public ValueTask CopyToAsync(VirtualFile destination, bool overwrite, Cancellati /// /// /// - /// If the file does not exist, it will be created. - /// If it exists and is , the existing file will be overwritten. - /// If is and the file exists, an exception will be thrown. + /// If the file does not exist, it must be created. + /// If the file exists and is , the existing file must be overwritten. + /// If is and the file exists, an exception must be thrown. /// /// protected virtual async ValueTask CopyToCoreAsync(string destinationPath, bool overwrite, CancellationToken cancellationToken) @@ -234,9 +234,9 @@ protected virtual async ValueTask CopyToCoreAsync(string destinationPath, bool o /// /// /// - /// If the file does not exist, it will be created. - /// If it exists and is , the existing file will be overwritten. - /// If is and the file exists, an exception will be thrown. + /// If the file does not exist, it must be created. + /// If the file exists and is , the existing file must be overwritten. + /// If is and the file exists, an exception must be thrown. /// /// protected virtual async ValueTask CopyToCoreAsync(VirtualFile destination, bool overwrite, CancellationToken cancellationToken) diff --git a/src/Ramstack.FileSystem.Abstractions/VirtualFileExtensions.cs b/src/Ramstack.FileSystem.Abstractions/VirtualFileExtensions.cs index 2156249..f4018ed 100644 --- a/src/Ramstack.FileSystem.Abstractions/VirtualFileExtensions.cs +++ b/src/Ramstack.FileSystem.Abstractions/VirtualFileExtensions.cs @@ -26,7 +26,7 @@ public static ValueTask OpenTextAsync(this VirtualFile file, Cance /// that reads from the specified text file. /// /// The file to get the for. - /// The character encoding to use. + /// The encoding applied to the contents. /// An optional cancellation token to cancel the operation. /// /// A representing the asynchronous operation. diff --git a/src/Ramstack.FileSystem.Abstractions/VirtualFileSystemExtensions.cs b/src/Ramstack.FileSystem.Abstractions/VirtualFileSystemExtensions.cs index 270531a..9c8e966 100644 --- a/src/Ramstack.FileSystem.Abstractions/VirtualFileSystemExtensions.cs +++ b/src/Ramstack.FileSystem.Abstractions/VirtualFileSystemExtensions.cs @@ -24,9 +24,10 @@ public static ValueTask OpenReadAsync(this IVirtualFileSystem fs, string /// /// The file system to use. /// The path of the file to open. - /// The optional cancellation token used for canceling the operation. + /// An optional cancellation token to cancel the operation. /// - /// A task representing the asynchronous operation and returns a that reads from the text file. + /// A representing the asynchronous operation, + /// containing a that reads from the text file. /// public static Task OpenTextAsync(this IVirtualFileSystem fs, string path, CancellationToken cancellationToken = default) => fs.OpenTextAsync(path, Encoding.UTF8, cancellationToken); @@ -36,10 +37,11 @@ public static Task OpenTextAsync(this IVirtualFileSystem fs, strin /// /// The file system to use. /// The path of the file to open. - /// The character encoding to use. - /// The optional cancellation token used for canceling the operation. + /// The encoding applied to the contents. + /// An optional cancellation token to cancel the operation. /// - /// A task representing the asynchronous operation and returns a that reads from the text file. + /// A representing the asynchronous operation, + /// containing a that reads from the text file. /// public static async Task OpenTextAsync(this IVirtualFileSystem fs, string path, Encoding encoding, CancellationToken cancellationToken = default) { @@ -189,7 +191,7 @@ public static ValueTask WriteAllTextAsync(this IVirtualFileSystem fs, string pat fs.GetFile(path).WriteAllTextAsync(contents, encoding, cancellationToken); /// - /// Asynchronously writes the specified string to the specified the file. If the file already exists, it is truncated and overwritten. + /// Asynchronously writes the specified string to the specified file. If the file already exists, it is truncated and overwritten. /// /// The file system to use. /// The file to write to. @@ -273,7 +275,7 @@ public static ValueTask WriteAllBytesAsync(this IVirtualFileSystem fs, string pa /// /// The file system to use. /// The path of the file. - /// A cancellation token to cancel the operation. + /// An optional cancellation token to cancel the operation. /// /// A representing the asynchronous operation. /// The task result is if the file exists; otherwise, . @@ -296,12 +298,12 @@ public static ValueTask DeleteFileAsync(this IVirtualFileSystem fs, string path, /// /// Asynchronously copies a file within the file system to the specified destination path. /// - /// The instance. + /// The file system to use. /// The path of the file to copy. /// The path where the file will be copied to. - /// An optional cancellation token to cancel the operation. Defaults to . + /// An optional cancellation token to cancel the operation. /// - /// A that represents the asynchronous copy operation. + /// A representing the asynchronous operation. /// public static ValueTask CopyFileAsync(this IVirtualFileSystem fs, string path, string destinationPath, CancellationToken cancellationToken = default) => fs.GetFile(path).CopyToAsync(destinationPath, overwrite: false, cancellationToken); @@ -309,13 +311,13 @@ public static ValueTask CopyFileAsync(this IVirtualFileSystem fs, string path, s /// /// Asynchronously copies a file within the file system to the specified destination path. /// - /// The instance. + /// The file system to use. /// The path of the file to copy. /// The path where the file will be copied to. /// to overwrite an existing file; to throw an exception if the file already exists. - /// A token to cancel the operation. Defaults to . + /// An optional cancellation token to cancel the operation. /// - /// A that represents the asynchronous copy operation. + /// A representing the asynchronous operation. /// /// /// @@ -332,7 +334,7 @@ public static ValueTask CopyFileAsync(this IVirtualFileSystem fs, string path, s /// /// The file system to use. /// The path of the directory. - /// A cancellation token to cancel the operation. + /// An optional cancellation token to cancel the operation. /// /// A representing the asynchronous operation. /// The task result is if the directory exists; otherwise, . diff --git a/src/Ramstack.FileSystem.Abstractions/VirtualNode.cs b/src/Ramstack.FileSystem.Abstractions/VirtualNode.cs index e7db08c..f83ca8b 100644 --- a/src/Ramstack.FileSystem.Abstractions/VirtualNode.cs +++ b/src/Ramstack.FileSystem.Abstractions/VirtualNode.cs @@ -62,7 +62,7 @@ public void Refresh() /// /// Asynchronously determines whether the file or directory exists. /// - /// A cancellation token to cancel the operation. + /// An optional cancellation token to cancel the operation. /// /// A representing the asynchronous operation. /// The task result is if the file or directory exists; otherwise, . @@ -117,7 +117,7 @@ protected virtual void RefreshCore() /// /// Core implementation for asynchronously determining whether the file or directory exists. /// - /// A cancellation token to cancel the operation. + /// An optional cancellation token to cancel the operation. /// /// A representing the asynchronous operation. /// The task result is if the file or directory exists; otherwise, . diff --git a/src/Ramstack.FileSystem.Amazon/AmazonS3FileSystem.cs b/src/Ramstack.FileSystem.Amazon/AmazonS3FileSystem.cs index 00c26ad..9e32056 100644 --- a/src/Ramstack.FileSystem.Amazon/AmazonS3FileSystem.cs +++ b/src/Ramstack.FileSystem.Amazon/AmazonS3FileSystem.cs @@ -108,7 +108,7 @@ public void Dispose() => /// /// Creates the S3 bucket if it does not already exist. /// - /// A cancellation token to cancel the operation. + /// An optional cancellation token to cancel the operation. /// /// A representing the asynchronous operation. /// @@ -119,7 +119,7 @@ public ValueTask CreateBucketAsync(CancellationToken cancellationToken = default /// Creates the S3 bucket if it does not already exist. /// /// The ACL to apply to the bucket. - /// A cancellation token to cancel the operation. + /// An optional cancellation token to cancel the operation. /// /// A representing the asynchronous operation. /// diff --git a/src/Ramstack.FileSystem.Amazon/S3File.cs b/src/Ramstack.FileSystem.Amazon/S3File.cs index 1420a7b..77df096 100644 --- a/src/Ramstack.FileSystem.Amazon/S3File.cs +++ b/src/Ramstack.FileSystem.Amazon/S3File.cs @@ -134,7 +134,7 @@ protected override ValueTask CopyToCoreAsync(VirtualFile destination, bool overw /// The name of the destination S3 bucket. /// The key of the destination object in the S3 bucket. /// A boolean value indicating whether to overwrite the destination object if it already exists. - /// A cancellation token to cancel the operation. + /// An optional cancellation token to cancel the operation. /// /// A that represents the asynchronous copy operation. /// diff --git a/src/Ramstack.FileSystem.Amazon/S3UploadStream.cs b/src/Ramstack.FileSystem.Amazon/S3UploadStream.cs index 13786d9..8ec2f64 100644 --- a/src/Ramstack.FileSystem.Amazon/S3UploadStream.cs +++ b/src/Ramstack.FileSystem.Amazon/S3UploadStream.cs @@ -215,7 +215,7 @@ private void UploadPart() /// /// Asynchronously uploads the current buffer to Amazon S3 as a part of the multipart upload. /// - /// A cancellation token to cancel the operation. + /// An optional cancellation token to cancel the operation. /// /// A representing the asynchronous operation. /// @@ -269,7 +269,7 @@ private void Abort() /// /// Asynchronously aborts the multipart upload session. /// - /// A cancellation token to cancel the operation. + /// An optional cancellation token to cancel the operation. /// /// A that represents the asynchronous abort operation. /// diff --git a/src/Ramstack.FileSystem.Azure/AzureFile.cs b/src/Ramstack.FileSystem.Azure/AzureFile.cs index 2f752d0..a80a94e 100644 --- a/src/Ramstack.FileSystem.Azure/AzureFile.cs +++ b/src/Ramstack.FileSystem.Azure/AzureFile.cs @@ -117,7 +117,7 @@ protected override ValueTask CopyToCoreAsync(VirtualFile destination, bool overw /// The source blob client. /// The destination blob client. /// A boolean value indicating whether to overwrite the destination blob if it already exists. - /// A cancellation token to cancel the operation. + /// An optional cancellation token to cancel the operation. /// /// A representing the asynchronous operation. /// diff --git a/src/Ramstack.FileSystem.Composite/CompositeFile.cs b/src/Ramstack.FileSystem.Composite/CompositeFile.cs index 868ba2f..55c4003 100644 --- a/src/Ramstack.FileSystem.Composite/CompositeFile.cs +++ b/src/Ramstack.FileSystem.Composite/CompositeFile.cs @@ -18,7 +18,7 @@ internal sealed class CompositeFile : VirtualFile /// /// The file system associated with this file. /// The path of the file. - /// The to wrap. + /// The instance to wrap. public CompositeFile(CompositeFileSystem fileSystem, string path, VirtualFile? file = null) : base(path) => (_fs, _file) = (fileSystem, file); diff --git a/src/Ramstack.FileSystem.Google/GcsFile.cs b/src/Ramstack.FileSystem.Google/GcsFile.cs index fd69cdd..66113e9 100644 --- a/src/Ramstack.FileSystem.Google/GcsFile.cs +++ b/src/Ramstack.FileSystem.Google/GcsFile.cs @@ -142,7 +142,7 @@ internal string GetObjectName() => /// The name of the destination GCS bucket. /// The destination object name. /// A boolean value indicating whether to overwrite the destination object if it already exists. - /// A cancellation token to cancel the operation. + /// An optional cancellation token to cancel the operation. /// /// A representing the asynchronous operation. /// diff --git a/src/Ramstack.FileSystem.Physical/PhysicalFileSystem.cs b/src/Ramstack.FileSystem.Physical/PhysicalFileSystem.cs index 70346e5..71be1c0 100644 --- a/src/Ramstack.FileSystem.Physical/PhysicalFileSystem.cs +++ b/src/Ramstack.FileSystem.Physical/PhysicalFileSystem.cs @@ -21,7 +21,7 @@ public sealed class PhysicalFileSystem : IVirtualFileSystem /// /// Initializes a new instance of the class. /// - /// The physical path of root the directory. + /// The physical path of the root directory. public PhysicalFileSystem(string path) { if (!Path.IsPathRooted(path)) diff --git a/src/Ramstack.FileSystem.Prefixed/PrefixedFile.cs b/src/Ramstack.FileSystem.Prefixed/PrefixedFile.cs index 8a26bb0..dfaaad6 100644 --- a/src/Ramstack.FileSystem.Prefixed/PrefixedFile.cs +++ b/src/Ramstack.FileSystem.Prefixed/PrefixedFile.cs @@ -17,7 +17,7 @@ internal sealed class PrefixedFile : VirtualFile /// /// The file system associated with this file. /// The prefixed path of the file. - /// The underlying that this instance wraps. + /// The instance to wrap. public PrefixedFile(PrefixedFileSystem fileSystem, string path, VirtualFile file) : base(path) => (_fileSystem, _file) = (fileSystem, file); diff --git a/src/Ramstack.FileSystem.Sub/SubFile.cs b/src/Ramstack.FileSystem.Sub/SubFile.cs index e660702..7799915 100644 --- a/src/Ramstack.FileSystem.Sub/SubFile.cs +++ b/src/Ramstack.FileSystem.Sub/SubFile.cs @@ -16,7 +16,7 @@ internal sealed class SubFile : VirtualFile /// /// The file system associated with this file. /// The path of the file. - /// The underlying instance to wrap. + /// The instance to wrap. public SubFile(SubFileSystem fileSystem, string path, VirtualFile file) : base(path) => (_fileSystem, _file) = (fileSystem, file);