diff --git a/RombaSharp/Partials/RombaSharp_Inits.cs b/RombaSharp/Partials/RombaSharp_Inits.cs
index 003c0025..e09c3e2d 100644
--- a/RombaSharp/Partials/RombaSharp_Inits.cs
+++ b/RombaSharp/Partials/RombaSharp_Inits.cs
@@ -71,7 +71,7 @@ namespace SabreTools
foreach (string input in inputs)
{
DATFromDir dfd = new DATFromDir(input, datdata, false /* noMD5 */, false /* noSHA1 */, true /* bare */, false /* archivesAsFiles */,
- true /* enableGzip */, false /* addBlanks */, false /* addDate */, "__temp__" /* tempDir */, 4 /* maxDegreeOfParallelism */, _logger);
+ true /* enableGzip */, false /* addBlanks */, false /* addDate */, "__temp__" /* tempDir */, false /* copyFiles */, 4 /* maxDegreeOfParallelism */, _logger);
dfd.Start();
DatFile.WriteDatfile(dfd.DatData, "", logger);
}
diff --git a/SabreTools.Helper/Data/Build.cs b/SabreTools.Helper/Data/Build.cs
index 682f0e73..5df6ea7e 100644
--- a/SabreTools.Helper/Data/Build.cs
+++ b/SabreTools.Helper/Data/Build.cs
@@ -131,6 +131,7 @@ namespace SabreTools.Helper
helptext.Add(" -sd, --superdat Enable SuperDAT creation");
helptext.Add(" -ab, --add-blank Output blank files for folders");
helptext.Add(" -ad, --add-date Output dates for each file parsed");
+ helptext.Add(" -cf, --copy-files Copy files to the temp directory before parsing");
helptext.Add(" -t=, --temp= Set the temporary directory to use");
helptext.Add(" -mt={4} Amount of threads to use (-1 unlimted)");
helptext.Add(" -es, --ext-split Split a DAT by two file extensions");
diff --git a/SabreTools.Helper/Objects/DATFromDir.cs b/SabreTools.Helper/Objects/DATFromDir.cs
index 1cf558b1..211c2567 100644
--- a/SabreTools.Helper/Objects/DATFromDir.cs
+++ b/SabreTools.Helper/Objects/DATFromDir.cs
@@ -26,6 +26,7 @@ namespace SabreTools
private bool _enableGzip;
private bool _addBlanks;
private bool _addDate;
+ private bool _copyFiles;
private int _maxDegreeOfParallelism;
// Other required variables
@@ -50,10 +51,11 @@ namespace SabreTools
/// True if blank items should be created for empty folders, false otherwise
/// True if dates should be archived for all files, false otherwise
/// Name of the directory to create a temp folder in (blank is current directory)
+ /// True if files should be copied to the temp directory before hashing, false otherwise
/// Integer representing the maximum amount of parallelization to be used
/// Logger object for console and file output
public DATFromDir(string basePath, DatFile datdata, bool noMD5, bool noSHA1, bool bare, bool archivesAsFiles,
- bool enableGzip, bool addBlanks, bool addDate, string tempDir, int maxDegreeOfParallelism, Logger logger)
+ bool enableGzip, bool addBlanks, bool addDate, string tempDir, bool copyFiles, int maxDegreeOfParallelism, Logger logger)
{
_basePath = Path.GetFullPath(basePath);
_datdata = datdata;
@@ -67,6 +69,7 @@ namespace SabreTools
_addBlanks = addBlanks;
_addDate = addDate;
_tempDir = (String.IsNullOrEmpty(tempDir) ? Path.GetTempPath() : tempDir);
+ _copyFiles = copyFiles;
_maxDegreeOfParallelism = maxDegreeOfParallelism;
_logger = logger;
}
@@ -188,10 +191,18 @@ namespace SabreTools
// Define the temporary directory
string tempSubDir = Path.GetFullPath(Path.Combine(_tempDir, Path.GetRandomFileName())) + Path.DirectorySeparatorChar;
+ // If we're copying files, copy it first and get the new filename
+ string newitem = item;
+ if (_copyFiles)
+ {
+ newitem = Path.Combine(tempSubDir, Path.GetFileName(item));
+ File.Copy(item, newitem, true);
+ }
+
// Special case for if we are in Romba mode (all names are supposed to be SHA-1 hashes)
if (_datdata.Romba)
{
- Rom rom = FileTools.GetTorrentGZFileInfo(item, _logger);
+ Rom rom = FileTools.GetTorrentGZFileInfo(newitem, _logger);
// If the rom is valid, write it out
if (rom.Name != null)
@@ -207,13 +218,13 @@ namespace SabreTools
}
_datdata.Files[key].Add(rom);
- _logger.User("File added: " + Path.GetFileNameWithoutExtension(item) + Environment.NewLine);
+ _logger.User("File added: " + Path.GetFileNameWithoutExtension(newitem) + Environment.NewLine);
}
}
else
{
- _logger.User("File not added: " + Path.GetFileNameWithoutExtension(item) + Environment.NewLine);
+ _logger.User("File not added: " + Path.GetFileNameWithoutExtension(newitem) + Environment.NewLine);
return;
}
@@ -223,30 +234,30 @@ namespace SabreTools
// If both deep hash skip flags are set, do a quickscan
if (_noMD5 && _noSHA1)
{
- ArchiveType? type = FileTools.GetCurrentArchiveType(item, _logger);
+ ArchiveType? type = FileTools.GetCurrentArchiveType(newitem, _logger);
// If we have an archive, scan it
if (type != null && !_archivesAsFiles)
{
- List extracted = FileTools.GetArchiveFileInfo(item, _logger);
+ List extracted = FileTools.GetArchiveFileInfo(newitem, _logger);
foreach (Rom rom in extracted)
{
- ProcessFileHelper(item,
+ ProcessFileHelper(newitem,
rom,
_basePath,
(Path.GetDirectoryName(Path.GetFullPath(item)) + Path.DirectorySeparatorChar).Remove(0, _basePath.Length) + Path.GetFileNameWithoutExtension(item));
}
}
// Otherwise, just get the info on the file itself
- else if (File.Exists(item))
+ else if (File.Exists(newitem))
{
- ProcessFile(item, _basePath, "");
+ ProcessFile(newitem, _basePath, "");
}
}
// Otherwise, attempt to extract the files to the temporary directory
else
{
- bool encounteredErrors = FileTools.ExtractArchive(item,
+ bool encounteredErrors = FileTools.ExtractArchive(newitem,
tempSubDir,
(_archivesAsFiles ? ArchiveScanLevel.External : ArchiveScanLevel.Internal),
(!_archivesAsFiles && _enableGzip ? ArchiveScanLevel.Internal : ArchiveScanLevel.External),
@@ -257,7 +268,7 @@ namespace SabreTools
// If the file was an archive and was extracted successfully, check it
if (!encounteredErrors)
{
- _logger.Log(Path.GetFileName(item) + " treated like an archive");
+ _logger.Log(Path.GetFileName(newitem) + " treated like an archive");
List extracted = Directory.EnumerateFiles(tempSubDir, "*", SearchOption.AllDirectories).ToList();
Parallel.ForEach(extracted,
new ParallelOptions { MaxDegreeOfParallelism = _maxDegreeOfParallelism },
@@ -268,13 +279,13 @@ namespace SabreTools
Path.Combine((_datdata.Type == "SuperDAT"
? (Path.GetDirectoryName(Path.GetFullPath(item)) + Path.DirectorySeparatorChar).Remove(0, _basePath.Length)
: ""),
- Path.GetFileNameWithoutExtension(item)));
+ Path.GetFileNameWithoutExtension(newitem)));
});
}
// Otherwise, just get the info on the file itself
- else if (File.Exists(item))
+ else if (File.Exists(newitem))
{
- ProcessFile(item, _basePath, "");
+ ProcessFile(newitem, _basePath, "");
}
// Delete the sub temp directory
diff --git a/SabreTools.Helper/Objects/SimpleSort.cs b/SabreTools.Helper/Objects/SimpleSort.cs
index ddb74f0e..b3636d36 100644
--- a/SabreTools.Helper/Objects/SimpleSort.cs
+++ b/SabreTools.Helper/Objects/SimpleSort.cs
@@ -138,7 +138,7 @@ namespace SabreTools.Helper
foreach (string input in _inputs)
{
DATFromDir dfd = new DATFromDir(input, _datdata, false /* noMD5 */, false /* noSHA1 */, true /* bare */, false /* archivesAsFiles */,
- true /* enableGzip */, false /* addBlanks */, false /* addDate */, "" /* tempDir */, 4 /* maxDegreeOfParallelism */, _logger);
+ true /* enableGzip */, false /* addBlanks */, false /* addDate */, "" /* tempDir */, false /* copyFiles */, 4 /* maxDegreeOfParallelism */, _logger);
dfd.Start();
_datdata = dfd.DatData;
}
diff --git a/SabreTools.Helper/README.1ST b/SabreTools.Helper/README.1ST
index 18623fbc..f2f51f16 100644
--- a/SabreTools.Helper/README.1ST
+++ b/SabreTools.Helper/README.1ST
@@ -231,6 +231,10 @@ Options:
If this flag is set, then the Date will be appended to each file information
in the output DAT. The output format is standardized as "yyyy/MM/dd HH:mm:ss".
+ -cf, --copy-files Copy files to the temp directory before parsing
+ If this flag is set, then all files that are going to be parsed are moved to the temporary directory before being hashed. This can be helpful in cases where the
+ temp folder is located on an SSD and the user wants to take advantage of this.
+
-t=, --temp= Set the name of the temporary directory
Optionally, a temp folder can be supplied in the case the default temp directory
(inside the running folder) is not preferred. This is used for any operations
diff --git a/SabreTools/Partials/SabreTools_Inits.cs b/SabreTools/Partials/SabreTools_Inits.cs
index 9511638f..9f0ccbc3 100644
--- a/SabreTools/Partials/SabreTools_Inits.cs
+++ b/SabreTools/Partials/SabreTools_Inits.cs
@@ -70,6 +70,7 @@ namespace SabreTools
/// True if blank items should be created for empty folders, false otherwise
/// True if dates should be archived for all files, false otherwise
/// Name of the directory to create a temp folder in (blank is current directory
+ /// True if files should be copied to the temp directory before hashing, false otherwise
/// Integer representing the maximum amount of parallelization to be used
private static void InitDatFromDir(List inputs,
string filename,
@@ -90,6 +91,7 @@ namespace SabreTools
bool addBlanks,
bool addDate,
string tempDir,
+ bool copyFiles,
int maxDegreeOfParallelism)
{
// Create a new DATFromDir object and process the inputs
@@ -119,7 +121,7 @@ namespace SabreTools
datdata.Files = new Dictionary>();
string basePath = Path.GetFullPath(path);
- DATFromDir dfd = new DATFromDir(basePath, datdata, noMD5, noSHA1, bare, archivesAsFiles, enableGzip, addBlanks, addDate, tempDir, maxDegreeOfParallelism, _logger);
+ DATFromDir dfd = new DATFromDir(basePath, datdata, noMD5, noSHA1, bare, archivesAsFiles, enableGzip, addBlanks, addDate, tempDir, copyFiles, maxDegreeOfParallelism, _logger);
bool success = dfd.Start();
// If it was a success, write the DAT out
diff --git a/SabreTools/SabreTools.cs b/SabreTools/SabreTools.cs
index 45d35d21..104bacdd 100644
--- a/SabreTools/SabreTools.cs
+++ b/SabreTools/SabreTools.cs
@@ -54,6 +54,7 @@ namespace SabreTools
archivesAsFiles = false,
bare = false,
clean = false,
+ copyFiles = false,
datfromdir = false,
datprefix = false,
dedup = false,
@@ -151,6 +152,10 @@ namespace SabreTools
case "--cascade":
cascade = true;
break;
+ case "-cf":
+ case "--copy-files":
+ copyFiles = true;
+ break;
case "-csv":
case "--csv":
tsv = false;
@@ -538,8 +543,8 @@ namespace SabreTools
// Create a DAT from a directory or set of directories
if (datfromdir)
{
- InitDatFromDir(inputs, filename, name, description, category, version, author, forceunpack, outputFormat,
- romba, superdat, noMD5, noSHA1, bare, archivesAsFiles, enableGzip, addBlanks, addDate, tempDir, maxParallelism);
+ InitDatFromDir(inputs, filename, name, description, category, version, author, forceunpack, outputFormat, romba,
+ superdat, noMD5, noSHA1, bare, archivesAsFiles, enableGzip, addBlanks, addDate, tempDir, copyFiles, maxParallelism);
}
// Split a DAT by extension