public byte[] ReplaceItemMetadata(string itemMetadata, byte[] infopathTemplate)
{
string tempFolder = @"C:\Temp\";
string extractFolder = tempFolder + Guid.NewGuid().ToString() + @"\";
// Extract
CabLib.Extract extractor = new CabLib.Extract();
MemoryStream xsn = new MemoryStream(infopathTemplate);
extractor.ExtractStream(xsn, extractFolder);
xsn.Dispose();
xsn = null;
// Replace ItemMetadata
File.WriteAllText(extractFolder + "ItemMetadata", itemMetadata);
// Recompress
//CabLib.Compress compressor = new CabLib.Compress();
//compressor.CompressFolder(extractFolder, tempFolder + "form.xsn", "*", true, 0);
string directives = Properties.Resources.directives;
directives = directives.Replace("<<folder>>", extractFolder);
directives = directives.Replace("<<tempfolder>>", tempFolder);
File.WriteAllText(tempFolder + "directives.txt", directives);
Process.Start("makecab.exe", "/f " + tempFolder + "directives.txt");
// Convert to byte[]
byte[] form = File.ReadAllBytes(tempFolder + "Form.xsn");
// Delete temporary files
Directory.Delete(extractFolder, true);
File.Delete(tempFolder + "Form.xsn");
return form;
}
I used CabLib for extracting/compressing the file. Tried again this weekend directly using makecab.exe but that didn't help either.