public Task <ImageSource> FindTitleIcon(Title title) { if (title.ControlNca != null) { IFileSystem controlFS = title.ControlNca.OpenFileSystem(NcaSectionType.Data, IntegrityCheckLevel.ErrorOnInvalid); DirectoryEntryEx file = controlFS.EnumerateEntries("/", "icon_*.dat").FirstOrDefault(); if (file != null) { return(new Task <ImageSource>(() => { try { controlFS.OpenFile(out IFile jpegFile, file.FullPath.ToU8Span(), OpenMode.Read); JpegBitmapDecoder decoder = new JpegBitmapDecoder(jpegFile.AsStream(), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); decoder.Frames[0].Freeze(); return decoder.Frames[0]; } catch (Exception) { return null; } })); } } return(null); }
public NtStatus FindFilesWithPattern(string fileName, string searchPattern, out IList <FileInformation> files, IDokanFileInfo info) { IDirectory directory = GetDirectory(fileName, OpenDirectoryMode.All); searchPattern = WildcardToRegex(searchPattern); files = new List <FileInformation>(); //if (searchPattern.EndsWith("\"*")) // thanks windows // searchPattern = searchPattern.Replace("\"*", "*"); try { directory.GetEntryCount(out long entryCount); DirectoryEntry[] entries = new DirectoryEntry[entryCount]; directory.Read(out entryCount, entries); for (int i = 0; i < entryCount; i++) { string name = StringUtils.Utf8ZToString(entries[i].Name); if (Regex.IsMatch(name, searchPattern)) { DirectoryEntryEx entry = new DirectoryEntryEx(name, FilterPath(fileName) + "/" + name, entries[i].Type, entries[i].Size); files.Add(CreateInfo(entry, FilterPath(entry.FullPath))); } } } catch (Exception e) { Console.WriteLine("Exception raised when iterating through directory:\n" + e.Message + "\n" + e.StackTrace); } return(NtStatus.Success); }
public NacpItem(ApplicationControlProperty nacp, SectionItem parentItem, DirectoryEntryEx directoryEntry) : base(parentItem, directoryEntry) { Nacp = nacp; ParentItem = parentItem ?? throw new ArgumentNullException(nameof(parentItem)); AddOnContentBaseId = Nacp.AddOnContentBaseId.ToStrId(); }
private DirectoryEntryItem(IItem parentItem, SectionItem containerSectionItem, DirectoryEntryEx directoryEntry) { DirectoryEntry = directoryEntry; ContainerSectionItem = containerSectionItem ?? throw new ArgumentNullException(nameof(containerSectionItem)); ParentItem = parentItem ?? throw new ArgumentNullException(nameof(parentItem)); Size = directoryEntry.Size; }
internal static DirectoryEntryEx GetDirectoryEntryEx(ref DirectoryEntry entry, string parentPath) { string name = StringUtils.Utf8ZToString(entry.Name); string path = PathTools.Combine(parentPath, name); var entryEx = new DirectoryEntryEx(name, path, entry.Type, entry.Size); entryEx.Attributes = entry.Attributes; return(entryEx); }
public CnmtItem(Cnmt cnmt, SectionItem parentSectionItem, DirectoryEntryEx directoryEntry) : base(parentSectionItem, directoryEntry) { Cnmt = cnmt ?? throw new ArgumentNullException(nameof(cnmt)); ParentItem = parentSectionItem; PatchLevel = GetPatchLevel(Cnmt.TitleVersion); TitleId = Cnmt.TitleId.ToStrId(); ApplicationTitleId = Cnmt.ApplicationTitleId.ToStrId(); PatchTitleId = Cnmt.PatchTitleId.ToStrId(); TitleVersion = Cnmt.TitleVersion?.Version.ToString(); }
private FileInformation CreateInfo(DirectoryEntryEx entry, string path) { switch (entry.Type) { case DirectoryEntryType.File: return(CreateInfo(path)); case DirectoryEntryType.Directory: return(CreateInfo(GetDirectory(path, OpenDirectoryMode.All), path)); } return(new FileInformation()); }
public static IEnumerable <DirectoryEntryEx> EnumerateEntries(this FileSystemClient fs, string path, string searchPattern, SearchOptions searchOptions) { bool ignoreCase = searchOptions.HasFlag(SearchOptions.CaseInsensitive); bool recurse = searchOptions.HasFlag(SearchOptions.RecurseSubdirectories); Result rc = fs.OpenDirectory(out DirectoryHandle sourceHandle, path, OpenDirectoryMode.All); if (rc.IsFailure()) { yield break; } using (sourceHandle) { while (true) { DirectoryEntry dirEntry = default; fs.ReadDirectory(out long entriesRead, SpanHelpers.AsSpan(ref dirEntry), sourceHandle); if (entriesRead == 0) { break; } DirectoryEntryEx entry = GetDirectoryEntryEx(ref dirEntry, path); if (PathTools.MatchesPattern(searchPattern, entry.Name, ignoreCase)) { yield return(entry); } if (entry.Type != DirectoryEntryType.Directory || !recurse) { continue; } IEnumerable <DirectoryEntryEx> subEntries = fs.EnumerateEntries(PathTools.Combine(path, entry.Name), searchPattern, searchOptions); foreach (DirectoryEntryEx subEntry in subEntries) { yield return(subEntry); } } } }
public static IEnumerable <DirectoryEntryEx> EnumerateEntries(this IFileSystem fileSystem, string path, string searchPattern, SearchOptions searchOptions) { bool ignoreCase = searchOptions.HasFlag(SearchOptions.CaseInsensitive); bool recurse = searchOptions.HasFlag(SearchOptions.RecurseSubdirectories); IFileSystem fs = fileSystem; fileSystem.OpenDirectory(out IDirectory directory, path.ToU8Span(), OpenDirectoryMode.All).ThrowIfFailure(); while (true) { DirectoryEntry dirEntry = default; directory.Read(out long entriesRead, SpanHelpers.AsSpan(ref dirEntry)).ThrowIfFailure(); if (entriesRead == 0) { break; } DirectoryEntryEx entry = GetDirectoryEntryEx(ref dirEntry, path); if (PathTools.MatchesPattern(searchPattern, entry.Name, ignoreCase)) { yield return(entry); } if (entry.Type != DirectoryEntryType.Directory || !recurse) { continue; } IEnumerable <DirectoryEntryEx> subEntries = fs.EnumerateEntries(PathTools.Combine(path, entry.Name), searchPattern, searchOptions); foreach (DirectoryEntryEx subEntry in subEntries) { yield return(subEntry); } } }
public MainItem(NsoHeader nsoHeader, SectionItem parentItem, DirectoryEntryEx directoryEntry) : base(parentItem, directoryEntry) { ParentItem = parentItem ?? throw new ArgumentNullException(nameof(parentItem)); NsoHeader = nsoHeader; }
/// <summary> /// Constructor when entry is direct child of another <see cref="DirectoryEntryItem"/> /// </summary> /// <param name="containerSectionItem"></param> /// <param name="directoryEntry"></param> /// <param name="parentItem"></param> public DirectoryEntryItem(SectionItem containerSectionItem, DirectoryEntryEx directoryEntry, DirectoryEntryItem parentItem) : this(parentItem, containerSectionItem, directoryEntry) { ParentDirectoryEntryItem = parentItem; }
/// <summary> /// Constructor when entry is direct child of a <see cref="SectionItem"/> /// </summary> /// <param name="parentItem"></param> /// <param name="directoryEntry"></param> public DirectoryEntryItem(SectionItem parentItem, DirectoryEntryEx directoryEntry) : this(parentItem, parentItem, directoryEntry) { ParentSectionItem = parentItem; }