Skip to content

Commit 8468f29

Browse files
authored
[Hidden files] - Add support for moving or permanently deleting a hidden folder (#2396)
1 parent 7824190 commit 8468f29

File tree

4 files changed

+43
-27
lines changed

4 files changed

+43
-27
lines changed

Files.Launcher/Program.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -422,11 +422,16 @@ await Win32API.StartSTATask(() =>
422422
});
423423
break;
424424

425-
case "MoveToBin":
425+
case "DeleteItem":
426426
var fileToDeletePath = (string)args.Request.Message["filepath"];
427+
var permanently = (bool)args.Request.Message["permanently"];
427428
using (var op = new ShellFileOperations())
428429
{
429-
op.Options = ShellFileOperations.OperationFlags.AllowUndo | ShellFileOperations.OperationFlags.NoUI;
430+
op.Options = ShellFileOperations.OperationFlags.NoUI;
431+
if (!permanently)
432+
{
433+
op.Options |= ShellFileOperations.OperationFlags.AllowUndo;
434+
}
430435
using var shi = new ShellItem(fileToDeletePath);
431436
op.QueueDeleteOperation(shi);
432437
op.PerformOperations();

Files/Commands/Delete.cs

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -151,31 +151,17 @@ private async Task<FilesystemResult> DeleteItemAsync(StorageDeleteOption deleteO
151151

152152
if (deleted.ErrorCode == FilesystemErrorCode.ERROR_UNAUTHORIZED)
153153
{
154-
if (deleteOption == StorageDeleteOption.Default)
154+
// Try again with fulltrust process
155+
if (AppInstance.FilesystemViewModel.Connection != null)
155156
{
156-
// Try again with fulltrust process
157-
if (AppInstance.FilesystemViewModel.Connection != null)
158-
{
159-
var response = await AppInstance.FilesystemViewModel.Connection.SendMessageAsync(new ValueSet()
157+
var response = await AppInstance.FilesystemViewModel.Connection.SendMessageAsync(new ValueSet()
160158
{
161159
{ "Arguments", "FileOperation" },
162-
{ "fileop", "MoveToBin" },
163-
{ "filepath", storItem.ItemPath }
160+
{ "fileop", "DeleteItem" },
161+
{ "filepath", storItem.ItemPath },
162+
{ "permanently", deleteOption == StorageDeleteOption.PermanentDelete }
164163
});
165-
deleted = (FilesystemResult)(response.Status == Windows.ApplicationModel.AppService.AppServiceResponseStatus.Success);
166-
}
167-
}
168-
else
169-
{
170-
// Try again with DeleteFileFromApp
171-
if (!NativeFileOperationsHelper.DeleteFileFromApp(storItem.ItemPath))
172-
{
173-
Debug.WriteLine(System.Runtime.InteropServices.Marshal.GetLastWin32Error());
174-
}
175-
else
176-
{
177-
deleted = (FilesystemResult)true;
178-
}
164+
deleted = (FilesystemResult)(response.Status == Windows.ApplicationModel.AppService.AppServiceResponseStatus.Success);
179165
}
180166
}
181167
else if (deleted.ErrorCode == FilesystemErrorCode.ERROR_INUSE)

Files/Commands/Paste.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using System.Linq;
1010
using System.Threading.Tasks;
1111
using Windows.ApplicationModel.DataTransfer;
12+
using Windows.Foundation.Collections;
1213
using Windows.Storage;
1314
using static Files.Helpers.NativeFindStorageItemHelper;
1415
using FileAttributes = System.IO.FileAttributes;
@@ -120,6 +121,11 @@ await AppInstance.FilesystemViewModel.GetFolderFromPathAsync(destinationPath)
120121
.OnSuccess(t => CloneDirectoryAsync((StorageFolder)item, t, item.Name))
121122
.OnSuccess(t =>
122123
{
124+
if (AppInstance.FilesystemViewModel.CheckFolderForHiddenAttribute(item.Path))
125+
{
126+
// The source folder was hidden, apply hidden attribute to destination
127+
NativeFileOperationsHelper.SetFileAttribute(t.Path, FileAttributes.Hidden);
128+
}
123129
pastedSourceItems.Add(item);
124130
pastedItems.Add(t);
125131
});
@@ -202,10 +208,17 @@ await AppInstance.FilesystemViewModel.GetFolderFromPathAsync(destinationPath)
202208

203209
if (deleted == FilesystemErrorCode.ERROR_UNAUTHORIZED)
204210
{
205-
// Try again with DeleteFileFromApp
206-
if (!NativeFileOperationsHelper.DeleteFileFromApp(item.Path))
211+
// Try again with fulltrust process
212+
if (AppInstance.FilesystemViewModel.Connection != null)
207213
{
208-
Debug.WriteLine(System.Runtime.InteropServices.Marshal.GetLastWin32Error());
214+
var response = await AppInstance.FilesystemViewModel.Connection.SendMessageAsync(new ValueSet()
215+
{
216+
{ "Arguments", "FileOperation" },
217+
{ "fileop", "DeleteItem" },
218+
{ "filepath", item.Path },
219+
{ "permanently", true }
220+
});
221+
deleted = (FilesystemResult)(response.Status == Windows.ApplicationModel.AppService.AppServiceResponseStatus.Success);
209222
}
210223
}
211224
else if (deleted == FilesystemErrorCode.ERROR_NOTFOUND)

Files/View Models/ItemViewModel.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1050,12 +1050,16 @@ private async Task EnumFromStorageFolderAsync()
10501050
Debug.WriteLine($"Enumerating items in {WorkingDirectory} (device) completed in {stopwatch.ElapsedMilliseconds} milliseconds.\n");
10511051
}
10521052

1053-
private bool CheckFolderForHiddenAttribute(string path)
1053+
public bool CheckFolderForHiddenAttribute(string path)
10541054
{
10551055
FINDEX_INFO_LEVELS findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoBasic;
10561056
int additionalFlags = FIND_FIRST_EX_LARGE_FETCH;
10571057
IntPtr hFileTsk = FindFirstFileExFromApp(path + "\\*.*", findInfoLevel, out WIN32_FIND_DATA findDataTsk, FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero,
10581058
additionalFlags);
1059+
if (hFileTsk.ToInt64() == -1)
1060+
{
1061+
return false;
1062+
}
10591063
var isHidden = ((FileAttributes)findDataTsk.dwFileAttributes & FileAttributes.Hidden) == FileAttributes.Hidden;
10601064
FindClose(hFileTsk);
10611065
return isHidden;
@@ -1248,6 +1252,8 @@ public void AddFileOrFolderFromShellFile(ShellFileItem item, string dateReturnFo
12481252
ItemName = item.FileName,
12491253
ItemDateModifiedReal = item.RecycleDate,
12501254
ItemType = item.FileType,
1255+
IsHiddenItem = false,
1256+
Opacity = 1,
12511257
LoadFolderGlyph = true,
12521258
FileImage = null,
12531259
LoadFileIcon = false,
@@ -1293,6 +1299,8 @@ public void AddFileOrFolderFromShellFile(ShellFileItem item, string dateReturnFo
12931299
FileImage = null,
12941300
LoadFileIcon = false,
12951301
LoadFolderGlyph = false,
1302+
IsHiddenItem = false,
1303+
Opacity = 1,
12961304
ItemName = itemName,
12971305
ItemDateModifiedReal = item.RecycleDate,
12981306
ItemType = item.FileType,
@@ -1653,6 +1661,8 @@ public async Task AddFolderAsync(StorageFolder folder, string dateReturnFormat)
16531661
ItemName = folder.Name,
16541662
ItemDateModifiedReal = basicProperties.DateModified,
16551663
ItemType = folder.DisplayType,
1664+
IsHiddenItem = false,
1665+
Opacity = 1,
16561666
LoadFolderGlyph = true,
16571667
FileImage = null,
16581668
LoadFileIcon = false,
@@ -1756,6 +1766,8 @@ public async Task AddFileAsync(StorageFile file, string dateReturnFormat, bool s
17561766
{
17571767
PrimaryItemAttribute = StorageItemTypes.File,
17581768
FileExtension = itemFileExtension,
1769+
IsHiddenItem = false,
1770+
Opacity = 1,
17591771
LoadUnknownTypeGlyph = itemEmptyImgVis,
17601772
FileImage = icon,
17611773
LoadFileIcon = itemThumbnailImgVis,

0 commit comments

Comments
 (0)