-
Notifications
You must be signed in to change notification settings - Fork 21
/
DdfBuilder.cs
127 lines (105 loc) · 4.22 KB
/
DdfBuilder.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace CabMaker
{
/// <summary>
/// Utility class for building a DDF file.
/// </summary>
internal class DdfFileBuilder
{
string _sourceFolder;
bool _isRecursive;
string _targetFolder;
string _targetFileName;
CompressionType _compressionType = Constants.DefaultCompressionType;
CompressionWindowSize _compressionWindowSize;
public DdfFileBuilder(
string sourceFolder,
bool isRecursive,
string targetFolder,
string targetFileName,
CompressionType compressionType,
CompressionWindowSize compressionWindowSize)
{
_isRecursive = isRecursive;
if (string.IsNullOrWhiteSpace(sourceFolder))
throw new ArgumentException($"{nameof(sourceFolder)} cannot be empty.");
if (string.IsNullOrWhiteSpace(targetFolder))
throw new ArgumentException($"{nameof(targetFolder)} cannot be empty.");
if (string.IsNullOrWhiteSpace(targetFileName))
throw new ArgumentException($"{nameof(targetFileName)} cannot be empty.");
_sourceFolder = sourceFolder;
_targetFolder = targetFolder;
_targetFileName = targetFileName;
_compressionType = compressionType;
_compressionWindowSize = compressionWindowSize ?? Constants.DefaultCompressionWindowSize;
DdfFilePath = Path.Combine(_targetFolder, targetFileName + ".ddf");
}
/// <summary>
/// Gets the full path of the DDF file.
/// </summary>
public string DdfFilePath { get; private set; }
/// <summary>
/// Builds the DDF file and saves it to disk.
/// </summary>
public void BuildAndSave()
{
bool compress = _compressionType != CompressionType.None;
string compressValue = compress ? "on" : "off";
StringBuilder ddf = new StringBuilder();
ddf.AppendLine($@";*** MakeCAB Directive file;
.OPTION EXPLICIT
.Set CabinetNameTemplate={_targetFileName.EnsureQuoted()}
.Set DiskDirectory1={_targetFolder.EnsureQuoted()}
.Set MaxDiskSize=0
.Set Cabinet=on
.Set Compress={compressValue}");
if (compress)
{
ddf.AppendLine($".Set CompressionType={_compressionType}");
}
ddf.AppendLine();
if (IsCompressionWindowSizeIncluded(_compressionType))
{
ddf.AppendFormat($".Set CompressionMemory={(_compressionWindowSize).Exponent}");
ddf.AppendLine();
}
int ddfHeaderLines = ddf.ToString().Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Length;
int maxFiles = Constants.MaxLinesInDdf - ddfHeaderLines; // only write enough files to hit the max # of lines allowed in a DDF (blank lines don't count)
List<DdfFileRow> ddfFiles = GetFiles(_sourceFolder);
foreach (var ddfFile in ddfFiles.Take(maxFiles))
{
ddf.AppendFormat("\"{0}\" \"{1}\"{2}", ddfFile.FullName, ddfFile.Path, Environment.NewLine);
}
File.WriteAllText(DdfFilePath, ddf.ToString(), Encoding.Default);
}
public static bool IsCompressionWindowSizeIncluded(CompressionType compressionType)
{
return compressionType != CompressionType.None && compressionType != Constants.DefaultCompressionType;
}
List<DdfFileRow> GetFiles(string sDir)
{
List<DdfFileRow> list = new List<DdfFileRow>();
string srcPath = _sourceFolder;
foreach (string f in Directory.GetFiles(sDir))
{
list.Add(new DdfFileRow()
{
FullName = f,
Path = f.Replace(srcPath, "").TrimStart('\\')
});
}
if (_isRecursive)
{
foreach (string d in Directory.GetDirectories(sDir))
{
list.AddRange(GetFiles(d));
}
}
return list;
}
}
}