Я конвертирую приложение 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
Из руководства 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.
«Источник
Других решений пока нет …