public static async Task <ListedItem> GetFile( WIN32_FIND_DATA findData, string pathRoot, string dateReturnFormat, NamedPipeAsAppServiceConnection connection, CancellationToken cancellationToken ) { var itemPath = Path.Combine(pathRoot, findData.cFileName); var itemName = findData.cFileName; DateTime itemModifiedDate, itemCreatedDate, itemLastAccessDate; try { FileTimeToSystemTime(ref findData.ftLastWriteTime, out SYSTEMTIME systemModifiedDateOutput); itemModifiedDate = systemModifiedDateOutput.ToDateTime(); FileTimeToSystemTime(ref findData.ftCreationTime, out SYSTEMTIME systemCreatedDateOutput); itemCreatedDate = systemCreatedDateOutput.ToDateTime(); FileTimeToSystemTime(ref findData.ftLastAccessTime, out SYSTEMTIME systemLastAccessOutput); itemLastAccessDate = systemLastAccessOutput.ToDateTime(); } catch (ArgumentException) { // Invalid date means invalid findData, do not add to list return(null); } long itemSizeBytes = findData.GetSize(); var itemSize = itemSizeBytes.ToSizeString(); string itemType = "ItemTypeFile".GetLocalized(); string itemFileExtension = null; if (findData.cFileName.Contains('.')) { itemFileExtension = Path.GetExtension(itemPath); itemType = itemFileExtension.Trim('.') + " " + itemType; } bool itemThumbnailImgVis = false; bool itemEmptyImgVis = true; if (cancellationToken.IsCancellationRequested) { return(null); } bool isHidden = ((FileAttributes)findData.dwFileAttributes & FileAttributes.Hidden) == FileAttributes.Hidden; double opacity = isHidden ? Constants.UI.DimItemOpacity : 1; // https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/c8e77b37-3909-4fe6-a4ea-2b9d423b1ee4 bool isReparsePoint = ((FileAttributes)findData.dwFileAttributes & FileAttributes.ReparsePoint) == FileAttributes.ReparsePoint; bool isSymlink = isReparsePoint && findData.dwReserved0 == NativeFileOperationsHelper.IO_REPARSE_TAG_SYMLINK; if (isSymlink) { var targetPath = NativeFileOperationsHelper.ParseSymLink(itemPath); return(new ShortcutItem(null, dateReturnFormat) { PrimaryItemAttribute = StorageItemTypes.File, FileExtension = itemFileExtension, IsHiddenItem = isHidden, Opacity = opacity, FileImage = null, LoadFileIcon = itemThumbnailImgVis, LoadWebShortcutGlyph = false, ItemNameRaw = itemName, ItemDateModifiedReal = itemModifiedDate, ItemDateAccessedReal = itemLastAccessDate, ItemDateCreatedReal = itemCreatedDate, ItemType = "ShortcutFileType".GetLocalized(), ItemPath = itemPath, FileSize = itemSize, FileSizeBytes = itemSizeBytes, TargetPath = targetPath, IsSymLink = true }); } else if (findData.cFileName.EndsWith(".lnk", StringComparison.Ordinal) || findData.cFileName.EndsWith(".url", StringComparison.Ordinal)) { if (connection != null) { var(status, response) = await connection.SendMessageForResponseAsync(new ValueSet() { { "Arguments", "FileOperation" }, { "fileop", "ParseLink" }, { "filepath", itemPath } }); // If the request was canceled return now if (cancellationToken.IsCancellationRequested) { return(null); } if (status == AppServiceResponseStatus.Success && response.ContainsKey("ShortcutInfo")) { var isUrl = findData.cFileName.EndsWith(".url", StringComparison.OrdinalIgnoreCase); var shInfo = JsonConvert.DeserializeObject <ShellLinkItem>((string)response["ShortcutInfo"]); if (shInfo == null) { return(null); } return(new ShortcutItem(null, dateReturnFormat) { PrimaryItemAttribute = shInfo.IsFolder ? StorageItemTypes.Folder : StorageItemTypes.File, FileExtension = itemFileExtension, IsHiddenItem = isHidden, Opacity = opacity, FileImage = null, LoadFileIcon = !shInfo.IsFolder && itemThumbnailImgVis, LoadWebShortcutGlyph = !shInfo.IsFolder && isUrl && itemEmptyImgVis, ItemNameRaw = itemName, ItemDateModifiedReal = itemModifiedDate, ItemDateAccessedReal = itemLastAccessDate, ItemDateCreatedReal = itemCreatedDate, ItemType = isUrl ? "ShortcutWebLinkFileType".GetLocalized() : "ShortcutFileType".GetLocalized(), ItemPath = itemPath, FileSize = itemSize, FileSizeBytes = itemSizeBytes, TargetPath = shInfo.TargetPath, Arguments = shInfo.Arguments, WorkingDirectory = shInfo.WorkingDirectory, RunAsAdmin = shInfo.RunAsAdmin, IsUrl = isUrl, }); } } } else if (App.LibraryManager.TryGetLibrary(itemPath, out LibraryLocationItem library)) { return(new LibraryItem(library) { ItemDateModifiedReal = itemModifiedDate, ItemDateCreatedReal = itemCreatedDate, }); } else { if (".zip".Equals(itemFileExtension, StringComparison.OrdinalIgnoreCase) && await ZipStorageFolder.CheckDefaultZipApp(itemPath)) { return(new ZipItem(null, dateReturnFormat) { PrimaryItemAttribute = StorageItemTypes.Folder, // Treat zip files as folders FileExtension = itemFileExtension, FileImage = null, LoadFileIcon = itemThumbnailImgVis, ItemNameRaw = itemName, IsHiddenItem = isHidden, Opacity = opacity, ItemDateModifiedReal = itemModifiedDate, ItemDateAccessedReal = itemLastAccessDate, ItemDateCreatedReal = itemCreatedDate, ItemType = itemType, ItemPath = itemPath, FileSize = itemSize, FileSizeBytes = itemSizeBytes }); } else { return(new ListedItem(null, dateReturnFormat) { PrimaryItemAttribute = StorageItemTypes.File, FileExtension = itemFileExtension, FileImage = null, LoadFileIcon = itemThumbnailImgVis, ItemNameRaw = itemName, IsHiddenItem = isHidden, Opacity = opacity, ItemDateModifiedReal = itemModifiedDate, ItemDateAccessedReal = itemLastAccessDate, ItemDateCreatedReal = itemCreatedDate, ItemType = itemType, ItemPath = itemPath, FileSize = itemSize, FileSizeBytes = itemSizeBytes }); } } return(null); }