сжатие — GZipStream в переполнении стека

Я конвертирую приложение c # в php. В этом приложении используется GZipStream, но я не знаю, как сжимать и распаковывать то же самое в php.

Я могу сжимать и архивировать с помощью php, но проблема в том, что zip-файл php и zip-файл c # оба отличаются. Я хочу точно такой же вывод, как C #.
И мой код на C # и php работает, но вывод обоих отличается. Это должно быть то же самое.

Код C #:

public static bool CompressDirectory(string sInDir, string sOutFile)
{
try
{
string[] sFiles = Directory.GetFiles(sInDir, "*.*", SearchOption.AllDirectories);
int iDirLen = sInDir[sInDir.Length - 1] == Path.DirectorySeparatorChar ? sInDir.Length : sInDir.Length + 1;

using (FileStream outFile = new FileStream(sOutFile, FileMode.Create, FileAccess.Write, FileShare.None))
using (GZipStream str = new GZipStream(outFile, CompressionMode.Compress))
foreach (string sFilePath in sFiles)
{
string sRelativePath = sFilePath.Substring(iDirLen);
//if (progress != null)
//    progress(sRelativePath);
CompressFile(sInDir, sRelativePath, str);
}
}
catch (System.Exception ex)
{
PharmaRackMargSynchronizerLog.WriteEntry("CompressDirectory: " + ex.Message, EventLogEntryType.Error);
return false;
}
return true;
}

static void CompressFile(string sDir, string sRelativePath, GZipStream zipStream)
{
try
{
//Compress file name
char[] chars = sRelativePath.ToCharArray();
zipStream.Write(BitConverter.GetBytes(chars.Length), 0, sizeof(int));
foreach (char c in chars)
zipStream.Write(BitConverter.GetBytes(c), 0, sizeof(char));

//Compress file content
byte[] bytes = File.ReadAllBytes(Path.Combine(sDir, sRelativePath));
zipStream.Write(BitConverter.GetBytes(bytes.Length), 0, sizeof(int));
zipStream.Write(bytes, 0, bytes.Length);
}
catch (System.Exception ex)
{
PharmaRackMargSynchronizerLog.WriteEntry("CompressFile: " + ex.Message, EventLogEntryType.Error);
}
}

То, что я пытался в PHP так же, я использовал gzcompress функция для этого, то после сжатия содержимого файла я использую ZipArchive ZIP-файл. Я могу создать кодировку и zip и здесь, но вывод из php zip и вывод из C # отличаются. Я хочу, чтобы это было так же.

PHP-код:

// create zip file

$cfilename = REPORTPATH . $_SERVER['HTTP_DISTRIBUTORAPIKEY'] . "\\" . $_SERVER['HTTP_DISTRIBUTORAPIKEY'] . "_Firms.csv";
$zipname = date('m-d-Y_H_i_s') . '.zip';
$zip = new ZipArchive();
$zip->open($_SERVER['DOCUMENT_ROOT'] . "/api.pharmarack.com/distributors/" . $_SERVER['HTTP_DISTRIBUTORAPIKEY'] . "/" . $zipname, ZipArchive::CREATE);

// gzcompress compressiong process

$compressedstring = gzcompress(base64_encode(file_get_contents($cfilename)) , 9);

//                    $uncompressed = gzuncompress($compressedstring);
//                    echo $uncompressed;die;

$zip->addFromString($cfilename, $compressedstring);

// $zip->addFile($cfilename);

$zip->close();

// End of Create Zip File

2

Решение

Из руководства gzcompress PHP: «Примечание:
Это не то же самое, что сжатие GZIP, которое включает в себя некоторые данные заголовка. Смотрите gzencode () для сжатия gzip.
».Источник

Вместо этого вам нужен gzencode: «Эта функция возвращает сжатую версию входных данных, совместимую с выходными данными программы gzip.

Режим кодирования. Может быть FORCE_GZIP (по умолчанию) или FORCE_DEFLATE.

До PHP 5.4.0 использование FORCE_DEFLATE приводит к стандартной дефлированной строке zlib (включая заголовки zlib) после заголовка файла gzip, но без конечной контрольной суммы crc32.

В PHP 5.4.0 и более поздних версиях FORCE_DEFLATE генерирует совместимый с RFC 1950 вывод, состоящий из заголовка zlib, дефлированных данных и контрольной суммы Adler.
«Источник

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]