protected override Result DoRead(out long entriesRead, Span <DirectoryEntry> entryBuffer) { entriesRead = 0; var entry = new DirectoryEntry(); Span <DirectoryEntry> entrySpan = SpanHelpers.AsSpan(ref entry); int i; for (i = 0; i < entryBuffer.Length; i++) { Result rc = ParentDirectory.Read(out long baseEntriesRead, entrySpan); if (rc.IsFailure()) { return(rc); } if (baseEntriesRead == 0) { break; } // Check if the current open mode says we should return the entry bool isConcatFile = IsConcatenationFile(entry); if (!CanReturnEntry(entry, isConcatFile)) { continue; } if (isConcatFile) { entry.Type = DirectoryEntryType.File; if (!Mode.HasFlag(OpenDirectoryMode.NoFileSize)) { string entryName = Utilities.GetUtf8StringNullTerminated(entry.Name); string entryFullPath = PathTools.Combine(_path.ToString(), entryName); rc = ParentFileSystem.GetConcatenationFileSize(out long fileSize, entryFullPath.ToU8Span()); if (rc.IsFailure()) { return(rc); } entry.Size = fileSize; } } entry.Attributes = NxFileAttributes.None; entryBuffer[i] = entry; } entriesRead = i; return(Result.Success); }
public void IDirectoryRead_DuplicatedEntryReturnsFromTopLayer() { IFileSystem fs = CreateFileSystem(); var entry = new DirectoryEntry(); Assert.Success(fs.OpenDirectory(out IDirectory directory, "/dir".ToU8Span(), OpenDirectoryMode.All)); Assert.Success(directory.Read(out _, SpanHelpers.AsSpan(ref entry))); Assert.Equal("replacedFile", StringUtils.Utf8ZToString(entry.Name)); Assert.Equal(2, entry.Size); }
public void IDirectoryGetEntryCount_MergedDirectoryAfterRead_AllEntriesAreCounted() { IFileSystem fs = CreateFileSystem(); var entry = new DirectoryEntry(); Assert.Success(fs.OpenDirectory(out IDirectory directory, "/dir3".ToU8Span(), OpenDirectoryMode.All)); // Read all entries long entriesRead; do { Assert.Success(directory.Read(out entriesRead, SpanHelpers.AsSpan(ref entry))); } while (entriesRead != 0); Assert.Success(directory.GetEntryCount(out long entryCount)); Assert.Equal(3, entryCount); }
public Result GetEntryCount(out long entryCount) { entryCount = 0; long count = 0; Result rc = BaseFileSystem.OpenDirectory(out IDirectory _, Path, OpenDirectoryMode.All | OpenDirectoryMode.NoFileSize); if (rc.IsFailure()) { return(rc); } var entry = new DirectoryEntry(); Span <DirectoryEntry> entrySpan = SpanHelpers.AsSpan(ref entry); while (true) { rc = ParentDirectory.Read(out long baseEntriesRead, entrySpan); if (rc.IsFailure()) { return(rc); } if (baseEntriesRead == 0) { break; } if (CanReturnEntry(entry, IsConcatenationFile(entry))) { count++; } } entryCount = count; return(Result.Success); }
protected override Result DoGetEntryCount(out long entryCount) { entryCount = 0; long totalEntryCount = 0; var entry = new DirectoryEntry(); // todo: Efficient way to remove duplicates var names = new HashSet <string>(); // Open new directories for each source because we need to remove duplicate entries foreach (IFileSystem fs in SourceFileSystems) { Result rc = fs.OpenDirectory(out IDirectory dir, Path, Mode); if (rc.IsFailure()) { return(rc); } long entriesRead; do { rc = dir.Read(out entriesRead, SpanHelpers.AsSpan(ref entry)); if (rc.IsFailure()) { return(rc); } if (entriesRead == 1 && names.Add(StringUtils.Utf8ZToString(entry.Name))) { totalEntryCount++; } } while (entriesRead != 0); } entryCount = totalEntryCount; return(Result.Success); }