protected override async Task <FileObject> CreateFileImplAsync(FileParameters option, CancellationToken cancel = default) { string fileName = this.PathParser.GetFileName(option.Path); if (fileName.IndexOf(Params.SplitStr) != -1) { throw new ApplicationException($"The original filename '{fileName}' contains '{Params.SplitStr}'."); } await using (CreatePerTaskCancellationToken(out CancellationToken operationCancel, cancel)) { using (await AsyncLockObj.LockWithAwait(operationCancel)) { cancel.ThrowIfCancellationRequested(); bool isSimplePhysicalFileExists = await UnderlayFileSystem.IsFileExistsAsync(option.Path); if (isSimplePhysicalFileExists) { // If there is a simple physical file, open it. return(await UnderlayFileSystem.CreateFileAsync(option, cancel)); } ParsedPath[] relatedFiles = await GetPhysicalFileStateInternal(option.Path, operationCancel); return(await LargeFileObject.CreateFileAsync(this, option, relatedFiles, operationCancel)); } } }
protected virtual async Task <ViewFileObjectInitUnderlayFileResultParam> CreateUnderlayFileImplAsync(FileParameters option, CancellationToken cancel = default) { FileObject obj = await UnderlayFileSystem.CreateFileAsync(option, cancel); try { ViewFileObjectInitUnderlayFileResultParam result = new ViewFileObjectInitUnderlayFileResultParam( obj, obj.FileParams.Flags.Bit(FileFlags.RandomAccessOnly) ? 0 : obj.Position, obj.Size); return(result); } catch { obj._DisposeSafe(); throw; } }