Skip to content

Commit 1490a06

Browse files
authored
Merge pull request #11 from coryleach/dev
Added File Extension support to GetFiles method
2 parents efb779e + 5d842a0 commit 1490a06

File tree

5 files changed

+71
-49
lines changed

5 files changed

+71
-49
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<h1 align="center">Gameframe.SaveLoad 👋</h1>
22
<p>
3-
<img alt="Version" src="https://img.shields.io/badge/version-1.0.6-blue.svg?cacheSeconds=2592000" />
3+
<img alt="Version" src="https://img.shields.io/badge/version-1.0.7-blue.svg?cacheSeconds=2592000" />
44
<a href="https://twitter.com/Cory Leach">
55
<img alt="Twitter: coryleach" src="https://img.shields.io/twitter/follow/coryleach.svg?style=social" target="_blank" />
66
</a>
@@ -13,15 +13,15 @@ Serialization helper utility that supports save, load and encryption.
1313
#### Using UnityPackageManager (for Unity 2019.3 or later)
1414
Open the package manager window (menu: Window > Package Manager)<br/>
1515
Select "Add package from git URL...", fill in the pop-up with the following link:<br/>
16-
https://github.com/coryleach/UnitySaveLoad.git#1.0.6<br/>
16+
https://github.com/coryleach/UnitySaveLoad.git#1.0.7<br/>
1717

1818
#### Using UnityPackageManager (for Unity 2019.1 or later)
1919

2020
Find the manifest.json file in the Packages folder of your project and edit it to look like this:
2121
```js
2222
{
2323
"dependencies": {
24-
"com.gameframe.saveload": "https://github.com/coryleach/UnitySaveLoad.git#1.0.6",
24+
"com.gameframe.saveload": "https://github.com/coryleach/UnitySaveLoad.git#1.0.7",
2525
...
2626
},
2727
}

Runtime/SaveLoadManager.cs

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@ public class SaveLoadManager : ScriptableObject
1313
{
1414
[Header("Settings"),SerializeField] private string defaultFolder = "SaveData";
1515
public string DefaultFolder => defaultFolder;
16-
16+
1717
[SerializeField] private string baseFolder = "GameData";
1818
public string BaseFolder => baseFolder;
19-
19+
2020
[SerializeField] private SerializationMethodType saveMethod = SerializationMethodType.Default;
2121

2222
[Header("Encryption"),SerializeField] protected string key = string.Empty;
2323
public string Key => key;
24-
24+
2525
[SerializeField] protected string salt = string.Empty;
2626
public string Salt => salt;
27-
27+
2828
private Dictionary<SerializationMethodType, ISerializationMethod> _methods;
2929

3030
private void OnEnable()
@@ -53,10 +53,10 @@ public static SaveLoadManager Create(string baseFolder, string defaultFolder, Se
5353
instance.key = key;
5454
instance.salt = salt;
5555
instance.saveMethod = saveMethod;
56-
56+
5757
return instance;
5858
}
59-
59+
6060
/// <summary>
6161
/// Save an object to disk
6262
/// </summary>
@@ -77,14 +77,15 @@ public void Save(object obj, string filename, string folder = null)
7777
/// Gets the list of save files that have been created
7878
/// </summary>
7979
/// <param name="folder">sub folder</param>
80+
/// <param name="extension">include only files with this extension</param>
8081
/// <returns>list of file names (excludes the path)</returns>
81-
public string[] GetFiles(string folder = null)
82+
public string[] GetFiles(string folder = null, string extension = null)
8283
{
8384
if (string.IsNullOrEmpty(folder))
8485
{
8586
folder = defaultFolder;
8687
}
87-
return SaveLoadUtility.GetSavedFiles(folder,baseFolder);
88+
return SaveLoadUtility.GetSavedFiles(folder,baseFolder, extension);
8889
}
8990

9091
/// <summary>
@@ -119,7 +120,7 @@ public T Copy<T>(T obj)
119120
var saveLoadMethod = GetSaveLoadMethod(saveMethod);
120121
return (T)saveLoadMethod.Copy(obj);
121122
}
122-
123+
123124
/// <summary>
124125
/// Load an object from disk
125126
/// </summary>
@@ -162,7 +163,7 @@ public void DeleteSave(string filename, string folder = null)
162163
}
163164
SaveLoadUtility.DeleteSavedFile(filename,folder, baseFolder);
164165
}
165-
166+
166167
/// <summary>
167168
/// Save object to file and specify the method of save/load
168169
/// </summary>
@@ -217,7 +218,7 @@ public void SaveUnityObject(UnityEngine.Object unityObj, string filename, string
217218
{
218219
jsonData = JsonUtility.ToJson(unityObj)
219220
};
220-
221+
221222
Save(savedObj,filename,folder);
222223
}
223224

@@ -233,12 +234,12 @@ public void SaveUnityObject(UnityEngine.Object unityObj, string filename, string
233234
public bool LoadUnityObjectOverwrite(UnityEngine.Object objectToOverwrite, string filename, string folder = null)
234235
{
235236
var savedObj = Load<JsonSerializedUnityObject>(filename, folder);
236-
237+
237238
if (savedObj == null || string.IsNullOrEmpty(savedObj.jsonData))
238239
{
239240
return false;
240241
}
241-
242+
242243
JsonUtility.FromJsonOverwrite(savedObj.jsonData,objectToOverwrite);
243244
return true;
244245
}
@@ -253,7 +254,7 @@ public void CopyUnityObjectOverwrite(UnityEngine.Object toCopy, UnityEngine.Obje
253254
var jsonData = JsonUtility.ToJson(toCopy);
254255
JsonUtility.FromJsonOverwrite(jsonData,toOverwrite);
255256
}
256-
257+
257258
/// <summary>
258259
/// JsonSerializedUnityObject
259260
/// Wrapper for json data created when using Unity's JsonUtility to serialize an object derived from UnityEngine.Object
@@ -280,7 +281,7 @@ public void SetCustomSerializationMethod(ISerializationMethod customSerializatio
280281
}
281282
_methods[SerializationMethodType.Custom] = customSerializationMethod;
282283
}
283-
284+
284285
private ISerializationMethod GetSaveLoadMethod(SerializationMethodType methodType)
285286
{
286287
if (_methods == null)
@@ -305,14 +306,14 @@ private ISerializationMethod GetSaveLoadMethod(SerializationMethodType methodTyp
305306
case SerializationMethodType.UnityJson:
306307
method = new SerializationMethodUnityJson();
307308
break;
308-
309+
309310
case SerializationMethodType.BinaryEncrypted:
310311
method = new SerializationMethodBinaryEncrypted(key,salt);
311312
break;
312313
case SerializationMethodType.UnityJsonEncrypted:
313314
method = new SerializationMethodUnityJsonEncrypted(key,salt);
314315
break;
315-
316+
316317
#if JSON_DOT_NET
317318
case SerializationMethodType.JsonDotNet:
318319
method = new SerializationMethodJsonDotNet();
@@ -321,19 +322,17 @@ private ISerializationMethod GetSaveLoadMethod(SerializationMethodType methodTyp
321322
method = new SerializationMethodJsonDotNetEncrypted(key,salt);
322323
break;
323324
#endif
324-
325+
325326
case SerializationMethodType.Custom:
326327
throw new MissingComponentException("SerializationMethodType is Custom but no custom ISerializationMethod was found.");
327328
default:
328329
throw new ArgumentOutOfRangeException(nameof(methodType), methodType, "SaveLoadMethodType not supported");
329330
}
330331

331332
_methods[methodType] = method;
332-
333+
333334
return method;
334335
}
335-
336-
}
337-
}
338-
339336

337+
}
338+
}

Runtime/SaveLoadUtility.cs

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ public static class SaveLoadUtility
1010
//Default folder name will be used if none is provided.
1111
private const string DefaultFolderName = "SaveLoad";
1212
private const string DefaultBaseFolderPath = "GameData";
13-
13+
1414
public static string GetSavePath(string folderName = null, string baseFolderPath = null)
1515
{
1616
return GetRuntimeSavePath(folderName, baseFolderPath);
1717
}
18-
18+
1919
public static string GetRuntimeSavePath(string folderName = null, string baseFolderPath = null)
2020
{
2121
if (string.IsNullOrEmpty(folderName))
@@ -34,17 +34,17 @@ public static string GetRuntimeSavePath(string folderName = null, string baseFol
3434
}
3535

3636
/// <summary>
37-
///
37+
///
3838
/// </summary>
3939
/// <param name="fileName"></param>
4040
/// <returns></returns>
4141
private static string GetSaveFileName(string fileName)
4242
{
4343
return fileName;
4444
}
45-
45+
4646
/// <summary>
47-
///
47+
///
4848
/// </summary>
4949
/// <param name="saveObject"></param>
5050
/// <param name="serializationMethod"></param>
@@ -55,7 +55,7 @@ public static void Save(object saveObject, ISerializationMethod serializationMet
5555
{
5656
var savePath = GetSavePath(folderName,baseFolderPath);
5757
var saveFilename = GetSaveFileName(filename);
58-
58+
5959
//Create directory if it does not exist
6060
if (!Directory.Exists(savePath))
6161
{
@@ -95,43 +95,46 @@ public static object Load(System.Type objectType, ISerializationMethod serializa
9595
returnObject = serializationMethod.Load(objectType, saveFile);
9696
saveFile.Close();
9797
}
98-
98+
9999
return returnObject;
100100
}
101-
101+
102102
/// <summary>
103103
/// Enumerate files in the save directory
104104
/// </summary>
105105
/// <param name="folderName">folder containing the save files</param>
106106
/// <param name="baseFolderPath">base path to the folder</param>
107+
/// <param name="extension">include only files with the specified extension</param>
107108
/// <returns>list of file names</returns>
108-
public static IEnumerable<string> EnumerateSavedFiles(string folderName = null, string baseFolderPath = null)
109+
public static IEnumerable<string> EnumerateSavedFiles(string folderName = null, string baseFolderPath = null, string extension = null)
109110
{
110111
var savePath = GetSavePath(folderName,baseFolderPath);
111-
112+
112113
//If directory does not exist we're done
113114
if (!Directory.Exists(savePath))
114115
{
115116
yield break;
116117
}
117-
118-
foreach ( var file in Directory.EnumerateFiles(savePath,"*",SearchOption.AllDirectories) )
118+
119+
var searchPattern = string.IsNullOrEmpty(extension) ? "*" : $"*.{extension}";
120+
foreach ( var file in Directory.EnumerateFiles(savePath,searchPattern,SearchOption.AllDirectories) )
119121
{
120122
yield return Path.GetFileName(file);
121123
}
122124
}
123-
125+
124126
/// <summary>
125127
/// Creates an array list of save files in the given folder and path
126128
/// </summary>
127-
/// <param name="folderName"></param>
128-
/// <param name="baseFolderPath"></param>
129+
/// <param name="folderName">folder containing the save files</param>
130+
/// <param name="baseFolderPath">base path to the folder</param>
131+
/// <param name="extension">include only files with this extension</param>
129132
/// <returns>Array of file names</returns>
130-
public static string[] GetSavedFiles(string folderName = null, string baseFolderPath = null)
133+
public static string[] GetSavedFiles(string folderName = null, string baseFolderPath = null, string extension = null)
131134
{
132-
return EnumerateSavedFiles(folderName, baseFolderPath).ToArray();
135+
return EnumerateSavedFiles(folderName, baseFolderPath, extension).ToArray();
133136
}
134-
137+
135138
/// <summary>
136139
/// Check if a saved file exists
137140
/// </summary>
@@ -175,10 +178,8 @@ public static void DeleteDirectory(string path)
175178
{
176179
DeleteDirectory(dir);
177180
}
178-
181+
179182
Directory.Delete(path,false);
180183
}
181184
}
182185
}
183-
184-

Tests/Editor/SaveLoadUtilityTests.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ private ISerializationMethod GetSerializationMethod(SerializationMethodType meth
2727
case SerializationMethodType.UnityJsonEncrypted:
2828
return new SerializationMethodUnityJsonEncrypted(TestKey,TestSalt);
2929
#if JSON_DOT_NET
30-
3130
case SerializationMethodType.JsonDotNet:
3231
return new SerializationMethodJsonDotNet();
3332
case SerializationMethodType.JsonDotNetEncrypted:
@@ -96,6 +95,29 @@ public void CanGetFiles()
9695
Assert.IsTrue(files.Length == 0);
9796
}
9897

98+
[Test]
99+
public void CanGetFilesWithExtension()
100+
{
101+
var testSave = new SaveLoadTestObject() {testData = "SaveFileExists"};
102+
var serializationMethod = GetSerializationMethod(SerializationMethodType.Binary);
103+
var filename = "TestSave.sav";
104+
var folder = "TestFolder";
105+
106+
SaveLoadUtility.Save(testSave,serializationMethod,filename,folder);
107+
108+
var files = SaveLoadUtility.GetSavedFiles(folder,null, "sav");
109+
Assert.IsTrue(files.Length == 1);
110+
111+
//Files should contain a list of names that exactly match the file name used
112+
//omits the path of the file
113+
Assert.IsTrue(files[0] == filename);
114+
115+
SaveLoadUtility.DeleteSavedFile(filename,folder);
116+
117+
files = SaveLoadUtility.GetSavedFiles();
118+
Assert.IsTrue(files.Length == 0);
119+
}
120+
99121
[TearDown]
100122
public void TearDown()
101123
{

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "com.gameframe.saveload",
33
"displayName": "Gameframe.SaveLoad",
4-
"version": "1.0.6",
4+
"version": "1.0.7",
55
"description": "Serialization helper utility that supports save, load and encryption.",
66
"keywords": [],
77
"author": {

0 commit comments

Comments
 (0)