Skip to content

Instantly share code, notes, and snippets.

@azyobuzin
Created June 4, 2011 09:25
Show Gist options
  • Save azyobuzin/1007748 to your computer and use it in GitHub Desktop.
Save azyobuzin/1007748 to your computer and use it in GitHub Desktop.
import clr
clr.AddReference("mscorlib")
clr.AddReference("System.Core")
from System import Uri, Guid
from System.Text import Encoding
from System.IO import *
from System.Diagnostics import Process, ProcessStartInfo
from System.Linq import Enumerable
clr.ImportExtensions(Enumerable)
srcDir = "..\\XamlIn.Installer"
def getDirectoryName(uri):
i = uri.LastIndexOf("\\")
if i == -1:
return uri
else:
return uri.Substring(0, i)
copyFiles = (Directory.EnumerateFiles(srcDir, "*", SearchOption.AllDirectories)
.Select(lambda f: FileInfo(f))
.Where(lambda f: (f.Attributes and FileAttributes.Hidden) != FileAttributes.Hidden)
.Select(lambda f: Uri(Path.GetFullPath(srcDir)).MakeRelativeUri(Uri(f.FullName)).ToString().Replace("/", "\\"))
.Where(lambda f: not (f.StartsWith("bin\\") or f.StartsWith("obj\\") or f.EndsWith(".user")))
.GroupBy(getDirectoryName, lambda f: f.Split("\\").Last()))
tempFile = Path.GetTempFileName()
sw = StreamWriter(tempFile, false, Encoding.GetEncoding("shift_jis"))
for g in copyFiles:
sw.WriteLine(".Set DestinationDir=\"{0}\"", g.Key)
for f in g:
sw.WriteLine("\"{0}\"", Path.Combine(srcDir, f))
sw.Close()
tempDir = Directory.CreateDirectory(Path.GetTempPath() + Guid.NewGuid())
psi = ProcessStartInfo("makecab", String.Format("/F {0} /L {1} /D MaxDiskSize=2199023255552", tempFile, tempDir))
psi.CreateNoWindow = True
psi.UseShellExecute = False
p = Process.Start(psi)
p.WaitForExit()
outputFile = "InstallerSource.cab"
if File.Exists(outputFile):
File.Delete(outputFile)
File.Move(tempDir + "\\Disk1\\1.cab", outputFile)
File.Delete(tempFile)
Directory.Delete(tempDir, True)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment