예제 #1
0
    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));
            }
        }
    }
예제 #2
0
    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;
        }
    }