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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #5
0
            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);
            }