Hi,
ich möchte ohne Umweg über die Festplatte ein XML File aus einem ZIP File extrahieren und über einen XMLReader direkt mit diesem Stream befüttern. Mit Umweg über das FileSystem geht es. Nehme ich den Stream her steht nur Müll drin. Ich nutze die freie Bibliothek ICSharpCode.SharpZipLib
hier der Beispiel Code:
Umweg übers FileSytem, welcher funktioniert:
Und nun der Code der den MemoryStream zurückgeben soll, welcher nicht funktioniert, aber mein bevorzugter Weg werden soll:
Wo liegt der Fehler an der Variante mit dem MemoryStream ? Kontrolliert habe ich es, indem ich den MemoryStream wieder auf Platte geschrieben habe. Nicht ein einziges Byte stimmt.
Danke, Gruß Magic
ich möchte ohne Umweg über die Festplatte ein XML File aus einem ZIP File extrahieren und über einen XMLReader direkt mit diesem Stream befüttern. Mit Umweg über das FileSystem geht es. Nehme ich den Stream her steht nur Müll drin. Ich nutze die freie Bibliothek ICSharpCode.SharpZipLib
hier der Beispiel Code:
Umweg übers FileSytem, welcher funktioniert:
Code:
private static void extractZipFile(string archiveFilenameIn, string password, string outFolder, string fileToExtract)
{
ZipFile zf = null;
try
{
FileStream fs = File.OpenRead(archiveFilenameIn);
zf = new ZipFile(fs);
if (!String.IsNullOrEmpty(password))
{
zf.Password = password;
}
foreach (ZipEntry zipEntry in zf)
{
if (!zipEntry.IsFile)
{
continue;
}
string entryFileName = zipEntry.Name;
if (!string.IsNullOrEmpty(fileToExtract))
{
if (fileToExtract.ToLower() != entryFileName.ToLower())
continue;
}
Stream zipStream = zf.GetInputStream(zipEntry);
// Manipulate the output filename here as desired.
string fullZipToPath = Path.Combine(outFolder, entryFileName);
string directoryName = Path.GetDirectoryName(fullZipToPath);
if (directoryName.Length > 0)
Directory.CreateDirectory(directoryName);
using (FileStream streamWriter = File.Create(fullZipToPath))
{
StreamUtils.Copy(zipStream, streamWriter, new byte[4096]); // 4K buffer is optimum
}
}
}
finally
{
if (zf != null)
{
zf.IsStreamOwner = true; // Makes close also shut the underlying stream
zf.Close(); // Ensure we release resources
}
}
}
Und nun der Code der den MemoryStream zurückgeben soll, welcher nicht funktioniert, aber mein bevorzugter Weg werden soll:
Code:
public static Stream ExtractZipFileToStream(string archiveFilenameIn, string password, string fileToExtract)
{
ZipFile zf = null;
try
{
FileStream fs = File.OpenRead(archiveFilenameIn);
zf = new ZipFile(fs);
if (!String.IsNullOrEmpty(password))
{
zf.Password = password;
}
foreach (ZipEntry zipEntry in zf)
{
if (!zipEntry.IsFile)
{
continue;
}
string entryFileName = zipEntry.Name;
if (!string.IsNullOrEmpty(fileToExtract))
{
if (fileToExtract.ToLower() != entryFileName.ToLower())
continue;
}
Stream zipStream = zf.GetInputStream(zipEntry);
MemoryStream outputStream = new MemoryStream();
StreamUtils.Copy(zipStream, outputStream, new byte[4096]); // 4K buffer is optimum
return outputStream;
}
}
finally
{
if (zf != null)
{
zf.IsStreamOwner = true; // Makes close also shut the underlying stream
zf.Close(); // Ensure we release resources
}
}
return null;
}
Wo liegt der Fehler an der Variante mit dem MemoryStream ? Kontrolliert habe ich es, indem ich den MemoryStream wieder auf Platte geschrieben habe. Nicht ein einziges Byte stimmt.
Danke, Gruß Magic