Skip to content

Fix refresh not working when doing some files operations in network drives #9297

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 8, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 17 additions & 17 deletions src/Files.FullTrust/Helpers/ShellFolderHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,26 +29,28 @@ public static ShellLibraryItem GetShellLibraryItem(ShellLibrary2 library, string
return libraryItem;
}

private static T TryGetProperty<T>(this ShellItemPropertyStore sip, Ole32.PROPERTYKEY key)
{
T value = default;
SafetyExtensions.IgnoreExceptions(() => sip.TryGetValue<T>(key, out value));
return value;
}

public static ShellFileItem GetShellFileItem(ShellItem folderItem)
{
if (folderItem == null)
{
return null;
}
bool isFolder = folderItem.IsFolder && !folderItem.Attributes.HasFlag(ShellItemAttribute.Stream);
if (folderItem.Properties == null)
{
return new ShellFileItem(isFolder, folderItem.FileSystemPath, Path.GetFileName(folderItem.Name), folderItem.Name, DateTime.Now, DateTime.Now, DateTime.Now, null, 0, null);
}
var parsingPath = folderItem.GetDisplayName(ShellItemDisplayString.DesktopAbsoluteParsing);
parsingPath ??= folderItem.FileSystemPath; // True path on disk
if (parsingPath == null || !Path.IsPathRooted(parsingPath))
{
// Use PIDL as path
parsingPath = $@"\\SHELL\{string.Join("\\", folderItem.PIDL.Select(x => x.GetBytes()).Select(x => Convert.ToBase64String(x, 0, x.Length)))}";
}
folderItem.Properties.TryGetValue<string>(
Ole32.PROPERTYKEY.System.ItemNameDisplay, out var fileName);
var fileName = folderItem.Properties.TryGetProperty<string>(Ole32.PROPERTYKEY.System.ItemNameDisplay);
fileName ??= Path.GetFileName(folderItem.Name); // Original file name
string filePath = string.IsNullOrEmpty(Path.GetDirectoryName(parsingPath)) ? // Null if root
parsingPath : Path.Combine(Path.GetDirectoryName(parsingPath), folderItem.Name); // In recycle bin "Name" contains original file path + name
Expand All @@ -63,20 +65,18 @@ public static ShellFileItem GetShellFileItem(ShellItem folderItem)
filePath = $"{filePath}{realExtension}";
}
}
folderItem.Properties.TryGetValue<System.Runtime.InteropServices.ComTypes.FILETIME?>(
Ole32.PROPERTYKEY.System.Recycle.DateDeleted, out var fileTime);
var fileTime = folderItem.Properties.TryGetProperty<System.Runtime.InteropServices.ComTypes.FILETIME?>(
Ole32.PROPERTYKEY.System.Recycle.DateDeleted);
var recycleDate = fileTime?.ToDateTime().ToLocalTime() ?? DateTime.Now; // This is LocalTime
folderItem.Properties.TryGetValue<System.Runtime.InteropServices.ComTypes.FILETIME?>(
Ole32.PROPERTYKEY.System.DateModified, out fileTime);
fileTime = folderItem.Properties.TryGetProperty<System.Runtime.InteropServices.ComTypes.FILETIME?>(
Ole32.PROPERTYKEY.System.DateModified);
var modifiedDate = fileTime?.ToDateTime().ToLocalTime() ?? DateTime.Now; // This is LocalTime
folderItem.Properties.TryGetValue<System.Runtime.InteropServices.ComTypes.FILETIME?>(
Ole32.PROPERTYKEY.System.DateCreated, out fileTime);
fileTime = folderItem.Properties.TryGetProperty<System.Runtime.InteropServices.ComTypes.FILETIME?>(
Ole32.PROPERTYKEY.System.DateCreated);
var createdDate = fileTime?.ToDateTime().ToLocalTime() ?? DateTime.Now; // This is LocalTime
string fileSize = folderItem.Properties.TryGetValue<ulong?>(
Ole32.PROPERTYKEY.System.Size, out var fileSizeBytes) ?
folderItem.Properties.GetPropertyString(Ole32.PROPERTYKEY.System.Size) : null;
folderItem.Properties.TryGetValue<string>(
Ole32.PROPERTYKEY.System.ItemTypeText, out var fileType);
var fileSizeBytes = folderItem.Properties.TryGetProperty<ulong?>(Ole32.PROPERTYKEY.System.Size);
string fileSize = fileSizeBytes is not null ? folderItem.Properties.GetPropertyString(Ole32.PROPERTYKEY.System.Size) : null;
var fileType = folderItem.Properties.TryGetProperty<string>(Ole32.PROPERTYKEY.System.ItemTypeText);
return new ShellFileItem(isFolder, parsingPath, fileName, filePath, recycleDate, modifiedDate, createdDate, fileSize, fileSizeBytes ?? 0, fileType);
}

Expand Down