Skip to content

Commit 9e9a223

Browse files
committed
Updated AppDataStorageHelper to better support items in sub-folders.
1 parent a72b060 commit 9e9a223

File tree

2 files changed

+34
-42
lines changed

2 files changed

+34
-42
lines changed

Microsoft.Toolkit.Uwp/Helpers/ObjectStorage/ApplicationDataStorageHelper.cs

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
using System;
66
using System.Collections.Generic;
7+
using System.IO;
78
using System.Linq;
89
using System.Threading.Tasks;
910
using Microsoft.Toolkit.Helpers;
@@ -282,27 +283,13 @@ public Task<bool> TryRenameItemAsync(string itemPath, string newName)
282283

283284
private async Task<T?> ReadFileAsync<T>(StorageFolder folder, string filePath, T? @default = default)
284285
{
285-
var dirName = System.IO.Path.GetDirectoryName(filePath);
286-
if (!string.IsNullOrEmpty(dirName))
287-
{
288-
folder = await folder.GetFolderAsync(dirName);
289-
filePath = System.IO.Path.GetFileName(filePath);
290-
}
291-
292-
string value = await StorageFileHelper.ReadTextFromFileAsync(folder, filePath);
286+
string value = await StorageFileHelper.ReadTextFromFileAsync(folder, NormalizePath(filePath));
293287
return (value != null) ? this.Serializer.Deserialize<T>(value) : @default;
294288
}
295289

296290
private async Task<IEnumerable<(DirectoryItemType, string)>> ReadFolderAsync(StorageFolder folder, string folderPath)
297291
{
298-
var dirName = System.IO.Path.GetDirectoryName(folderPath);
299-
if (!string.IsNullOrEmpty(dirName))
300-
{
301-
folder = await folder.GetFolderAsync(dirName);
302-
folderPath = System.IO.Path.GetFileName(folderPath);
303-
}
304-
305-
var targetFolder = await folder.GetFolderAsync(folderPath);
292+
var targetFolder = await folder.GetFolderAsync(NormalizePath(folderPath));
306293
var items = await targetFolder.GetItemsAsync();
307294

308295
return items.Select((item) =>
@@ -317,33 +304,19 @@ public Task<bool> TryRenameItemAsync(string itemPath, string newName)
317304

318305
private async Task<StorageFile> CreateFileAsync<T>(StorageFolder folder, string filePath, T value)
319306
{
320-
var dirName = System.IO.Path.GetDirectoryName(filePath);
321-
if (!string.IsNullOrEmpty(dirName))
322-
{
323-
folder = await folder.GetFolderAsync(dirName);
324-
filePath = System.IO.Path.GetFileName(filePath);
325-
}
326-
327-
return await StorageFileHelper.WriteTextToFileAsync(folder, this.Serializer.Serialize(value)?.ToString(), filePath, CreationCollisionOption.ReplaceExisting);
307+
return await StorageFileHelper.WriteTextToFileAsync(folder, this.Serializer.Serialize(value)?.ToString(), NormalizePath(filePath), CreationCollisionOption.ReplaceExisting);
328308
}
329309

330310
private async Task CreateFolderAsync(StorageFolder folder, string folderPath)
331311
{
332-
var dirName = System.IO.Path.GetDirectoryName(folderPath);
333-
if (!string.IsNullOrEmpty(dirName))
334-
{
335-
folder = await folder.GetFolderAsync(dirName);
336-
folderPath = System.IO.Path.GetFileName(folderPath);
337-
}
338-
339-
await folder.CreateFolderAsync(folderPath, CreationCollisionOption.OpenIfExists);
312+
await folder.CreateFolderAsync(NormalizePath(folderPath), CreationCollisionOption.OpenIfExists);
340313
}
341314

342315
private async Task<bool> TryDeleteItemAsync(StorageFolder folder, string itemPath)
343316
{
344317
try
345318
{
346-
var item = await folder.GetItemAsync(itemPath);
319+
var item = await folder.GetItemAsync(NormalizePath(itemPath));
347320
await item.DeleteAsync();
348321
return true;
349322
}
@@ -357,7 +330,7 @@ private async Task<bool> TryRenameItemAsync(StorageFolder folder, string itemPat
357330
{
358331
try
359332
{
360-
var item = await folder.GetItemAsync(itemPath);
333+
var item = await folder.GetItemAsync(NormalizePath(itemPath));
361334
await item.RenameAsync(newName, NameCollisionOption.FailIfExists);
362335
return true;
363336
}
@@ -366,5 +339,10 @@ private async Task<bool> TryRenameItemAsync(StorageFolder folder, string itemPat
366339
return false;
367340
}
368341
}
342+
343+
private string NormalizePath(string path)
344+
{
345+
return Path.Combine(Path.GetDirectoryName(path), Path.GetFileName(path));
346+
}
369347
}
370348
}

UnitTests/UnitTests.UWP/Helpers/Test_ApplicationDataStorageHelper.cs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -206,19 +206,21 @@ public async Task Test_StorageHelper_FileCRUDTest()
206206
[TestMethod]
207207
public async Task Test_StorageHelper_SubFolderCRUDTest()
208208
{
209-
var folderName = "TestFolder";
209+
var folderName = "TestFolder1";
210210
var subFolderName = "TestSubFolder";
211211
var subFolderName2 = "TestSubFolder2";
212212
var subFolderPath = $"{folderName}/{subFolderName}";
213213
var subFolderPath2 = $"{folderName}/{subFolderName2}";
214214
var fileName = "TestFile.txt";
215+
var fileName2 = "TestFile2.txt";
215216
var filePath = $"{subFolderPath}/{fileName}";
216-
217+
var filePath2 = $"{subFolderPath2}/{fileName2}";
217218
var fileContents = "this is a test";
219+
218220
var storageHelper = ApplicationDataStorageHelper.GetCurrent();
219221

220-
// Create a folder
221-
await storageHelper.CreateFolderAsync(folderName);
222+
// Attempt to delete the folder to clean up from any previously failed test runs.
223+
await storageHelper.TryDeleteItemAsync(folderName);
222224

223225
// Create a subfolder
224226
await storageHelper.CreateFolderAsync(subFolderPath);
@@ -237,13 +239,25 @@ public async Task Test_StorageHelper_SubFolderCRUDTest()
237239
Assert.AreEqual(fileName, folderItemsList[0].Name);
238240
Assert.AreEqual(Microsoft.Toolkit.Helpers.DirectoryItemType.File, folderItemsList[0].ItemType);
239241

240-
// Rename a subfolder
241-
var itemRenamed = await storageHelper.TryRenameItemAsync(subFolderPath, subFolderName2);
242+
// Rename a file in a subfolder
243+
var itemRenamed = await storageHelper.TryRenameItemAsync(filePath, fileName2);
242244
Assert.IsTrue(itemRenamed);
243245

246+
// Rename a subfolder
247+
var folderRenamed = await storageHelper.TryRenameItemAsync(subFolderPath, subFolderName2);
248+
Assert.IsTrue(folderRenamed);
249+
250+
// Delete a file in a subfolder
251+
var fileDeleted = await storageHelper.TryDeleteItemAsync(filePath2);
252+
Assert.IsTrue(fileDeleted);
253+
244254
// Delete a subfolder
245-
var itemDeleted = await storageHelper.TryDeleteItemAsync(subFolderPath2);
246-
Assert.IsTrue(itemDeleted);
255+
var subFolderDeleted = await storageHelper.TryDeleteItemAsync(subFolderPath2);
256+
Assert.IsTrue(subFolderDeleted);
257+
258+
// Delete the folder to clean up.
259+
var folderDeleted = await storageHelper.TryDeleteItemAsync(folderName);
260+
Assert.IsTrue(folderDeleted);
247261
}
248262

249263
public class Person

0 commit comments

Comments
 (0)