Я использую .net-библиотеку SharpZipLib с открытым исходным кодом из www.icsharpcode.net
Моя цель - разархивировать XML-файл и прочитать его в наборе данных. Однако я получаю следующую ошибку при чтении файла в наборе данных: «Данные на корневом уровне недействительны. Строка 1, позиция 1».
Я полагаю, что происходит, когда код распаковки не выпускает файл по следующим причинам.
1.) Если я разархивирую файл и выйду из приложения. Когда я перезагружаю приложение, я могу прочитать распакованный файл в наборе данных.
2.) Если я прочитал файл xml сразу после его записи (без архивирования), он работает нормально.
3.) Если я запишу набор данных в xml, разархивирую его, разархивирую, а затем попытаюсь прочитать его обратно, я получу исключение.
Код ниже довольно прост. UnZipFile вернет имя файла, только что распакованного. Прямо под этим вызовом находится вызов, чтобы прочитать его в наборе данных. Переменная fileToRead - это полный путь к вновь распакованному XML-файлу.
string fileToRead = UnZipFile(filepath, DOViewerUploadStoreArea);
ds.ReadXml(fileToRead )
private string UnZipFile(string file, string dirToUnzipTo)
{
string unzippedfile = "";
try
{
ZipInputStream s = new ZipInputStream(File.OpenRead(file));
ZipEntry myEntry;
string tmpEntry = String.Empty;
while ((myEntry = s.GetNextEntry()) != null)
{
string directoryName = dirToUnzipTo;
string fileName = Path.GetFileName(myEntry.Name);
string fileWDir = directoryName + fileName;
unzippedfile = fileWDir;
FileStream streamWriter = File.Create(fileWDir);
int size = 4096;
byte[] data = new byte[4096];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0) { streamWriter.Write(data, 0, size); }
else { break; }
}
streamWriter.Close();
}
s.Close();
}
catch (Exception ex)
{
LogStatus.WriteErrorLog(ex, "ERROR", "DOViewer.UnZipFile");
}
return (unzippedfile);
}