В PCL я использую SharpZipLib.Portable, чтобы закрепить некоторый контент в MemoryStream, а затем записать MemoryStream в Zip-файл, используя двоичную запись записи PCLStorage. Однако создаваемый zip-файл поврежден. В списке его содержимого, я получаю сообщение:Поврежденный почтовый индекс при передаче заархивирования SharpZipLib в PclStorage
Архива: zippedfile.zip
предупреждения [zippedfile.zip]: 20 дополнительных байт в начале или в почтовом файле
(попытку обработать так или иначе)
ошибки [zippedfile. zip]: запуск центрального каталога не найден;
zipfile поврежден.
(пожалуйста, убедитесь, что вы перенесли или создали ZipFile в соответствующем бинарном режиме
и что вы собрали UnZip правильно)
код ниже. Может ли кто-нибудь предложить, где я ошибаюсь? Я не представляю, что на SharpZipLib или PCLStorage есть что-то не так, но есть странная аномалия:
[Edit: Новый свет на аномалии, описанной ниже: каждое вхождение байта больше 7F переводится к тройке байтов EF BF BD, которая, кажется, является многобайтовым представлением UTF8 аромата символа вопросительного знака. Таким образом, похоже, что PCLStorage рассматривает поток как UTF8. Возможно, тогда возникает вопрос, как убедить PCLStorage выполнять двоичную передачу. ]
При прохождении потока в PCLStorage, я исследую поток в контрольной точке («Проверка» переменный), и видит, что содержание гекса правдоподобно похоже на формат ZIP, например, имеющие правильный заголовок ZIP:
50 4B 04 14 03 00 00 00 08 00 45 89 52 48 DF 36 ... (122 байт)
Когда я затем посмотреть на созданный почтовый файл в шестнадцатеричном редакторе, я вижу что-то правдоподобно подобно формату ZIP, но это разные в теле файла! :
50 4B 04 14 03 00 00 00 08 00 45 EF BF BD 52 48 ... (142 байт)
В обоих случаях ASCII эквивалент имеет вид:
PK .. ..... ABCD.txt .... PK ..... ABCD.txt ..... PK .....
Аналогичные результаты при использовании кода с fileHandler.WriteAsync вместо .CopyTo.
Другие люди используют двоичную передачу PCLStorage, поэтому я сомневаюсь, что проблема там. Что мне не хватает? Любые предложения приветствуются.
Это в формате Xamarin Forms PCL.
// using ICSharpCode.SharpZipLib.Zip; // SharpZipLib.Portable
// using PCLStorage;
string content = "ABCD\r\n"; // Desired content of zipped file
byte[] contentBytes = Encoding.UTF8.GetBytes (content);
using (MemoryStream contentStream = new MemoryStream())
{
await contentStream.WriteAsync (contentBytes, 0, contentBytes.Length);
contentStream.Position = 0;
using (MemoryStream zipStream = new MemoryStream())
{
using (ZipOutputStream s = new ZipOutputStream (zipStream))
{
s.UseZip64 = UseZip64.Off;
s.SetLevel (6); // Compression level
//Add the text file
ZipEntry csvEntry = new ZipEntry ("ABCD.txt");
s.PutNextEntry (csvEntry);
await contentStream.CopyToAsync (s);
s.CloseEntry();
s.IsStreamOwner = false; // Do not close zipStream when finishing
await s.FlushAsync(); // Write to zipStream
s.Finish();
}
// Save file to local file system
IFolder rootfolder = FileSystem.Current.LocalStorage;
IFolder exportfolder = await rootfolder.CreateFolderAsync ("Exports", CreationCollisionOption.OpenIfExists);
IFolder subfolder = await exportfolder.CreateFolderAsync ("Zips", CreationCollisionOption.OpenIfExists);
IFile file = await subfolder.CreateFileAsync ("ZippedFile.zip", CreationCollisionOption.ReplaceExisting);
using (Stream fileHandler = await file.OpenAsync (FileAccess.ReadAndWrite))
{
zipStream.Position = 0;
await zipStream.CopyToAsync (fileHandler);
// As a sanity check, view the contents of fileHandler
using (MemoryStream memStream = new MemoryStream())
{
fileHandler.Position = 0;
fileHandler.CopyTo (memStream);
byte[] verify = memStream.ToArray();
} // Put breakpoint here to view contents of verify
}
}
Я получаю 'System.NotImplementedException: эта функциональность не реализована в переносной версии этой сборки. Вы должны ссылаться на пакет PCLStorage NuGet из основного проекта приложения, чтобы ссылаться на реализацию конкретной платформы.', несмотря на то, что я добавил пакет PCLStorage Nuget для проектов pcl, android и ios. – Onur
Вы пытались использовать PCLStorage для выполнения простой операции с файлом без использования zip-библиотеки? – BillF
Да, я попробовал и получил тот же результат. Затем я создал другой проект и скопировал все файлы. Теперь он работает, но я до сих пор не знаю причины ошибки – Onur